/*************************************************************************/ /* */ /* Copyright (c) 1994 Stanford University */ /* */ /* All rights reserved. */ /* */ /* Permission is given to use, copy, and modify this software for any */ /* non-commercial purpose as long as this copyright notice is not */ /* removed. All other uses, including redistribution in whole or in */ /* part, are forbidden without prior written permission. */ /* */ /* This software is provided with absolutely no warranty and no */ /* support. */ /* */ /*************************************************************************/ /* * CODE.H: define various global things for CODE.C. */ #ifndef _CODE_H_ #define _CODE_H_ #define PAD_SIZE (PAGE_SIZE / (sizeof(long))) /* Defined by the input file */ global string headline; /* message describing calculation */ global string infile; /* file name for snapshot input */ global string outfile; /* file name for snapshot output */ global real dtime; /* timestep for leapfrog integrator */ global real dtout; /* time between data outputs */ global real tstop; /* time to stop calculation */ global long nbody; /* number of bodies in system */ global real fcells; /* ratio of cells/leaves allocated */ global real fleaves; /* ratio of leaves/bodies allocated */ global real tol; /* accuracy parameter: 0.0 => exact */ global real tolsq; /* square of previous */ global real eps; /* potential softening parameter */ global real epssq; /* square of previous */ global real dthf; /* half time step */ global long NPROC; /* Number of Processors */ global long maxcell; /* max number of cells allocated */ global long maxleaf; /* max number of leaves allocated */ global long maxmybody; /* max no. of bodies allocated per processor */ global long maxmycell; /* max num. of cells to be allocated */ global long maxmyleaf; /* max num. of leaves to be allocated */ global bodyptr bodytab; /* array size is exactly nbody bodies */ global struct CellLockType { ALOCKDEC(CL,MAXLOCK) /* locks on the cells*/ } *CellLock; struct GlobalMemory { /* all this info is for the whole system */ long n2bcalc; /* total number of body/cell interactions */ long nbccalc; /* total number of body/body interactions */ long selfint; /* number of self interactions */ real mtot; /* total mass of N-body system */ real etot[3]; /* binding, kinetic, potential energy */ matrix keten; /* kinetic energy tensor */ matrix peten; /* potential energy tensor */ vector cmphase[2]; /* center of mass coordinates and velocity */ vector amvec; /* angular momentum vector */ cellptr G_root; /* root of the whole tree */ vector rmin; /* lower-left corner of coordinate box */ vector min; /* temporary lower-left corner of the box */ vector max; /* temporary upper right corner of the box */ real rsize; /* side-length of integer coordinate box */ BARDEC(Barrier) /* barrier at the beginning of stepsystem */ LOCKDEC(CountLock) /* Lock on the shared variables */ LOCKDEC(NcellLock) /* Lock on the counter of array of cells for loadtree */ LOCKDEC(NleafLock)/* Lock on the counter of array of leaves for loadtree */ LOCKDEC(io_lock) unsigned long createstart,createend,computestart,computeend; unsigned long trackstart, trackend, tracktime; unsigned long partitionstart, partitionend, partitiontime; unsigned long treebuildstart, treebuildend, treebuildtime; unsigned long forcecalcstart, forcecalcend, forcecalctime; long current_id; volatile long k; /*for memory allocation in code.C */ }; global struct GlobalMemory *Global; /* This structure is needed because under the sproc model there is no * per processor private address space. */ struct local_memory { /* Use padding so that each processor's variables are on their own page */ long pad_begin[PAD_SIZE]; real tnow; /* current value of simulation time */ real tout; /* time next output is due */ long nstep; /* number of integration steps so far */ long workMin, workMax;/* interval of cost to be treated by a proc */ vector min, max; /* min and max of coordinates for each Proc. */ long mynumcell; /* num. of cells used for this proc in ctab */ long mynumleaf; /* num. of leaves used for this proc in ctab */ long mynbody; /* num bodies allocated to the processor */ bodyptr* mybodytab; /* array of bodies allocated / processor */ long myncell; /* num cells allocated to the processor */ cellptr* mycelltab; /* array of cellptrs allocated to the processor */ long mynleaf; /* number of leaves allocated to the processor */ leafptr* myleaftab; /* array of leafptrs allocated to the processor */ cellptr ctab; /* array of cells used for the tree. */ leafptr ltab; /* array of cells used for the tree. */ long myn2bcalc; /* body-body force calculations for each processor */ long mynbccalc; /* body-cell force calculations for each processor */ long myselfint; /* count self-interactions for each processor */ long myn2bterm; /* count body-body terms for a body */ long mynbcterm; /* count body-cell terms for a body */ bool skipself; /* true if self-interaction skipped OK */ bodyptr pskip; /* body to skip in force evaluation */ vector pos0; /* point at which to evaluate field */ real phi0; /* computed potential at pos0 */ vector acc0; /* computed acceleration at pos0 */ vector dr; /* data to be shared */ real drsq; /* between gravsub and subdivp */ nodeptr pmem; /* remember particle data */ nodeptr Current_Root; long Root_Coords[NDIM]; real mymtot; /* total mass of N-body system */ real myetot[3]; /* binding, kinetic, potential energy */ matrix myketen; /* kinetic energy tensor */ matrix mypeten; /* potential energy tensor */ vector mycmphase[2]; /* center of mass coordinates */ vector myamvec; /* angular momentum vector */ long pad_end[PAD_SIZE]; }; global struct local_memory Local[MAX_PROC]; void SlaveStart(void); void stepsystem(long ProcessId); void ComputeForces(long ProcessId); void Help(void); void ANLinit(void); void init_root(void); void tab_init(void); void startrun(void); void testdata(void); void pickshell(real vec[], real rad); void find_my_initial_bodies(bodyptr btab, long nbody, long ProcessId); void find_my_bodies(nodeptr mycell, long work, long direction, long ProcessId); void Housekeep(long ProcessId); void setbound(void); long Log_base_2(long number); long intpow(long i, long j); #endif