/*----------------------------------------------------------------------------*/ int gauss_frame(my1IFrame *src, my1IFrame *dst, float sigma, float *over) { my1Kernel kernel; /* computing MY 2D gaussian smoothing kernel */ int loop = 0, loop2, index = 0; float temp = 1.0, corner; float mult, value; while(temp>THRESH) { temp = fgaussian2d(loop,loop,sigma); corner = temp; loop++; } value = 1.0/corner; int windowsize = (loop*2)-1; int count = windowsize/2; int length = windowsize*windowsize; float *pcoeff = (float*) malloc(length*sizeof(float)); if(pcoeff==0x0) return -1; for(loop=0;loop<windowsize;loop++) { for(loop2=0;loop2<windowsize;loop2++) { if(over) mult = value * (int)fgaussian2d(loop-count, loop2-count, sigma); else mult = fgaussian2d(loop-count, loop2-count, sigma); pcoeff[index++] = mult; } } if(over) *over = value; if(createkernel(&kernel,windowsize)==0x0) { free(pcoeff); return -1; } setkernel(&kernel, pcoeff); kernel.orig_x = count; kernel.orig_y = count; free(pcoeff); correlate_frame(src, dst, &kernel); freekernel(&kernel); return 0; }
/*----------------------------------------------------------------------------*/ int laplace_frame(my1IFrame *src, my1IFrame *dst) { float coeff[] = { 0.0,-1.0,0.0, -1.0,4.0,-1.0, 0.0,-1.0,0.0 }; my1Kernel kernel; if(createkernel(&kernel,3)==0x0) return -1; setkernel(&kernel,coeff); kernel.orig_x = 1; kernel.orig_y = 1; correlate_frame(src,dst,&kernel); freekernel(&kernel); return 0; }
int calc_potential(int argc,void *argv[]) { int i,j; float r,r_x,r_y,r_z; float phi_ij= 0.0; double epsilon, h, h_inv; int ii; double u, wp, ff; if(argc!=4) { fprintf(stderr,"\n\nwrong number of arguments ! (found %d) \n\n",argc); exit(0); } /*******************************************/ N=*(int *)argv[0]; Pos =(float *)argv[1]; Mass=(float *)argv[2]; Potential= (float *)argv[3]; printf("N=%d\n",N); setkernel(); allocate(); extract(); for(i=1;i<=N;i++) { if((i%200)==0) printf("...%d\n",i); for(j=1;j<=N;j++) { /* if((i<10) && (j<10)) { printf("i= %d (%g,%g,%g - m=%g) j=%d (%g,%g,%g - m=%g)\n",i,P[i]->Pos[0],P[i]->Pos[1],P[i]->Pos[2],Mass[i],j,P[j]->Pos[0],P[j]->Pos[1],P[j]->Pos[2],Mass[j]); } */ r_x= P[i]->Pos[0] - P[j]->Pos[0]; r_y= P[i]->Pos[1] - P[j]->Pos[1]; r_z= P[i]->Pos[2] - P[j]->Pos[2]; r= sqrt(r_x*r_x + r_y*r_y + r_z*r_z); /* epsilon= dmax(Smoothing[i],Smoothing[j]); */ epsilon= 0.1; /* these need to be edited based upon the specific snapshot * looking at. I should change this to pass the smoothing * lengths, but late */ if((i>500) && (i<=1500)) { epsilon= 0.4; } if((j>500) && (j<=1500)) { epsilon= 0.4; } h = 2.8*epsilon; h_inv=1/h; if(r>0.0) { u=r*h_inv; /* if((i>400) && (i<410) && (j>400) && (j<450)) { printf("i= %d j=%d r=%g ep=%g m_i=%g m_j%g\n",i,j,r,epsilon,Mass[i],Mass[j]); } */ if(u>=1) { phi_ij = -1.0*Mass[j]/r; } else { ii = (int)(u*KERN_LEN); ff=(u-knlrad[ii])*KERN_LEN; wp=knlpot[ii]+(knlpot[ii+1]-knlpot[ii])*ff; /* printf("it's in here: i,j=%d,%d wp=%g, h_inv=%g, u=%g, r=%g\n",i,j,wp,h_inv,u,r); */ phi_ij = +1.0 * Mass[j]*h_inv*wp; } } else phi_ij= 0.0; /* this doesn't have the offset of 1, hence we subtract 1 */ Potential[i-1] += phi_ij; } } free_memory(); printf("Done with potential calculation.\n"); return 0; }