mirror of
https://bitbucket.org/cosmicvoids/vide_public.git
synced 2025-07-04 23:31:12 +00:00
beginning to fold in HOD code with jeremy tinker's approval
This commit is contained in:
parent
d8108d3a8e
commit
44cd0eb71f
95 changed files with 21950 additions and 0 deletions
91
c_tools/hod/meshlink2.c
Normal file
91
c_tools/hod/meshlink2.c
Normal file
|
@ -0,0 +1,91 @@
|
|||
/* PROGRAM MESHLINK2
|
||||
|
||||
--- meshlink2(np,nmesh,smin,smax,rmax,x,y,z,meshparts,meshstart)
|
||||
--- creates a linked list for efficient neighbor searching.
|
||||
--- tag particles according to their mesh
|
||||
--- adapted from DHW's linklist.c
|
||||
--- version2 has all arrays pushed to the end
|
||||
|
||||
* np = number of particles
|
||||
* x,y,z = arrays of particle coordinates.
|
||||
* smin,smax = particles are located in a box running from
|
||||
(smin,smin,smin) to (smax,smax,smax).
|
||||
* rmax = max. radius of a mesh. All neighbors closer than
|
||||
rmax. are included in a mesh.- to determine size of mesh
|
||||
* meshparts = on return, pointer to particle link list.
|
||||
* meshstart = on return, pointer to array of pointers to the
|
||||
first particle in each mesh.
|
||||
* nmesh = on return,dimension of mesh array in each dimension.
|
||||
|
||||
Notes: 09/09/96
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define sqr(x) ((x)*(x))
|
||||
#define max(A,B) ((A) > (B) ? (A) : (B))
|
||||
#define min(A,B) ((A) < (B) ? (A) : (B))
|
||||
#define mabs(A) ((A) < 0.0 ? -(A) : (A))
|
||||
#define pi 3.1415926535898
|
||||
#define ind(a,b,c) (a)*n*n+(b)*n+(c)
|
||||
#define ALLOC3D(type,dim0,dim1,dim2) \
|
||||
(type***)a3alloc((unsigned)dim0,(unsigned)dim1,(unsigned)dim2,(unsigned)sizeof(type))
|
||||
#define NLATMAX 600 /* maximum lattice dimension */
|
||||
|
||||
int ***i3tensor_2(long nrl, long nrh, long ncl, long nch, long ndl, long ndh);
|
||||
|
||||
/*
|
||||
void meshlink2(np1,nmesh,smin,smax,rmax,x1,y1,z1,meshparts,meshstart,meshfac)
|
||||
int np1;
|
||||
float smin,smax,rmax;
|
||||
float *x1,*y1,*z1;
|
||||
int **meshparts,****meshstart;
|
||||
int *nmesh;
|
||||
int meshfac;
|
||||
*/
|
||||
void meshlink2(int np1,int *nmesh,float smin,float smax,float rmax,float *x1,float *y1,float *z1,
|
||||
int **meshparts,int ****meshstart,int meshfac)
|
||||
{
|
||||
int nlatt;
|
||||
int i,j,k;
|
||||
int ix,iy,iz;
|
||||
float sinv;
|
||||
|
||||
nlatt=(int)((smax-smin)/rmax);
|
||||
if (nlatt>NLATMAX) nlatt=NLATMAX ;
|
||||
|
||||
/*
|
||||
*meshstart=ALLOC3D(int,nlatt,nlatt,nlatt);
|
||||
*/
|
||||
fprintf(stderr,"nlatt= %d %f %f %f\n",nlatt,smin,smax,rmax);
|
||||
*meshstart=(int ***)i3tensor_2(0,nlatt-1,0,nlatt-1,0,nlatt-1);
|
||||
fprintf(stderr,"done here\n");
|
||||
*meshparts=(int *)calloc(np1,sizeof(int));
|
||||
fprintf(stderr,"done here\n");
|
||||
|
||||
for(i=0;i<np1;i++)(*meshparts)[i]=-1;
|
||||
for(i=0;i<nlatt;i++)
|
||||
for(j=0;j<nlatt;j++)
|
||||
for(k=0;k<nlatt;k++)
|
||||
(*meshstart)[i][j][k]=-1;
|
||||
|
||||
sinv=1./(smax-smin);
|
||||
for(i=0;i<np1;i++){
|
||||
ix=(int)(nlatt*(x1[i]-smin)*sinv);
|
||||
iy=(int)(nlatt*(y1[i]-smin)*sinv);
|
||||
iz=(int)(nlatt*(z1[i]-smin)*sinv);
|
||||
if (ix==nlatt) ix=nlatt-1;
|
||||
if (iy==nlatt) iy=nlatt-1;
|
||||
if (iz==nlatt) iz=nlatt-1;
|
||||
(*meshparts)[i]=(*meshstart)[ix][iy][iz];
|
||||
(*meshstart)[ix][iy][iz]=i;
|
||||
}
|
||||
|
||||
*nmesh=nlatt;
|
||||
fprintf(stderr,"Done with meshlink. nlatt=%d\n",nlatt);
|
||||
}
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue