Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ default: direct
clean:
rm -f *.o

direct: main.o kd.o grav.o ewald.o
$(CC) $(CFLAGS) -o direct main.o kd.o grav.o ewald.o $(LIBS)
direct: main.o kd.o grav.o ewald.o ewald2.o
$(CC) $(CFLAGS) -o direct main.o kd.o grav.o ewald.o ewald2.o $(LIBS)

main.o: main.c kd.h
$(CC) $(CFLAGS) -c main.c
Expand All @@ -24,3 +24,6 @@ grav.o: grav.c grav.h kd.h spline.h
ewald.o: ewald.c ewald.h kd.h spline.h
$(CC) $(CFLAGS) -c ewald.c

ewald2.o: ewald2.c ewald.h kd.h spline.h
$(CC) $(CFLAGS) -c ewald2.c

3 changes: 3 additions & 0 deletions ewald.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,7 @@ void diaEwald(PARTICLE *,int,int,double);
void blkEwald(PARTICLE *,int,PARTICLE *,int,int,double);
void umkEwald(PARTICLE *,int,PARTICLE *,int,int,double);

void diaEwald2D(PARTICLE *,int,int,float *);
void blkEwald2D(PARTICLE *,int,PARTICLE *,int,int,float *);
void umkEwald2D(PARTICLE *,int,PARTICLE *,int,int,float *);
#endif
64 changes: 59 additions & 5 deletions kd.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ void kdOrder(KD kd)
/*
** A simple driver. No support for check-pointing here!
*/
void kdGravSimple(KD kd,int iSoftType,int bPeriodic)
void kdGravSimple(KD kd,int iSoftType,int bPeriodic, int bPeriodic2)
{
PARTICLE *p;
int i,n;
Expand All @@ -274,6 +274,9 @@ void kdGravSimple(KD kd,int iSoftType,int bPeriodic)
if (bPeriodic) {
diaEwald(p,n,iSoftType,kd->fPeriod[0]);
}
else if (bPeriodic2) {
diaEwald2D(p,n,iSoftType,kd->fPeriod);
}
else {
diaGrav(p,n,iSoftType);
}
Expand Down Expand Up @@ -309,6 +312,7 @@ void WriteChkpt(KD kd,int lBlock,int kBlock)
}
h.iSoftType = kd->iSoftType;
h.bPeriodic = kd->bPeriodic;
h.bPeriodic2 = kd->bPeriodic2;
h.iBlockSize = kd->iBlockSize;
/*
** Store time used up to now.
Expand Down Expand Up @@ -361,6 +365,7 @@ void ReadChkpt(KD kd,int *plBlock,int *pkBlock)
}
kd->iSoftType = h.iSoftType;
kd->bPeriodic = h.bPeriodic;
kd->bPeriodic2 = h.bPeriodic2;
kd->iBlockSize = h.iBlockSize;
/*
** Fix up CPU time.
Expand Down Expand Up @@ -388,7 +393,7 @@ void ReadChkpt(KD kd,int *plBlock,int *pkBlock)
** Driver routine for direct. With support for check points!
*/
void Grav(KD kd,int lBlock,int kBlock,int iSoftType,int bPeriodic,
int bVerbose)
int bPeriodic2, int bVerbose)
{
PARTICLE *p,*q;
int k,l,n,nk,nb,nbk,bs,rs,rsk,iStride,bc,i;
Expand All @@ -403,7 +408,7 @@ void Grav(KD kd,int lBlock,int kBlock,int iSoftType,int bPeriodic,
nbk = nk/bs;
rsk = nk%bs;
iStride = 16384/bs;
if (bPeriodic) iStride = iStride/100;
if (bPeriodic || bPeriodic2) iStride = iStride/100;
if (!iStride) iStride = 1;
if (lBlock || kBlock) {
l = lBlock;
Expand Down Expand Up @@ -436,6 +441,9 @@ void Grav(KD kd,int lBlock,int kBlock,int iSoftType,int bPeriodic,
if (bPeriodic) {
diaEwald(&p[k*bs],bs,iSoftType,kd->fPeriod[0]);
}
else if (bPeriodic2) {
diaEwald2D(&p[k*bs],bs,iSoftType,kd->fPeriod);
}
else {
diaGrav(&p[k*bs],bs,iSoftType);
}
Expand All @@ -447,6 +455,9 @@ void Grav(KD kd,int lBlock,int kBlock,int iSoftType,int bPeriodic,
if (bPeriodic) {
diaEwald(&p[k*bs],rs,iSoftType,kd->fPeriod[0]);
}
else if (bPeriodic2) {
diaEwald2D(&p[k*bs],rs,iSoftType,kd->fPeriod);
}
else {
diaGrav(&p[k*bs],rs,iSoftType);
}
Expand Down Expand Up @@ -474,6 +485,9 @@ void Grav(KD kd,int lBlock,int kBlock,int iSoftType,int bPeriodic,
if (bPeriodic) {
blkEwald(&p[(l-1)*bs],bs,&p[k*bs],bs,iSoftType,kd->fPeriod[0]);
}
else if (bPeriodic2) {
blkEwald2D(&p[(l-1)*bs],bs,&p[k*bs],bs,iSoftType,kd->fPeriod);
}
else {
blkGrav(&p[(l-1)*bs],bs,&p[k*bs],bs,iSoftType);
}
Expand All @@ -485,6 +499,9 @@ void Grav(KD kd,int lBlock,int kBlock,int iSoftType,int bPeriodic,
if (bPeriodic) {
blkEwald(&p[l*bs],bs,&p[nb*bs],rs,iSoftType,kd->fPeriod[0]);
}
else if (bPeriodic2) {
blkEwald2D(&p[l*bs],bs,&p[nb*bs],rs,iSoftType,kd->fPeriod);
}
else {
blkGrav(&p[l*bs],bs,&p[nb*bs],rs,iSoftType);
}
Expand Down Expand Up @@ -519,13 +536,19 @@ void Grav(KD kd,int lBlock,int kBlock,int iSoftType,int bPeriodic,
if (bPeriodic) {
umkEwald(&p[l*bs],bs,&q[k*bs],bs,iSoftType,kd->fPeriod[0]);
}
else if (bPeriodic2) {
umkEwald2D(&p[l*bs],bs,&q[k*bs],bs,iSoftType,kd->fPeriod);
}
else {
umkGrav(&p[l*bs],bs,&q[k*bs],bs,iSoftType);
}
}
if (bPeriodic) {
umkEwald(&p[l*bs],bs,&q[k*bs],rsk,iSoftType,kd->fPeriod[0]);
}
else if (bPeriodic2) {
umkEwald2D(&p[l*bs],bs,&q[k*bs],rsk,iSoftType,kd->fPeriod);
}
else {
umkGrav(&p[l*bs],bs,&q[k*bs],rsk,iSoftType);
}
Expand All @@ -534,13 +557,19 @@ void Grav(KD kd,int lBlock,int kBlock,int iSoftType,int bPeriodic,
if (bPeriodic) {
umkEwald(&p[l*bs],rs,&q[k*bs],bs,iSoftType,kd->fPeriod[0]);
}
else if (bPeriodic2) {
umkEwald2D(&p[l*bs],rs,&q[k*bs],bs,iSoftType,kd->fPeriod);
}
else {
umkGrav(&p[l*bs],rs,&q[k*bs],bs,iSoftType);
}
}
if (bPeriodic) {
umkEwald(&p[l*bs],rs,&q[k*bs],rsk,iSoftType,kd->fPeriod[0]);
}
else if (bPeriodic) {
umkEwald2D(&p[l*bs],rs,&q[k*bs],rsk,iSoftType,kd->fPeriod);
}
else {
umkGrav(&p[l*bs],rs,&q[k*bs],rsk,iSoftType);
}
Expand All @@ -555,12 +584,14 @@ void Grav(KD kd,int lBlock,int kBlock,int iSoftType,int bPeriodic,


void kdGrav(KD kd,int iBlockSize,int iSoftType,int bPeriodic,
int bPeriodic2,
int bVerbose)
{
kd->iSoftType = iSoftType;
kd->bPeriodic = bPeriodic;
kd->bPeriodic2 = bPeriodic2;
kd->iBlockSize = iBlockSize;
Grav(kd,0,0,iSoftType,bPeriodic,bVerbose);
Grav(kd,0,0,iSoftType,bPeriodic,bPeriodic2, bVerbose);
}


Expand All @@ -569,7 +600,7 @@ void kdRestart(KD kd,int bVerbose)
int l,k;

ReadChkpt(kd,&l,&k);
Grav(kd,l,k,kd->iSoftType,kd->bPeriodic,bVerbose);
Grav(kd,l,k,kd->iSoftType,kd->bPeriodic,kd->bPeriodic2,bVerbose);
}


Expand Down Expand Up @@ -623,6 +654,29 @@ void kdOutAccel(KD kd,char *pszFile)
fclose(fp);
}

void kdOutAccel1D(KD kd,char *pszFile, int iDir)
{
FILE *fp;
int i,iCnt;

fp = fopen(pszFile,"w");
assert(fp != NULL);
fprintf(fp,"%d\n",kd->nParticles);
iCnt = 0;
for (i=0;i<kd->nGas;++i) {
if (kd->bGas) fprintf(fp,"%.17g\n",kd->p[iCnt++].a[iDir]);
else fprintf(fp,"0\n");
}
for (i=0;i<kd->nDark;++i) {
if (kd->bDark) fprintf(fp,"%.17g\n",kd->p[iCnt++].a[iDir]);
else fprintf(fp,"0\n");
}
for (i=0;i<kd->nStar;++i) {
if (kd->bStar) fprintf(fp,"%.17g\n",kd->p[iCnt++].a[iDir]);
else fprintf(fp,"0\n");
}
fclose(fp);
}

void kdOutPot(KD kd,char *pszFile)
{
Expand Down
7 changes: 5 additions & 2 deletions kd.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ typedef struct kdContext {
char *pszChkptName;
int iSoftType;
int bPeriodic;
int bPeriodic2;
int iBlockSize;
int uSecond;
int uMicro;
Expand All @@ -61,6 +62,7 @@ struct chkptHeader {
float fCenter[3];
int iSoftType;
int bPeriodic;
int bPeriodic2;
int iBlockSize;
int uSecond;
int uMicro;
Expand All @@ -76,10 +78,11 @@ void kdSetSoft(KD,float);
void kdInMark(KD,char *);
void kdMarkOrder(KD);
void kdOrder(KD);
void kdGravSimple(KD,int,int);
void kdGrav(KD,int,int,int,int);
void kdGravSimple(KD,int,int,int);
void kdGrav(KD,int,int,int,int,int);
void kdRestart(KD,int);
void kdOutAccel(KD,char *);
void kdOutAccel1D(KD kd,char *pszFile, int iDir);
void kdOutPot(KD,char *);
void kdFinish(KD);

Expand Down
49 changes: 39 additions & 10 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,24 @@ void usage(void)
fprintf(stderr,"USAGE:\n");
fprintf(stderr,"direct [-e <fSoft>] [-uniform] [-plummer] [-spline]\n");
fprintf(stderr," [-p <xyzPeriod>] [-G <fGravConst>] [-b <iBlockSize>]\n");
fprintf(stderr," [-p2 <xyPeriod> ] [-splitout] \n");
fprintf(stderr," [-dgs] [-do <MarkName>] [-o <FileName>] [-std]\n");
fprintf(stderr," [-i <iChkptInterval>] [-restart] [-v] [-t]\n");
fprintf(stderr,"Reads tipsy binary format from stdin\n");
fprintf(stderr,"For more information see man page, direct(1)\n");
exit(1);
}

void main(int argc,char **argv)
int main(int argc,char **argv)
{
KD kd;
int i,iBlockSize,bVerbose,bSoft,bTestGrav;
int bGas,bDark,bStar,iChkptInterval,bRestart;
int bStandard; /* Use tipsy standard format */
int iSoftType,bMark;
int j,bPeriodic;
int bPeriodic2; /* 2 D periodicity */
int bSplitOut; /* Split accelerations into 3 files */
int sec,usec;
double G;
float fSoft,fPeriod[3],fCenter[3];
Expand All @@ -47,6 +50,7 @@ void main(int argc,char **argv)
G = 1.0;
iBlockSize = 256;
bPeriodic = 0;
bPeriodic2 = 0;
for (j=0;j<3;++j) {
fCenter[j] = 0.0;
fPeriod[j] = FLT_MAX;
Expand Down Expand Up @@ -104,6 +108,13 @@ void main(int argc,char **argv)
fPeriod[2] = atof(argv[i]);
++i;
}
else if (!strcmp(argv[i],"-p2")) {
++i;
bPeriodic2 = 1;
fPeriod[0] = atof(argv[i]);
fPeriod[1] = atof(argv[i]);
++i;
}
else if (!strcmp(argv[i],"-do")) {
++i;
if (i >= argc) usage();
Expand Down Expand Up @@ -131,6 +142,10 @@ void main(int argc,char **argv)
bStandard = 1;
++i;
}
else if (!strcmp(argv[i],"-splitout")) {
bSplitOut = 1;
++i;
}
else if (*argv[i] == '-') {
p = argv[i];
++p;
Expand Down Expand Up @@ -160,6 +175,7 @@ void main(int argc,char **argv)
}
else usage();
}
assert(!bPeriodic || !bPeriodic2);
if (bVerbose) {
printf("DIRECT v1.2: Joachim Stadel, Jan 1995\n");
fflush(stdout);
Expand Down Expand Up @@ -196,21 +212,34 @@ void main(int argc,char **argv)
}
kdTime(kd,&sec,&usec);
if (bTestGrav) {
kdGravSimple(kd,iSoftType,bPeriodic);
}
kdGravSimple(kd,iSoftType,bPeriodic,bPeriodic2);
}
else {
kdGrav(kd,iBlockSize,iSoftType,bPeriodic,bVerbose);
}
kdGrav(kd,iBlockSize,iSoftType,bPeriodic,bPeriodic2,bVerbose);
}
}
if (bVerbose) {
kdTime(kd,&sec,&usec);
printf("GRAV CPU Time:%d.%06d\n",sec,usec);
fflush(stdout);
}
if (bMark) kdOrder(kd);
strcpy(achFile,ach);
strcat(achFile,".acc");
kdOutAccel(kd,achFile);
if(bSplitOut) {
strcpy(achFile,ach);
strcat(achFile,".accx");
kdOutAccel1D(kd,achFile, 0);
strcpy(achFile,ach);
strcat(achFile,".accy");
kdOutAccel1D(kd,achFile, 1);
strcpy(achFile,ach);
strcat(achFile,".accz");
kdOutAccel1D(kd,achFile, 2);
}
else {
strcpy(achFile,ach);
strcat(achFile,".acc");
kdOutAccel(kd,achFile);
}
strcpy(achFile,ach);
strcat(achFile,".pot");
kdOutPot(kd,achFile);
Expand All @@ -227,7 +256,7 @@ void main(int argc,char **argv)
}
}
kdFinish(kd);
}

return 0;
}