static double *allocate_2d_with_padding(int N, int M, int max_rank) { return allocate_2d(N+max_rank, M); }
int project_and_smooth(int argc,void *argv[]) { int i,j,k,n,ii; float dummy[2],xy[2]; float *r2list; int *ngblist; float r,r2,h,h2,hinv2,wk,u,*hmaxfp; int ngbfound; float *vv; float *dens,*mass,masstot,m; float *pos; float half_grid_size; void project(void); void allocate_2d(void); void set_sph_kernel(void); void free_memory_2d(void); if(argc!=13) { 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]; Hsml=(float *)argv[3]; Xmin=*(float *)argv[4]; Xmax=*(float *)argv[5]; Ymin=*(float *)argv[6]; Ymax=*(float *)argv[7]; Xpixels=*(int *)argv[8]; Ypixels=*(int *)argv[9]; /* DesNgb= *(int *)argv[9]; */ Axis1= *(int *)argv[10]; Axis2= *(int *)argv[11]; /* Hmax= *(float *)argv[12]; hmaxfp= (float *)argv[12]; */ Value= (float *)argv[12]; printf("N=%d\n",N); printf("Xmin=%f\n",Xmin); printf("Xmax=%f\n",Xmax); printf("Ymin=%f\n",Ymin); printf("Ymax=%f\n",Ymax); printf("Axis1=%d\n",Axis1); printf("Axis2=%d\n",Axis2); set_sph_kernel(); allocate_2d(); ngb2d_treeallocate((Xpixels*Ypixels), 10*(Xpixels*Ypixels)); project(); ngb2d_treebuild((float **)&P2d[1], (Xpixels*Ypixels), 0,dummy,dummy); DesNgb= 25000.0; /* about 11 % of the total number of pixels (assuming 480x480) */ half_grid_size= 0.5*(Xmax-Xmin)/Xpixels; printf("half_grid_size= %g\n",half_grid_size); fflush(stdout); for(i=0,pos=Pos; i<N; i++) { xy[0]= pos[Axis1]; xy[1]= pos[Axis2]; pos+=3; Hmax= Hsml[i]; if(Hmax<half_grid_size) Hmax= half_grid_size*1.05; h2=ngb2d_treefind( xy, DesNgb ,0.84*Hmax,&ngblist,&r2list, Hmax,&ngbfound); h=sqrt(h2); if(!(i%10000)) { printf("%d.. xy= %g|%g mass= %g Hmax= %g h= %g ngbfound=%d\n",i,xy[0],xy[1],Mass[i],Hmax,h,ngbfound); fflush(stdout); } if(h>Hmax) h=Hmax; hinv2 = 1.0/(h2); /* Next, we actually distribute it */ for(k=0; k<ngbfound; k++) { r=sqrt(r2list[k]); vv= Value + ngblist[k]; if(r<h) { u = r/h; ii = (int)(u*KERNEL_TABLE); wk =hinv2*( Kernel[ii] + (Kernel[ii+1]-Kernel[ii])*(u-KernelRad[ii])*KERNEL_TABLE); *vv = *vv + (Mass[i] * wk); } } } /* dens=vector(1,N); mass=vector(1,N); for(i=1,masstot=0;i<=N;i++) { dens[i]= sb( P2d[i]->Pos[0], P2d[i]->Pos[1] ) ; mass[i]= Mass[i-1]; masstot+= mass[i]; } printf("---\n"); fflush(stdout); sort2_flt(N, dens, mass); for(i=1,m=0;i<=N;i++) { m+= mass[i]; if(m>=masstot/2) { *hmaxfp= dens[i]; break; } } free_vector(mass,1,N); free_vector(dens,1,N); */ ngb2d_treefree(); free_memory_2d(); printf("x\n"); return 0; }
int project_and_velfield(int argc,void *argv[]) { int i,j,k,n,ii; float dummy[2],xy[2]; float *r2list; int *ngblist; float r,r2,h,h2,hinv2,wk,wk_tot,u,*hmaxfp; int ngbfound; float *vv,*vx,*vy; float *dens,*mass,masstot,m; if(argc!=18) { fprintf(stderr,"\n\nwrong number of arguments ! (found %d) \n\n",argc); exit(0); } /*******************************************/ N=*(int *)argv[0]; Pos =(float *)argv[1]; Velocity_x =(float *)argv[2]; Velocity_y =(float *)argv[3]; Mass=(float *)argv[4]; Xmin=*(float *)argv[5]; Xmax=*(float *)argv[6]; Ymin=*(float *)argv[7]; Ymax=*(float *)argv[8]; Xpixels=*(int *)argv[9]; Ypixels=*(int *)argv[10]; DesNgb= *(int *)argv[11]; Axis1= *(int *)argv[12]; Axis2= *(int *)argv[13]; Hmax= *(float *)argv[14]; hmaxfp= (float *)argv[14]; Value= (float *)argv[15]; VelFd_x= (float *)argv[16]; VelFd_y= (float *)argv[17]; printf("N=%d\n",N); printf("Xmin=%f\n",Xmin); printf("Xmax=%f\n",Xmax); printf("Ymin=%f\n",Ymin); printf("Ymax=%f\n",Ymax); printf("Axis1=%d\n",Axis1); set_sph_kernel(); allocate_2d(); ngb2d_treeallocate(N,10*N); project(); ngb2d_treebuild((float **)&P2d[1], N, 0,dummy,dummy); for(i=0;i<Xpixels;i++) { /* printf("%d\n",i); */ for(j=0;j<Ypixels;j++) { xy[0]=(Xmax-Xmin)*(i+0.5)/Xpixels + Xmin; xy[1]=(Ymax-Ymin)*(j+0.5)/Ypixels + Ymin; if(j==0) h2=ngb2d_treefind( xy, DesNgb ,0,&ngblist,&r2list, Hmax,&ngbfound); else h2=ngb2d_treefind( xy, DesNgb ,1.04*h,&ngblist,&r2list, Hmax,&ngbfound); h=sqrt(h2); if(h>Hmax) h=Hmax; hinv2 = 1.0/(h2); vv= Value+j*Xpixels + i; vx= VelFd_x+j*Xpixels + i; vy= VelFd_y+j*Xpixels + i; *vv=0; *vx=0; *vy=0; wk_tot=0; for(k=0;k<ngbfound;k++) { r=sqrt(r2list[k]); if(r<h) { u = r/h; ii = (int)(u*KERNEL_TABLE); wk =hinv2*( Kernel[ii] + (Kernel[ii+1]-Kernel[ii])*(u-KernelRad[ii])*KERNEL_TABLE); /* Average the Mass as we usually do */ *vv = *vv + Mass[ngblist[k]] * wk; /* now average x,y - velocities */ *vx = *vx + Velocity_x[ngblist[k]]*wk; *vy = *vy + Velocity_y[ngblist[k]]*wk; wk_tot = wk_tot + wk; } } if(wk_tot>0) { *vx = *vx/wk_tot; /* convert from vel. density to velocity (i think???) */ *vy = *vy/wk_tot; } } } /* dens=vector(1,N); mass=vector(1,N); for(i=1,masstot=0;i<=N;i++) { dens[i]= sb( P2d[i]->Pos[0], P2d[i]->Pos[1] ) ; mass[i]= Mass[i-1]; masstot+= mass[i]; } printf("---\n"); fflush(stdout); sort2_flt(N, dens, mass); for(i=1,m=0;i<=N;i++) { m+= mass[i]; if(m>=masstot/2) { *hmaxfp= dens[i]; break; } } free_vector(mass,1,N); free_vector(dens,1,N); */ ngb2d_treefree(); free_memory_2d(); printf("x\n"); return 0; }