Пример #1
0
static double *allocate_2d_with_padding(int N, int M, int max_rank)
{
    return allocate_2d(N+max_rank, M);
}
Пример #2
0
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;
}
Пример #3
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;
}