156 lines
7.2 KiB
C
156 lines
7.2 KiB
C
|
/*************************************************************************/
|
||
|
/* */
|
||
|
/* 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
|