18 void mpiio_init(
int bintxt,
int sorted, FILE ** fpptr,
long headerbytesize,
int which,
char *filename,
int numcolumns,
19 MPI_Datatype datatype,
void **jonioptr,
void **writebufptr)
23 logsfprintf(
"\nmpiio_init begin\n");
33 dualfprintf(
fail_file,
"No such thing as binary unsorted output\n");
44 mpiio_final(bintxt, sorted, fpptr, headerbytesize, which, filename, numcolumns, datatype, jonioptr, writebufptr);
54 mpiioromio_init_combine(
INITROMIO, which, headerbytesize, filename,numcolumns, datatype,writebufptr,(
void*)0x0);
57 mpiios_init(bintxt, sorted, fpptr, which, headerbytesize, filename, numcolumns, datatype,
58 jonioptr, writebufptr);
61 logsfprintf(
"mpiio_init end\n");
70 void mpiio_final(
int bintxt,
int sorted, FILE ** fpptr,
long headerbytesize,
int which,
char *filename,
int numcolumns,
71 MPI_Datatype datatype,
void **jonioptr,
void **writebufptr)
73 static int priorinit=0;
79 logsfprintf(
"\nmpiio_final begin\n");
85 mpiioromio_init_combine(
WRITEENDROMIO, which, headerbytesize, filename,numcolumns, datatype,writebufptr,*writebufptr);
87 logsfprintf(
"mpiio_final end\n");
106 if(numcolumns==-1) priorinit=0;
113 void mpiio_combine(
int bintxt,
int sorted,
114 int numcolumns, MPI_Datatype datatype,
115 FILE ** fpptr,
void *jonio,
void *writebuf)
119 logsfprintf(
"mpiio start combine\n");
131 mpiios_combine(bintxt, datatype, numcolumns,fpptr, jonio, writebuf);
138 mpiiomin_final(numcolumns,fpptr, jonio, writebuf);
142 logsfprintf(
"mpiio end combine\n");
146 #define DEBUGMINMEM 0
150 void mpiio_minmem(
int readwrite,
int whichdump,
int i,
int j,
int k,
int bintxt,
int sorted,
151 int numcolumns, MPI_Datatype datatype,
152 FILE ** fp,
void *jonio,
void *writebuf)
154 static struct blink * blinkptr;
155 static struct blink * cpulinkptr;
156 static long long int datasofar0,datasofarc0;
158 static long long int datagot;
160 long long int sii,uii;
163 MPI_Request request0;
165 long long int joniooffset;
168 unsigned char *jonio1;
171 long double *jonio16;
173 long long int *jonio8i;
175 long long int mapjoniosorted,mapjoniounsorted;
176 long long int datatoget0,datatogetc0,datasent0;
181 long long int gi,gj,gk;
182 long long int lastnum;
183 static int masterdone;
184 static int thisslavedone;
189 unsigned short short4char;
194 sizeofdatatype=getsizeofdatatype(datatype);
201 dualfprintf(
fail_file,
"Not setup to do unsorted with this method\n");
211 if((i==0)&&(j==0)&&(k==0)){
215 if(myid==0) masterdone=0;
218 if(masterdone&&(myid==0))
return;
219 if(thisslavedone&&(myid!=0))
return;
224 bfi=((
long long int)k*(
long long int)
N1*(
long long int)
N2+(
long long int)j*(
long long int)
N1+(
long long int)(i+1))*(
long long int)numcolumns;
227 bfi=((
long long int)k*(
long long int)
N1*(
long long int)
N2+(
long long int)j*(
long long int)
N1+(
long long int)
i)*(
long long int)
numcolumns;
231 if(blinkptr==NULL) dolocal=0;
235 if(bfi==((
long long int)datagot+(
long long int)blinkptr->
num)) dolocal=1;
239 if(bfi==(
long long int)datagot) dolocal=1;
254 dualfprintf(
fail_file,
"got here 0.5: %lld %lld %lld %d\n",bfi,datagot+blinkptr->
num,blinkptr->
num,dolocal); fflush(
fail_file);
271 dualfprintf(
fail_file,
"got here 0.65 : %lld %lld %d %d\n",writebuf,blinkptr->
num,MPIid[0],myid); fflush(
fail_file);
275 if(myid>0) MPI_Issend(writebuf,blinkptr->
num,datatype,MPIid[0],myid, MPI_COMM_GRMHD,&request);
277 else MPI_Isend(writebuf,blinkptr->
num,datatype,MPIid[0],myid, MPI_COMM_GRMHD,&request);
300 MPI_Irecv(writebuf,blinkptr->
num,datatype,MPIid[0],myid, MPI_COMM_GRMHD,&request);
302 dualfprintf(
fail_file,
"got here 0.66 : %lld %lld\n",writebuf,blinkptr); fflush(
fail_file);
309 datagot += (
long long int)(blinkptr->
num);
310 lastnum = (
long long int)(blinkptr->
num);
312 blinkptr=(blinkptr->
np);
321 ||((readwrite==
READFILE)&&(-
bufferoffset!=(
long long int)
N1*(
long long int)
N2*(
long long int)
N3*(
long long int)numcolumns-(
long long int)lastnum))
324 dualfprintf(
fail_file,
"local total doesn't equal expected value\n got=%d demand=%d\n",-
bufferoffset,(
long long int)
N1*(
long long int)
N2*(
long long int)
N3*(
long long int)numcolumns);
348 if((i==0)&&(j==0)&&(k==0)){
361 if((myid==0)&&(bfi==(
long long int)
N1*(
long long int)
N2*(
long long int)
N3*(
long long int)numcolumns)){
368 if((myid==0)&&(thisslavedone)){
387 if((myid==0)&&((dolocal==1)||(done0==1))){
390 if (datatype == MPI_UNSIGNED_CHAR) jonio1 = (
unsigned char *) jonio;
391 else if (datatype == MPI_FLOAT) jonio4 = (
float *) jonio;
392 else if (datatype == MPI_DOUBLE) jonio8 = (
double *) jonio;
393 else if (datatype == MPI_LONG_DOUBLE) jonio16 = (
long double *) jonio;
394 else if (datatype == MPI_INT) jonio4i = (
int *) jonio;
395 else if (datatype == MPI_LONG_LONG_INT) jonio8i = (
long long int *) jonio;
401 joniooffset=(
long long int)
joniosize/((
long long int)2);
404 dualfprintf(
fail_file,
"got here 2: joniooffset=%lld\n",joniooffset); fflush(
fail_file);
427 if((
long long int)datasofar0+(
long long int)
joniosize/((
long long int)2)>(
long long int)
totalsize[1]*(
long long int)
totalsize[2]*(
long long int)
totalsize[3]*(
long long int)numcolumns) datatogetc0=-(
long long int)datasofar0+(
long long int)
totalsize[1]*(
long long int)
totalsize[2]*(
long long int)
totalsize[3]*(
long long int)numcolumns;
428 else datatogetc0=
joniosize/((
long long int)2);
430 datasofarc0 += (
long long int)datatogetc0;
439 dualfprintf(
fail_file,
"got here 3.4 : cpu=%d: datasofar0=%lld datasofarc0=%lld\n",cpulinkptr->
cpu,datasofar0,datasofarc0); fflush(
fail_file);
441 datatoget0 += (
long long int)(cpulinkptr->
num);
442 if(cpulinkptr->
cpu==0) doing0=1;
447 MPI_Irecv(jonio,cpulinkptr->
num,datatype,MPIid[cpulinkptr->
cpu],cpulinkptr->
cpu,MPI_COMM_GRMHD,&request0);
452 MPI_Wait(&request0,&mpichstatus);
457 dualfprintf(
fail_file,
"got here 3.52: datatogetc0=%lld\n",datatogetc0); fflush(
fail_file);
468 for(sii=0;sii<datatogetc0;sii++){
485 mypos=(
long long int)(sii/((
long long int)numcolumns)) + (
long long int)(cpulinkptr->
ri) + (
long long int)(cpulinkptr->
rj)*(
long long int)
totalsize[1] + (
long long int)(cpulinkptr->
rk)*(
long long int)
totalsize[1]*(
long long int)
totalsize[2];
487 gi=(
long long int)mypos%((
long long int)
totalsize[1]);
492 dualfprintf(
fail_file,
"got here 3.55: sii=%lld mypos=%lld gi=%lld gj=%lld gk=%lld\n",sii, mypos, gi,gj,gk); fflush(
fail_file);
505 dualfprintf(
fail_file,
"got here 3.56: did assign: sii=%lld joniooffset=%lld uii=%lld\n",sii,joniooffset,uii); fflush(
fail_file);
508 if (datatype == MPI_UNSIGNED_CHAR) jonio1[sii+joniooffset]=jonio1[uii++];
509 else if (datatype == MPI_FLOAT) jonio4[sii+joniooffset]=jonio4[uii++];
510 else if (datatype == MPI_DOUBLE) jonio8[sii+joniooffset]=jonio8[uii++];
511 else if (datatype == MPI_LONG_DOUBLE) jonio16[sii+joniooffset]=jonio16[uii++];
512 else if (datatype == MPI_INT) jonio4i[sii+joniooffset]=jonio4i[uii++];
513 else if (datatype == MPI_LONG_LONG_INT) jonio8i[sii+joniooffset]=jonio8i[uii++];
528 if(uii!=(
long long int)(cpulinkptr->
num)){
529 dualfprintf(
fail_file,
"uii and num for this cpu not same, algorithm failure: uii=%d num=%d datatogetc0=%d\n",uii,cpulinkptr->
num,datatogetc0);
532 if(cpulinkptr->
end) doset=0;
533 cpulinkptr=cpulinkptr->
np;
541 datasofar0 += (
long long int)datatoget0;
542 if((
long long int)datasofar0 != (
long long int)datasofarc0){
543 dualfprintf(
fail_file,
"cumulative data received via MPI and expected data is different: got=%d expected=%d\n",datasofar0,datasofarc0);
558 if (datatype == MPI_UNSIGNED_CHAR) joniosubmit=(
void*) (jonio1+joniooffset);
559 else if (datatype == MPI_FLOAT) joniosubmit=(
void*) (jonio4+joniooffset);
560 else if (datatype == MPI_DOUBLE) joniosubmit=(
void*) (jonio8+joniooffset);
561 else if (datatype == MPI_LONG_DOUBLE) joniosubmit=(
void*) (jonio16+joniooffset);
562 else if (datatype == MPI_INT) joniosubmit=(
void*) (jonio4i+joniooffset);
563 else if (datatype == MPI_LONG_LONG_INT) joniosubmit=(
void*) (jonio8i+joniooffset);
571 if(numfiles==1) fwrite(joniosubmit, sizeofdatatype,datatoget0, *fp);
573 for(sii=0;sii<datatoget0;sii++){
574 if (datatype == MPI_UNSIGNED_CHAR) fwrite(&jonio1[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
575 else if (datatype == MPI_FLOAT) fwrite(&jonio4[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
576 else if (datatype == MPI_DOUBLE) fwrite(&jonio8[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
577 else if (datatype == MPI_LONG_DOUBLE) fwrite(&jonio16[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
578 else if (datatype == MPI_INT) fwrite(&jonio4i[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
579 else if (datatype == MPI_LONG_LONG_INT) fwrite(&jonio8i[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
584 for(sii=0;sii<datatoget0;sii++){
585 if (datatype == MPI_UNSIGNED_CHAR) fprintf(fp[sii%numfiles],
"%c",jonio1[sii+joniooffset]);
586 else if (datatype == MPI_FLOAT) fprintf(fp[sii%numfiles],
"%15.7g",jonio4[sii+joniooffset]);
587 else if (datatype == MPI_DOUBLE) fprintf(fp[sii%numfiles],
"%21.15g",jonio8[sii+joniooffset]);
588 else if (datatype == MPI_LONG_DOUBLE) fprintf(fp[sii%numfiles],
"%31.25Lg",jonio16[sii+joniooffset]);
589 else if (datatype == MPI_INT) fprintf(fp[sii%numfiles],
"%d",jonio4i[sii+joniooffset]);
590 else if (datatype == MPI_LONG_LONG_INT) fprintf(fp[sii%numfiles],
"%lld",jonio8i[sii+joniooffset]);
592 if((sii+1)%numcolumns) fprintf(fp[sii%numfiles],
" ");
593 else fprintf(fp[sii%numfiles],
"\n");
595 else fprintf(fp[sii%numfiles],
"\n");
598 if((done0==0)&&(doing0==1)) dofull=0;
600 if(cpulinkptr==NULL){
604 dualfprintf(
fail_file,
"write: total data written not equal to expected amount: wrote=%lld expected=%lld\n",datasofar0,(
long long int)
totalsize[1]*(
long long int)
totalsize[2]*(
long long int)
totalsize[3]*(
long long int)numcolumns);
636 if(datasofar0+(
long long int)
joniosize/((
long long int)2) > (
long long int)
totalsize[1]*(
long long int)
totalsize[2]*(
long long int)
totalsize[3]*(
long long int)numcolumns) datatogetc0 = -(
long long int)datasofar0 + (
long long int)
totalsize[1]*(
long long int)
totalsize[2]*(
long long int)
totalsize[3]*(
long long int)numcolumns;
639 datasofarc0+=datatogetc0;
642 dualfprintf(
fail_file,
"got here1 : %lld %lld\n",datatogetc0,datasofarc0); fflush(
fail_file);
647 if (datatype == MPI_UNSIGNED_CHAR) joniosubmit=(
void*) (jonio1+joniooffset);
648 else if (datatype == MPI_FLOAT) joniosubmit=(
void*) (jonio4+joniooffset);
649 else if (datatype == MPI_DOUBLE) joniosubmit=(
void*) (jonio8+joniooffset);
650 else if (datatype == MPI_LONG_DOUBLE) joniosubmit=(
void*) (jonio16+joniooffset);
651 else if (datatype == MPI_INT) joniosubmit=(
void*) (jonio4i+joniooffset);
652 else if (datatype == MPI_LONG_LONG_INT) joniosubmit=(
void*) (jonio8i+joniooffset);
662 if(numfiles==1) fread(joniosubmit, sizeofdatatype,datatogetc0,*fp);
664 for(sii=0;sii<datatoget0;sii++){
665 if (datatype == MPI_UNSIGNED_CHAR) fread(&jonio1[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
666 else if (datatype == MPI_FLOAT) fread(&jonio4[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
667 else if (datatype == MPI_DOUBLE) fread(&jonio8[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
668 else if (datatype == MPI_LONG_DOUBLE) fread(&jonio16[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
669 else if (datatype == MPI_INT) fread(&jonio4i[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
670 else if (datatype == MPI_LONG_LONG_INT) fread(&jonio8i[sii+joniooffset], sizeofdatatype,1, fp[sii%numfiles]);
675 for(sii=0;sii<datatogetc0;sii++){
676 if (datatype == MPI_UNSIGNED_CHAR){
677 fscanf(fp[sii%numfiles],
"%hu",&short4char);
678 jonio1[sii+joniooffset]=short4char;
680 else if (datatype == MPI_FLOAT) fscanf(fp[sii%numfiles],
"%f",&jonio4[sii+joniooffset]);
681 else if (datatype == MPI_DOUBLE) fscanf(fp[sii%numfiles],
"%lf",&jonio8[sii+joniooffset]);
682 else if (datatype == MPI_LONG_DOUBLE) fscanf(fp[sii%numfiles],
"%Lf",&jonio16[sii+joniooffset]);
683 else if (datatype == MPI_INT) fscanf(fp[sii%numfiles],
"%d",&jonio4i[sii+joniooffset]);
684 else if (datatype == MPI_LONG_LONG_INT) fscanf(fp[sii%numfiles],
"%lld",&jonio8i[sii+joniooffset]);
711 if(cpulinkptr->
cpu==0) doing0=1;
712 datatoget0 += (
long long int)(cpulinkptr->
num);
716 for(sii=0;sii<datatogetc0;sii++){
721 mypos=(
long long int)((
long long int)sii/((
long long int)numcolumns)) + (
long long int)(cpulinkptr->
ri) + (
long long int)(cpulinkptr->
rj)*(
long long int)
totalsize[1] + ((
long long int)cpulinkptr->
rk)*(
long long int)
totalsize[1]*(
long long int)
totalsize[2];
723 gi=((
long long int)mypos)%((
long long int)
totalsize[1]);
724 gj=(
long long int)((((
long long int)mypos)%((
long long int)totalsize[1]*(
long long int)totalsize[2]))/((
long long int)totalsize[1]));
725 gk=(
long long int)(((
long long int)mypos)/((
long long int)totalsize[1]*(
long long int)totalsize[2]));
742 if (datatype == MPI_UNSIGNED_CHAR) jonio1[uii++]=jonio1[sii+joniooffset];
743 else if (datatype == MPI_FLOAT) jonio4[uii++]=jonio4[sii+joniooffset];
744 else if (datatype == MPI_DOUBLE) jonio8[uii++]=jonio8[sii+joniooffset];
745 else if (datatype == MPI_LONG_DOUBLE) jonio16[uii++]=jonio16[sii+joniooffset];
746 else if (datatype == MPI_INT) jonio4i[uii++]=jonio16[sii+joniooffset];
747 else if (datatype == MPI_LONG_LONG_INT) jonio8i[uii++]=jonio16[sii+joniooffset];
758 if(uii != (
long long int)(cpulinkptr->
num)){
759 dualfprintf(
fail_file,
"uii and num for this cpu not same, algorithm failure: uii=%d num=%d datatogetc0=%d\n",uii,cpulinkptr->
num,datatogetc0);
766 MPI_Isend(jonio,cpulinkptr->
num,datatype,MPIid[cpulinkptr->
cpu],cpulinkptr->
cpu,MPI_COMM_GRMHD,&request0);
769 MPI_Wait(&request0,&mpichstatus);
771 datasent0 += (
long long int)(cpulinkptr->
num);
773 if(cpulinkptr->
end) doset=0;
774 cpulinkptr=cpulinkptr->
np;
795 datasofar0 += (
long long int)datatoget0;
796 if((
long long int)datasofar0 != (
long long int)datasofarc0){
797 dualfprintf(
fail_file,
"cumulative data received via MPI and expected data is different: got=%d expected=%d\n",datasofar0,datasofarc0);
800 if((
long long int)datasent0 != (
long long int)datatoget0){
801 dualfprintf(
fail_file,
"data sent doesn't match data read\n");
804 if((done0==0)&&(doing0==1)) dofull=0;
805 if(cpulinkptr==NULL){
809 dualfprintf(
fail_file,
"read: total data written not equal to expected amount: wrote=%lld expected=%lld\n",datasofar0,(
long long int)
totalsize[1]*(
long long int)
totalsize[2]*(
long long int)
totalsize[3]*(
long long int)numcolumns);
850 if(dolocal) MPI_Wait(&request,&mpichstatus);
866 void mpiio_seperate(
int bintxt,
int sorted,
int stage,
867 int numcolumns, MPI_Datatype datatype,
868 FILE ** fpptr,
void *jonio,
void *writebuf)
872 logsfprintf(
"mpiio begin seperate\n");
877 if(stage==
STAGE1) mpiioromio_init_combine(
READROMIO,
READFILE, 0,
"", numcolumns, datatype,&writebuf,writebuf);
885 mpiios_seperate(bintxt, stage, datatype, numcolumns, fpptr, jonio, writebuf);
895 if(stage==
STAGE2) mpiiomin_final(numcolumns,fpptr, jonio, writebuf);
900 logsfprintf(
"mpiio end seperate\n");
914 void mpiioromio_init_combine(
int operationtype,
int which,
long headerbytesize,
char *filename,
int numcolumns,MPI_Datatype datatype,
void **writebufptr,
void *writebuf)
918 static long long int sizeofmemory;
919 static int sizeofdatatype;
921 static long double **writebuf16;
922 static double **writebuf8;
923 static float **writebuf4;
924 static unsigned char **writebuf1;
925 static int **writebuf4i;
926 static long long int **writebuf8i;
929 static int romiocolumns;
931 #if(USEMPI&&USEROMIO)
932 static MPI_Datatype newtype;
934 static MPI_Status status;
935 static MPI_Request request;
937 static int ndims, array_of_gsizes[4], array_of_distribs[4];
938 static int order, len;
939 static int array_of_dargs[4], array_of_psizes[4];
940 static int bufcount, array_size;
949 sizeofdatatype=getsizeofdatatype(datatype);
951 logsfprintf(
"mpiioromio_init begin\n");
969 #if(USEMPI&&USEROMIO)
970 if((
COMPDIM==3)&&(romiocolumns>1)){
976 array_of_gsizes[3] = romiocolumns;
981 sizeofmemory = (
long long int)
N1*(
long long int)
N2*(
long long int)
N3*(
long long int)romiocolumns*(
long long int)sizeofdatatype;
983 array_of_distribs[3] = MPI_DISTRIBUTE_BLOCK;
984 array_of_distribs[2] = MPI_DISTRIBUTE_BLOCK;
985 array_of_distribs[1] = MPI_DISTRIBUTE_BLOCK;
986 array_of_distribs[0] = MPI_DISTRIBUTE_BLOCK;
988 array_of_dargs[3] = MPI_DISTRIBUTE_DFLT_DARG;
989 array_of_dargs[2] = MPI_DISTRIBUTE_DFLT_DARG;
990 array_of_dargs[1] = MPI_DISTRIBUTE_DFLT_DARG;
991 array_of_dargs[0] = MPI_DISTRIBUTE_DFLT_DARG;
993 array_of_psizes[3]=1;
994 array_of_psizes[2]=
ncpux1;
995 array_of_psizes[1]=
ncpux2;
996 array_of_psizes[0]=
ncpux3;
998 else if((
COMPDIM==2)&&(romiocolumns>1)){
1001 order = MPI_ORDER_C;
1003 array_of_gsizes[2] = romiocolumns;
1007 sizeofmemory = (
long long int)
N1*(
long long int)
N2*(
long long int)romiocolumns*(
long long int)sizeofdatatype;
1009 array_of_distribs[2] = MPI_DISTRIBUTE_BLOCK;
1010 array_of_distribs[1] = MPI_DISTRIBUTE_BLOCK;
1011 array_of_distribs[0] = MPI_DISTRIBUTE_BLOCK;
1013 array_of_dargs[2] = MPI_DISTRIBUTE_DFLT_DARG;
1014 array_of_dargs[1] = MPI_DISTRIBUTE_DFLT_DARG;
1015 array_of_dargs[0] = MPI_DISTRIBUTE_DFLT_DARG;
1017 array_of_psizes[2]=1;
1018 array_of_psizes[1]=
ncpux1;
1019 array_of_psizes[0]=
ncpux2;
1021 else if((
COMPDIM==1)&&(romiocolumns>1)){
1024 order = MPI_ORDER_C;
1026 array_of_gsizes[1] = romiocolumns;
1029 sizeofmemory = (
long long int)
N1*(
long long int)romiocolumns*(
long long int)sizeofdatatype;
1031 array_of_distribs[1] = MPI_DISTRIBUTE_BLOCK;
1032 array_of_distribs[0] = MPI_DISTRIBUTE_BLOCK;
1034 array_of_dargs[1] = MPI_DISTRIBUTE_DFLT_DARG;
1035 array_of_dargs[0] = MPI_DISTRIBUTE_DFLT_DARG;
1037 array_of_psizes[1]=1;
1038 array_of_psizes[0]=
ncpux1;
1040 else if((
COMPDIM==3)&&(romiocolumns==1)){
1044 order = MPI_ORDER_C;
1050 sizeofmemory = (
long long int)
N1*(
long long int)
N2*(
long long int)
N3*(
long long int)sizeofdatatype;
1052 array_of_distribs[2] = MPI_DISTRIBUTE_BLOCK;
1053 array_of_distribs[1] = MPI_DISTRIBUTE_BLOCK;
1054 array_of_distribs[0] = MPI_DISTRIBUTE_BLOCK;
1056 array_of_dargs[2] = MPI_DISTRIBUTE_DFLT_DARG;
1057 array_of_dargs[1] = MPI_DISTRIBUTE_DFLT_DARG;
1058 array_of_dargs[0] = MPI_DISTRIBUTE_DFLT_DARG;
1060 array_of_psizes[2]=
ncpux1;
1061 array_of_psizes[1]=
ncpux2;
1062 array_of_psizes[0]=
ncpux3;
1064 else if((
COMPDIM==2)&&(romiocolumns==1)){
1067 order = MPI_ORDER_C;
1072 sizeofmemory = (
long long int)
N1*(
long long int)
N2*(
long long int)sizeofdatatype;
1074 array_of_distribs[1] = MPI_DISTRIBUTE_BLOCK;
1075 array_of_distribs[0] = MPI_DISTRIBUTE_BLOCK;
1077 array_of_dargs[1] = MPI_DISTRIBUTE_DFLT_DARG;
1078 array_of_dargs[0] = MPI_DISTRIBUTE_DFLT_DARG;
1080 array_of_psizes[1]=
ncpux1;
1081 array_of_psizes[0]=
ncpux2;
1083 else if((
COMPDIM==1)&&(romiocolumns==1)){
1086 order = MPI_ORDER_C;
1090 sizeofmemory = (
long long int)
N1*(
long long int)sizeofdatatype;
1092 array_of_distribs[0] = MPI_DISTRIBUTE_BLOCK;
1094 array_of_dargs[0] = MPI_DISTRIBUTE_DFLT_DARG;
1096 array_of_psizes[0]=
ncpux1;
1098 else if(romiocolumns==0){
1101 order = MPI_ORDER_C;
1103 array_of_gsizes[0] = 1;
1107 array_of_distribs[0] = MPI_DISTRIBUTE_BLOCK;
1109 array_of_dargs[0] = MPI_DISTRIBUTE_DFLT_DARG;
1111 array_of_psizes[0]=1;
1114 dualfprintf(
fail_file,
"Shouldn't reach to end of ROMIO selection\n");
1122 sprintf(realfilename,
"%s-col%04d",filename,
romiocoliter);
1124 else strcpy(realfilename,filename);
1132 #if(USEMPI&&USEROMIO)
1134 MPI_Type_create_darray(
numprocs, myid, ndims, array_of_gsizes,
1135 array_of_distribs, array_of_dargs,
1136 array_of_psizes, order, datatype, &newtype);
1137 MPI_Type_commit(&newtype);
1140 MPI_Type_size(newtype, &bufcount);
1141 sizeofmemory=bufcount;
1142 bufcount = bufcount/sizeofdatatype;
1146 bufcount=(
long long int)sizeofmemory/(
long long int)sizeofdatatype;
1151 if((
long long int)
N1*(
long long int)
N2*(
long long int)
N3*(
long long int)romiocolumns*(
long long int)sizeofdatatype>=(
long long int)(2L*1024L*1024L*1024L) &&
sizeof(int)<=4){
1152 dualfprintf(
fail_file,
"JCM couldn't figure out how to modify ROMIO so would work when sizeof(int)==4 and buffer size is >2GB\n");
1159 MPI_File_open(MPI_COMM_GRMHD, realfilename, MPI_MODE_APPEND | MPI_MODE_RDWR, MPI_INFO_NULL, &fh);
1162 MPI_File_open(MPI_COMM_GRMHD, realfilename, MPI_MODE_RDONLY , MPI_INFO_NULL, &fh);
1175 MPI_File_set_view(fh, headerbytesize, datatype, newtype,
"native", MPI_INFO_NULL);
1191 if(datatype==MPI_UNSIGNED_CHAR){ writebuf1=(
unsigned char **)writebufptr; }
1192 else if(datatype==MPI_FLOAT){ writebuf4=(
float **)writebufptr; }
1193 else if(datatype==MPI_DOUBLE){ writebuf8=(
double**)writebufptr; }
1194 else if(datatype==MPI_LONG_DOUBLE){ writebuf16=(
long double**)writebufptr; }
1195 else if(datatype==MPI_INT){ writebuf4i=(
int **)writebufptr; }
1196 else if(datatype==MPI_LONG_LONG_INT){ writebuf8i=(
long long int **)writebufptr; }
1199 if(datatype==MPI_UNSIGNED_CHAR) *writebuf1=(
unsigned char*)malloc(sizeofmemory);
1200 else if(datatype==MPI_FLOAT) *writebuf4=(
float*)malloc(sizeofmemory);
1201 else if(datatype==MPI_DOUBLE) *writebuf8 =(
double*)malloc(sizeofmemory);
1202 else if(datatype==MPI_LONG_DOUBLE) *writebuf16 =(
long double*)malloc(sizeofmemory);
1203 else if(datatype==MPI_INT) *writebuf4i=(
int*)malloc(sizeofmemory);
1204 else if(datatype==MPI_LONG_LONG_INT) *writebuf8i=(
long long int*)malloc(sizeofmemory);
1206 ((datatype==MPI_UNSIGNED_CHAR)&&(*writebuf1 == NULL)) ||
1207 ((datatype==MPI_FLOAT)&&(*writebuf4 == NULL)) ||
1208 ((datatype==MPI_DOUBLE)&&(*writebuf8 == NULL)) ||
1209 ((datatype==MPI_LONG_DOUBLE)&&(*writebuf16 == NULL)) ||
1210 ((datatype==MPI_INT)&&(*writebuf4i == NULL)) ||
1211 ((datatype==MPI_LONG_LONG_INT)&&(*writebuf8i == NULL))
1213 dualfprintf(
fail_file,
"Can't initialize writebuf memory for mpiioromio\n");
1217 logsfprintf(
"mpiioromio_init end\n");
1243 #if(USEMPI&&USEROMIO)
1245 logsfprintf(
"mpiioromio_seperate begin\n");
1251 MPI_File_read_all_begin(fh, writebuf, bufcount, datatype);
1252 MPI_File_read_all_end(fh, writebuf, &status);
1253 MPI_File_close(&fh);
1255 MPI_File_read_all(fh, writebuf, bufcount, datatype, &status);
1256 MPI_File_close(&fh);
1259 logsfprintf(
"mpiioromio_seperate end\n");
1262 logsfprintf(
"mpiioromio_seperate_free begin\n");
1264 MPI_Type_free(&newtype);
1265 logsfprintf(
"mpiioromio_seperate_free end\n");
1268 logsfprintf(
"mpiioromio_combine begin\n");
1273 MPI_File_write_all_begin(fh, writebuf, bufcount, datatype);
1277 MPI_File_write_all(fh, writebuf, bufcount, datatype, &status);
1278 MPI_File_close(&fh);
1281 MPI_Type_free(&newtype);
1284 logsfprintf(
"mpiioromio_combine end\n");
1289 logsfprintf(
"mpiioromio_combine writeend begin\n");
1291 MPI_File_write_all_end(fh, writebuf, &status);
1293 MPI_File_close(&fh);
1298 MPI_Type_free(&newtype);
1299 logsfprintf(
"mpiioromio_combine writeend end\n");
1306 #endif // end if USEMPI&&USEROMIO
1321 int set_sizeofmemory(
int numbuff,
int sizeofdatatype,
int numcolumns,
long long int *sizeofmemory)
1329 int set_maxnumsize(
int numcolumns,
long long int *maxnumsize)
1340 int set_numbuffers(
int numcolumns,
int *numbuffers)
1346 if(
N1*
N2*N3<numcolumns) *numbuffers=myval;
1352 long long int gcountmod(
int numcolumns)
1354 long long int myval;
1365 #define DEBUGSINIT 0
1370 void mpiios_init(
int bintxt,
int sorted, FILE ** fp,
int which,
int headerbytesize,
char *filename,
int numcolumns,
1371 MPI_Datatype datatype,
void **jonioptr,
void **writebufptr)
1378 long long int sizeofmemory;
1381 long double **jonio16;
1384 unsigned char **jonio1;
1386 long long int **jonio8i;
1388 long double **writebuf16;
1391 unsigned char **writebuf1;
1393 long long int **writebuf8i;
1403 sizeofdatatype=getsizeofdatatype(datatype);
1405 if(datatype==MPI_UNSIGNED_CHAR){ jonio1=(
unsigned char **)jonioptr; writebuf1=(
unsigned char **)writebufptr; }
1406 else if(datatype==MPI_FLOAT){ jonio4=(
float **)jonioptr; writebuf4=(
float **)writebufptr; }
1407 else if(datatype==MPI_DOUBLE){ jonio8=(
double**)jonioptr; writebuf8=(
double**)writebufptr; }
1408 else if(datatype==MPI_LONG_DOUBLE){ jonio16=(
long double**)jonioptr; writebuf16=(
long double**)writebufptr; }
1409 else if(datatype==MPI_INT){ jonio4i=(
int **)jonioptr; writebuf4i=(
int **)writebufptr; }
1410 else if(datatype==MPI_LONG_LONG_INT){ jonio8i=(
long long int **)jonioptr; writebuf8i=(
long long int **)writebufptr; }
1412 logsfprintf(
"mpiios_init begin\n");
1427 for(i=0;i<numfiles;i++){
1429 sprintf(newfilename,
"%s-col%04d",filename,i);
1432 sprintf(newfilename,
"%s",filename);
1436 #define NUMTRYGETTINGFILE 3
1437 for(trygettingfile=0;trygettingfile<NUMTRYGETTINGFILE;trygettingfile++){
1441 else if(bintxt==
TEXTOUTPUT) fp[
i] = fopen(newfilename,
"at");
1443 dualfprintf(
fail_file,
"No such bintxt=%d\n",bintxt);
1450 else if(bintxt==
TEXTOUTPUT) fp[
i] = fopen(newfilename,
"rt");
1452 dualfprintf(
fail_file,
"No such bintxt=%d\n",bintxt);
1456 if (fp[i] == NULL) {
1457 dualfprintf(
fail_file,
"error opening file: %s\n", newfilename);
1458 if(trygettingfile==NUMTRYGETTINGFILE) myexit(62676);
1460 dualfprintf(
fail_file,
"Pausing for disk to get into synch: %d\n",trygettingfile);
1464 #define FAKENUM 100 // number of square roots to take to pause
1465 for(fakei=i;fakei<=FAKENUM;fakei++){
1466 fakevar=sqrt(fakevar);
1476 trygettingfile=NUMTRYGETTINGFILE;
1484 fseek(fp[i],headerbytesize,SEEK_SET);
1493 if ( (sorted==
SORTED)&&(myid == 0) ){
1503 sizeofmemory = (
long long int)sizeofdatatype * (
long long int)
totalsize[1] * (
long long int)
totalsize[2] * (
long long int)
totalsize[3] * (
long long int)numcolumns;
1508 set_sizeofmemory(2,sizeofdatatype, numcolumns, &sizeofmemory);
1509 if(sizeofmemory>(
long long int)sizeofdatatype * (
long long int)
totalsize[1] * (
long long int)
totalsize[2] * (
long long int)
totalsize[3] * (
long long int)numcolumns){
1510 sizeofmemory = (
long long int)sizeofdatatype * (
long long int)
totalsize[1] * (
long long int)
totalsize[2] * (
long long int)
totalsize[3] * (
long long int)numcolumns;
1515 if(sizeofmemory<(
long long int)sizeofdatatype*(
long long int)numcolumns*(
long long int)2) sizeofmemory=(
long long int)sizeofdatatype*(
long long int)numcolumns*(
long long int)2;
1516 if(sizeofmemory<(
long long int)2*(
long long int)numcolumns){
1517 dualfprintf(
fail_file,
"problem, sizeofmemory=%lld < %lld=2*numcolumns\n",sizeofmemory,(
long long int)2*(
long long int)numcolumns);
1522 joniosize=sizeofmemory/((
long long int)sizeofdatatype);
1525 dualfprintf(
fail_file,
"jonio sizeofmemory=%lld sizeofdatatype=%d\n",sizeofmemory,sizeofdatatype);
1528 if(datatype==MPI_UNSIGNED_CHAR) *jonio1=(
unsigned char*)malloc(sizeofmemory);
1529 else if(datatype==MPI_FLOAT) *jonio4=(
float*)malloc(sizeofmemory);
1530 else if(datatype==MPI_DOUBLE) *jonio8 =(
double*)malloc(sizeofmemory);
1531 else if(datatype==MPI_LONG_DOUBLE) *jonio16 =(
long double*)malloc(sizeofmemory);
1532 else if(datatype==MPI_INT) *jonio4i=(
int*)malloc(sizeofmemory);
1533 else if(datatype==MPI_LONG_LONG_INT) *jonio8i=(
long long int*)malloc(sizeofmemory);
1535 (datatype==MPI_UNSIGNED_CHAR)&&(*jonio1 == NULL) ||
1536 (datatype==MPI_FLOAT)&&(*jonio4 == NULL) ||
1537 (datatype==MPI_DOUBLE)&&(*jonio8 == NULL) ||
1538 (datatype==MPI_LONG_DOUBLE)&&(*jonio16 == NULL) ||
1539 (datatype==MPI_INT)&&(*jonio4i == NULL) ||
1540 (datatype==MPI_LONG_LONG_INT)&&(*jonio8i == NULL)
1542 dualfprintf(
fail_file,
"Can't initialize jonio memory for mpiios_init\n");
1557 logsfprintf(
"mpiios_init jonio: sizeofmemory=%lld sizeofdatatype=%d\n",sizeofmemory,sizeofdatatype);
1578 sizeofmemory = (
long long int)sizeofdatatype * (
long long int)
N1 * (
long long int)
N2 * (
long long int)N3 * (
long long int)numcolumns ;
1582 set_sizeofmemory(1,sizeofdatatype, numcolumns, &sizeofmemory);
1583 if(sizeofmemory>(
long long int)sizeofdatatype*(
long long int)
N1*(
long long int)
N2*(
long long int)N3*(
long long int)numcolumns) sizeofmemory=(
long long int)sizeofdatatype*(
long long int)
N1*(
long long int)
N2*(
long long int)N3*(
long long int)numcolumns;
1584 if(sizeofmemory<(
long long int)sizeofdatatype*(
long long int)numcolumns) sizeofmemory=(
long long int)sizeofdatatype*(
long long int)
numcolumns;
1586 dualfprintf(
fail_file,
"problem, sizeofmemory=%lld < %lld=numcolumns\n",sizeofmemory,(
long long int)numcolumns);
1591 writebufsize=sizeofmemory/((
long long int)sizeofdatatype);
1594 dualfprintf(
fail_file,
"writebuf sizeofmemory=%lld sizeofdatatype=%d\n",sizeofmemory,sizeofdatatype);
1597 if(datatype==MPI_UNSIGNED_CHAR) *writebuf1=(
unsigned char*)malloc(sizeofmemory);
1598 else if(datatype==MPI_FLOAT) *writebuf4=(
float*)malloc(sizeofmemory);
1599 else if(datatype==MPI_DOUBLE) *writebuf8 =(
double*)malloc(sizeofmemory);
1600 else if(datatype==MPI_LONG_DOUBLE) *writebuf16 =(
long double*)malloc(sizeofmemory);
1601 else if(datatype==MPI_INT) *writebuf4i=(
int*)malloc(sizeofmemory);
1602 else if(datatype==MPI_LONG_LONG_INT) *writebuf8i=(
long long int*)malloc(sizeofmemory);
1604 (datatype==MPI_UNSIGNED_CHAR)&&(*writebuf1 == NULL) ||
1605 (datatype==MPI_FLOAT)&&(*writebuf4 == NULL) ||
1606 (datatype==MPI_DOUBLE)&&(*writebuf8 == NULL) ||
1607 (datatype==MPI_LONG_DOUBLE)&&(*writebuf16 == NULL) ||
1608 (datatype==MPI_INT)&&(*writebuf4i == NULL) ||
1609 (datatype==MPI_LONG_LONG_INT)&&(*writebuf8i == NULL)
1611 dualfprintf(
fail_file,
"Can't initialize writebuf memory for mpiios_init: datatype=%d sizeofmemory=%d\n",datatype,sizeofmemory);
1625 logsfprintf(
"mpiios_init end: sizeofmemory=%lld sizeofdatatype=%d\n",sizeofmemory,sizeofdatatype);
1632 void mpiiomin_final(
int numcolumns,FILE **fp,
void *jonio,
void *writebuf)
1644 for(i=0;i<numfiles;i++){
1654 void mpiios_combine(
int bintxt, MPI_Datatype datatype,
int numcolumns,
1655 FILE ** fp,
void *jonio,
void *writebuf)
1657 long long int i,
j,
k, l,
col, mapvaluejonio, mapvaluetempbuf;
1659 MPI_Request rrequest;
1660 MPI_Request srequest;
1664 unsigned char *jonio1;
1667 long double *jonio16;
1669 long long int *jonio8i;
1671 unsigned char *writebuf1;
1674 long double *writebuf16;
1676 long long int *writebuf8i;
1681 logsfprintf(
"mpiios begin combine\n");
1683 sizeofdatatype=getsizeofdatatype(datatype);
1685 if (datatype == MPI_UNSIGNED_CHAR) jonio1 = (
unsigned char *) jonio;
1686 else if (datatype == MPI_FLOAT) jonio4 = (
float *) jonio;
1687 else if (datatype == MPI_DOUBLE) jonio8 = (
double *) jonio;
1688 else if (datatype == MPI_LONG_DOUBLE) jonio16 = (
long double *) jonio;
1689 else if (datatype == MPI_INT) jonio4i = (
int *) jonio;
1690 else if (datatype == MPI_LONG_LONG_INT) jonio8i = (
long long int *) jonio;
1692 if (datatype == MPI_UNSIGNED_CHAR) writebuf1 = (
unsigned char *) writebuf;
1693 else if (datatype == MPI_FLOAT) writebuf4 = (
float *) writebuf;
1694 else if (datatype == MPI_DOUBLE) writebuf8 = (
double *) writebuf;
1695 else if (datatype == MPI_LONG_DOUBLE) writebuf16 = (
long double *) writebuf;
1696 else if (datatype == MPI_INT) writebuf4i = (
int *) writebuf;
1697 else if (datatype == MPI_LONG_LONG_INT) writebuf8i = (
long long int *) writebuf;
1702 if(myid!=0) MPI_Isend(writebuf,
N1 *
N2 * N3 * numcolumns, datatype, MPIid[0], myid, MPI_COMM_GRMHD, &srequest);
1705 logsfprintf(
"on myid==0: mpiios combine: %d of numprocs=%d data=%lld\n",l,numprocs,(
long long int) (
N1 *
N2 * N3 * numcolumns) );
1707 MPI_Irecv(writebuf,
N1 *
N2 * N3 * numcolumns, datatype, MPIid[l], l, MPI_COMM_GRMHD, &rrequest);
1708 MPI_Wait(&rrequest, &mpichstatus);
1713 othercpupos[3]=(int)(l/(
ncpux1*ncpux2));
1716 for (k = 0; k <
N3; k++)
for (j = 0; j <
N2; j++)
1717 for (i = 0; i <
N1; i++)
1723 + (
long long int)
ncpux1 * (
long long int)N1 * (
long long int)ncpux2 * (
long long int)N2 * (
long long int)numcolumns * ((
long long int)k + (
long long int)othercpupos[3] * (
long long int)
N3)
1724 + (
long long int)
ncpux1 * (
long long int)N1 * (
long long int)numcolumns * ((
long long int)j + (
long long int)othercpupos[2] * (
long long int)N2)
1725 + (
long long int)numcolumns * ((
long long int)i + (
long long int)othercpupos[1] * (
long long int)
N1)
1726 + (
long long int)
col;
1730 + (
long long int)k * (
long long int)N1 * (
long long int)N2 * (
long long int)numcolumns
1731 + (
long long int)j * (
long long int)N1 * (
long long int)numcolumns
1732 + (
long long int)i * (
long long int)numcolumns + (
long long int)
col;
1734 if (datatype == MPI_UNSIGNED_CHAR) jonio1[mapvaluejonio] = writebuf1[mapvaluetempbuf];
1735 else if (datatype == MPI_FLOAT) jonio4[mapvaluejonio] = writebuf4[mapvaluetempbuf];
1736 else if (datatype == MPI_DOUBLE) jonio8[mapvaluejonio] = writebuf8[mapvaluetempbuf];
1737 else if (datatype == MPI_LONG_DOUBLE) jonio16[mapvaluejonio] = writebuf16[mapvaluetempbuf];
1738 else if (datatype == MPI_INT) jonio4i[mapvaluejonio] = writebuf4i[mapvaluetempbuf];
1739 else if (datatype == MPI_LONG_LONG_INT) jonio8i[mapvaluejonio] = writebuf8i[mapvaluetempbuf];
1743 if(myid!=0) MPI_Wait(&srequest, &mpichstatus);
1747 logsfprintf(
"on myid==0: mpiios combine: writing: %lld\n",(
long long int)
totalsize[1] * (
long long int)
totalsize[2] * (
long long int)
totalsize[3] * (
long long int)numcolumns);
1759 if (datatype == MPI_UNSIGNED_CHAR) fwrite(&jonio1[i], sizeofdatatype,1, fp[i%numfiles]);
1760 else if (datatype == MPI_FLOAT) fwrite(&jonio4[i], sizeofdatatype,1, fp[i%numfiles]);
1761 else if (datatype == MPI_DOUBLE) fwrite(&jonio8[i], sizeofdatatype,1, fp[i%numfiles]);
1762 else if (datatype == MPI_LONG_DOUBLE) fwrite(&jonio16[i], sizeofdatatype,1, fp[i%numfiles]);
1763 else if (datatype == MPI_INT) fwrite(&jonio4i[i], sizeofdatatype,1, fp[i%numfiles]);
1764 else if (datatype == MPI_LONG_LONG_INT) fwrite(&jonio8i[i], sizeofdatatype,1, fp[i%numfiles]);
1770 if (datatype == MPI_UNSIGNED_CHAR) fprintf(fp[i%numfiles],
"%c",jonio1[i]);
1771 else if (datatype == MPI_FLOAT) fprintf(fp[i%numfiles],
"%15.7g",jonio4[i]);
1772 else if (datatype == MPI_DOUBLE) fprintf(fp[i%numfiles],
"%21.15g",jonio8[i]);
1773 else if (datatype == MPI_LONG_DOUBLE) fprintf(fp[i%numfiles],
"%31.25Lg",jonio16[i]);
1774 else if (datatype == MPI_INT) fprintf(fp[i%numfiles],
"%d",jonio4i[i]);
1775 else if (datatype == MPI_LONG_LONG_INT) fprintf(fp[i%numfiles],
"%lld",jonio8i[i]);
1777 if((i+1)%numcolumns) fprintf(*fp,
" ");
1778 else fprintf(*fp,
"\n");
1780 else fprintf(fp[i%numfiles],
"\n");
1783 logsfprintf(
"on myid==0: mpiios combine: freeing\n");
1785 for(i=0;i<numfiles;i++){
1792 logsfprintf(
"mpiios end combine\n");
1798 void mpiios_seperate(
int bintxt,
int stage, MPI_Datatype datatype,
int numcolumns,
1799 FILE ** fp,
void *jonio,
1802 long long int i,
j,
k, l,
col, mapvaluejonio, mapvaluetempbuf;
1804 MPI_Request rrequest;
1805 MPI_Request srequest;
1811 unsigned char *jonio1;
1814 long double *jonio16;
1816 long long int *jonio8i;
1818 unsigned char *writebuf1;
1821 long double *writebuf16;
1823 long long int *writebuf8i;
1824 unsigned short short4char;
1829 logsfprintf(
"mpiios begin seperate\n");
1831 sizeofdatatype=getsizeofdatatype(datatype);
1833 if (datatype == MPI_UNSIGNED_CHAR) jonio1 = (
unsigned char *) jonio;
1834 else if (datatype == MPI_FLOAT) jonio4 = (
float *) jonio;
1835 else if (datatype == MPI_DOUBLE) jonio8 = (
double *) jonio;
1836 else if (datatype == MPI_LONG_DOUBLE) jonio16 = (
long double *) jonio;
1837 else if (datatype == MPI_INT) jonio4i = (
int *) jonio;
1838 else if (datatype == MPI_LONG_LONG_INT) jonio8i = (
long long int *) jonio;
1841 if (datatype == MPI_UNSIGNED_CHAR) writebuf1 = (
unsigned char *) writebuf;
1842 else if (datatype == MPI_FLOAT) writebuf4 = (
float *) writebuf;
1843 else if (datatype == MPI_DOUBLE) writebuf8 = (
double *) writebuf;
1844 else if (datatype == MPI_LONG_DOUBLE) writebuf16 = (
long double *) writebuf;
1845 else if (datatype == MPI_INT) writebuf4i = (
int *) writebuf;
1846 else if (datatype == MPI_LONG_LONG_INT) writebuf8i = (
long long int *) writebuf;
1864 if (datatype == MPI_UNSIGNED_CHAR) fread(&jonio1[i], sizeofdatatype,1, fp[i%numfiles]);
1865 else if (datatype == MPI_FLOAT) fread(&jonio4[i], sizeofdatatype,1, fp[i%numfiles]);
1866 else if (datatype == MPI_DOUBLE) fread(&jonio8[i], sizeofdatatype,1, fp[i%numfiles]);
1867 else if (datatype == MPI_LONG_DOUBLE) fread(&jonio16[i], sizeofdatatype,1, fp[i%numfiles]);
1868 else if (datatype == MPI_INT) fread(&jonio4i[i], sizeofdatatype,1, fp[i%numfiles]);
1869 else if (datatype == MPI_LONG_LONG_INT) fread(&jonio8i[i], sizeofdatatype,1, fp[i%numfiles]);
1875 if (datatype == MPI_UNSIGNED_CHAR){
1876 fscanf(fp[i%numfiles],
"%hu",&short4char);
1877 jonio1[
i]=short4char;
1879 else if (datatype == MPI_FLOAT) fscanf(fp[i%numfiles],
"%f",&jonio4[i]);
1880 else if (datatype == MPI_DOUBLE) fscanf(fp[i%numfiles],
"%lf",&jonio8[i]);
1881 else if (datatype == MPI_LONG_DOUBLE) fscanf(fp[i%numfiles],
"%Lf",&jonio16[i]);
1882 else if (datatype == MPI_INT) fscanf(fp[i%numfiles],
"%d",&jonio4i[i]);
1883 else if (datatype == MPI_LONG_LONG_INT) fscanf(fp[i%numfiles],
"%lld",&jonio8i[i]);
1889 for (l = numprocs-1 ; l >=0; l--) {
1893 othercpupos[3]=(int)(l/(
ncpux1*ncpux2));
1896 for (k = 0; k <
N3; k++)
for (j = 0; j <
N2; j++) {
1897 for (i = 0; i <
N1; i++) {
1902 + (
long long int)
ncpux1 * (
long long int)N1 * (
long long int)ncpux2 * (
long long int)N2 * (
long long int)numcolumns * ((
long long int)k + (
long long int)othercpupos[3] * (
long long int)
N3)
1903 + (
long long int)
ncpux1 * (
long long int)N1 * (
long long int)numcolumns * ((
long long int)j + (
long long int)othercpupos[2] * (
long long int)N2)
1904 + (
long long int)numcolumns * ((
long long int)i + (
long long int)othercpupos[1] * (
long long int)
N1)
1905 + (
long long int)
col;
1909 + (
long long int)k * (
long long int)N1 * (
long long int)N2 * (
long long int)numcolumns
1910 + (
long long int)j * (
long long int)N1 * (
long long int)numcolumns
1911 + (
long long int)i * (
long long int)numcolumns + (
long long int)
col;
1914 if((mapvaluetempbuf<0)||(mapvaluetempbuf>=(
long long int)N1*N2*N3*numcolumns)){
1915 dualfprintf(
fail_file,
"mapvaluetempbuf out of range: %d\n",mapvaluetempbuf);
1918 if((mapvaluejonio<0)||(mapvaluejonio>=(
long long int)
totalsize[1]*(
long long int)
totalsize[2]*(
long long int)
totalsize[3]*(
long long int)numcolumns)){
1919 dualfprintf(
fail_file,
"mapvaluejonio out of range: %d\n",mapvaluejonio);
1922 if (datatype == MPI_UNSIGNED_CHAR) writebuf1[mapvaluetempbuf] = jonio1[mapvaluejonio];
1923 if (datatype == MPI_FLOAT) writebuf4[mapvaluetempbuf] = jonio4[mapvaluejonio];
1924 if (datatype == MPI_DOUBLE) writebuf8[mapvaluetempbuf] = jonio8[mapvaluejonio];
1925 if (datatype == MPI_LONG_DOUBLE) writebuf16[mapvaluetempbuf] = jonio16[mapvaluejonio];
1926 if (datatype == MPI_INT) writebuf4i[mapvaluetempbuf] = jonio4i[mapvaluejonio];
1927 if (datatype == MPI_LONG_LONG_INT) writebuf8i[mapvaluetempbuf] = jonio8i[mapvaluejonio];
1933 MPI_Isend(writebuf, N1 * N2 * N3 * numcolumns, datatype, MPIid[l], l, MPI_COMM_GRMHD, &srequest);
1934 MPI_Wait(&srequest, &mpichstatus);
1942 MPI_Irecv(writebuf, N1 * N2 * N3 * numcolumns, datatype, MPIid[0], myid, MPI_COMM_GRMHD, &rrequest);
1943 MPI_Wait(&rrequest, &mpichstatus);
1945 }
else if (stage ==
STAGE2) {
1954 logsfprintf(
"mpiios end seperate\n");
1961 void mpiiotu_combine(MPI_Datatype datatype,
int numcolumns, FILE ** fp,
void *writebuf)
1963 long long int i,
j,
k, l,
col;
1965 MPI_Request rrequest;
1966 MPI_Request srequest;
1972 unsigned char *writebuf1;
1975 long double *writebuf16;
1977 long long int *writebuf8i;
1979 long long int bufferwritemap;
1982 sizeofdatatype=getsizeofdatatype(datatype);
1984 if (datatype == MPI_UNSIGNED_CHAR) writebuf1 = (
unsigned char *) writebuf;
1985 else if (datatype == MPI_FLOAT) writebuf4 = (
float *) writebuf;
1986 else if (datatype == MPI_DOUBLE) writebuf8 = (
double *) writebuf;
1987 else if (datatype == MPI_LONG_DOUBLE) writebuf16 = (
long double *) writebuf;
1988 else if (datatype == MPI_INT) writebuf4i = (
int *) writebuf;
1989 else if (datatype == MPI_LONG_LONG_INT) writebuf8i = (
long long int *) writebuf;
1993 if(myid!=0) MPI_Isend(writebuf, N1 * N2 * N3 * numcolumns, datatype, MPIid[0], myid, MPI_COMM_GRMHD, &srequest);
2003 MPI_Irecv(writebuf, N1 * N2 * N3 * numcolumns, datatype, MPIid[l], l, MPI_COMM_GRMHD, &rrequest);
2004 MPI_Wait(&rrequest, &mpichstatus);
2010 bufferwritemap=(
long long int)col + (
long long int)numcolumns*((
long long int)i+(
long long int)N1*(
long long int)j+(
long long int)N1*(
long long int)N2*(
long long int)
k);
2012 if(datatype== MPI_UNSIGNED_CHAR){
2013 fprintf(fp[(bufferwritemap)%numfiles],
"%c ",writebuf1[bufferwritemap]);
2015 else if(datatype==MPI_FLOAT){
2016 fprintf(fp[(bufferwritemap)%numfiles],
"%15.7g ",writebuf4[bufferwritemap]);
2018 else if(datatype==MPI_DOUBLE){
2019 fprintf(fp[(bufferwritemap)%numfiles],
"%21.15g ",writebuf8[bufferwritemap]);
2021 else if(datatype==MPI_LONG_DOUBLE){
2022 fprintf(fp[(bufferwritemap)%numfiles],
"%31.25Lg ",writebuf16[bufferwritemap]);
2024 else if(datatype==MPI_INT){
2025 fprintf(fp[(bufferwritemap)%numfiles],
"%d ",writebuf4i[bufferwritemap]);
2027 else if(datatype==MPI_LONG_LONG_INT){
2028 fprintf(fp[(bufferwritemap)%numfiles],
"%lld ",writebuf8i[bufferwritemap]);
2030 if(numfiles>1) fprintf(fp[(bufferwritemap)%numfiles],
"\n");
2032 if(numfiles==1) fprintf(*fp,
"\n");
2036 if(myid!=0) MPI_Wait(&srequest, &mpichstatus);
2040 for(i=0;i<numfiles;i++){
2051 FILE ** fp,
void *writebuf)
2053 long long int i,
j,
k, l,
col;
2055 MPI_Request rrequest;
2056 MPI_Request srequest;
2067 unsigned char *writebuf1;
2070 long double *writebuf16;
2072 long long int *writebuf8i;
2074 unsigned char *tempbuf1;
2077 long double *tempbuf16;
2079 long long int *tempbuf8i;
2081 unsigned char *sendbuf1;
2084 long double *sendbuf16;
2086 long long int *sendbuf8i;
2088 unsigned short short4char;
2090 long long int bufferwritemap;
2094 sizeofdatatype=getsizeofdatatype(datatype);
2096 if (datatype == MPI_UNSIGNED_CHAR) writebuf1 = (
unsigned char *) writebuf;
2097 else if (datatype == MPI_FLOAT) writebuf4 = (
float *) writebuf;
2098 else if (datatype == MPI_DOUBLE) writebuf8 = (
double *) writebuf;
2099 else if (datatype == MPI_LONG_DOUBLE) writebuf16 = (
long double *) writebuf;
2100 else if (datatype == MPI_INT) writebuf4i = (
int *) writebuf;
2101 else if (datatype == MPI_LONG_LONG_INT) writebuf8i = (
long long int *) writebuf;
2104 if((tempbuf=malloc(sizeofdatatype*N1*N2*N3*numcolumns))==NULL){
2105 dualfprintf(
fail_file,
"Can't open tempbuf in gammieio_sep\n");
2109 if (datatype == MPI_UNSIGNED_CHAR) tempbuf1 = (
unsigned char *) tempbuf;
2110 else if (datatype == MPI_FLOAT) tempbuf4 = (
float *) tempbuf;
2111 else if (datatype == MPI_DOUBLE) tempbuf8 = (
double *) tempbuf;
2112 else if (datatype == MPI_LONG_DOUBLE) tempbuf16 = (
long double *) tempbuf;
2113 else if (datatype == MPI_INT) tempbuf4i = (
int *) tempbuf;
2114 else if (datatype == MPI_LONG_LONG_INT) tempbuf8i = (
long long int *) tempbuf;
2133 sendbuf4i=writebuf4i;
2134 sendbuf8i=writebuf8i;
2141 sendbuf4i=tempbuf4i;
2142 sendbuf8i=tempbuf8i;
2147 bufferwritemap=(
long long int)col+(
long long int)numcolumns*((
long long int)i+(
long long int)N1*(
long long int)j+(
long long int)N1*(
long long int)N2*(
long long int)
k);
2149 if(datatype==MPI_UNSIGNED_CHAR){
2150 fscanf(fp[(bufferwritemap)%numfiles],
"%hu",&short4char);
2151 sendbuf1[bufferwritemap]=short4char;
2153 else if(datatype==MPI_FLOAT) fscanf(fp[(bufferwritemap)%numfiles],
"%f",&sendbuf4[bufferwritemap]);
2154 else if(datatype==MPI_DOUBLE) fscanf(fp[(bufferwritemap)%numfiles],
"%lf",&sendbuf8[bufferwritemap]);
2155 else if(datatype==MPI_LONG_DOUBLE) fscanf(fp[(bufferwritemap)%numfiles],
"%Lf",&sendbuf16[bufferwritemap]);
2156 else if(datatype==MPI_INT) fscanf(fp[(bufferwritemap)%numfiles],
"%d",&sendbuf4i[bufferwritemap]);
2157 else if(datatype==MPI_LONG_LONG_INT) fscanf(fp[(bufferwritemap)%numfiles],
"%lld",&sendbuf8i[bufferwritemap]);
2160 MPI_Isend(sendbuf, N1 * N2 * N3 * numcolumns, datatype, MPIid[l], l, MPI_COMM_GRMHD, &srequest);
2162 MPI_Wait(&srequest, &mpichstatus);
2168 MPI_Irecv(writebuf, N1 * N2 * N3 * numcolumns, datatype, MPIid[0], myid, MPI_COMM_GRMHD, &rrequest);
2169 MPI_Wait(&rrequest, &mpichstatus);
2171 }
else if (stage == 2) {
2174 for(i=0;i<numfiles;i++){
2192 int getsizeofdatatype(MPI_Datatype datatype)
2196 if (datatype == MPI_UNSIGNED_CHAR) sizeofdatatype=
sizeof(
unsigned char);
2197 else if (datatype == MPI_FLOAT) sizeofdatatype=
sizeof(float);
2198 else if (datatype == MPI_DOUBLE) sizeofdatatype=
sizeof(double);
2199 else if (datatype == MPI_LONG_DOUBLE) sizeofdatatype=
sizeof(
long double);
2200 else if (datatype == MPI_INT) sizeofdatatype=
sizeof(int);
2201 else if (datatype == MPI_LONG) sizeofdatatype=
sizeof(
long int);
2202 else if (datatype == MPI_LONG_LONG_INT) sizeofdatatype=
sizeof(
long long int);
2204 dualfprintf(
fail_file,
"No such datatype=%d\n",datatype);
2208 return(sizeofdatatype);
2214 void mpimax(
SFTYPE*maxptr)
2220 MPI_Allreduce(&send, maxptr, 1, MPI_SFTYPE, MPI_MAX,MPI_COMM_GRMHD);
2227 void mpiimax(
int*maxptr)
2233 MPI_Allreduce(&send, maxptr, 1, MPI_INT, MPI_MAX,MPI_COMM_GRMHD);
2239 void mpiisum(
int*sumptr)
2245 MPI_Allreduce(&send, sumptr, 1, MPI_INT, MPI_SUM,MPI_COMM_GRMHD);
2251 void mpiFTYPEsum(
FTYPE*sumptr)
2257 MPI_Allreduce(&send, sumptr, 1, MPI_FTYPE, MPI_SUM,MPI_COMM_GRMHD);
2263 void mpiisum0(
int*sumptr,
int recvid)
2269 MPI_Reduce(&send, sumptr, 1, MPI_INT, MPI_SUM,MPIid[recvid], MPI_COMM_GRMHD);
2274 void mpildsum0(
long int*sumptr,
int recvid)
2280 MPI_Reduce(&send, sumptr, 1, MPI_LONG, MPI_SUM,MPIid[recvid], MPI_COMM_GRMHD);
2286 void mpimin(
SFTYPE*minptr)
2292 MPI_Allreduce(&send, minptr, 1, MPI_SFTYPE, MPI_MIN,MPI_COMM_GRMHD);
2298 void mpifmin(
FTYPE*minptr)
2304 MPI_Allreduce(&send, minptr, 1, MPI_FTYPE, MPI_MIN,MPI_COMM_GRMHD);
2312 long long int i,
j,
k,pl;
2313 FTYPE maxsend,minsend,sumsend;
2314 int domin,domax,dosum;
2316 if(maxptr==NULL) domax=0;
else domax=1;
2317 if(minptr==NULL) domin=0;
else domin=1;
2318 if(sumptr==NULL) dosum=0;
else dosum=1;
2320 for(pl=start;pl<start+nmemb;pl++){
2322 if(domin) minptr[pl]=1E30;
2323 if(domax) maxptr[pl]=-1E30;
2324 if(dosum) sumptr[pl]=0;
2327 for(pl=start;pl<start+nmemb;pl++){
2328 if(domax)
if (
MACP0A1(
p,i,j,k,pl) > maxptr[pl]) maxptr[pl] =
MACP0A1(
p,i,j,k,pl);
2329 if(domin)
if (
MACP0A1(
p,i,j,k,pl) < minptr[pl]) minptr[pl] =
MACP0A1(
p,i,j,k,pl);
2330 if(dosum) sumptr[pl]+=
MACP0A1(
p,i,j,k,pl);
2334 for(pl=start;pl<start+nmemb;pl++){
2336 maxsend = maxptr[pl];
2337 MPI_Allreduce(&maxsend, &maxptr[pl], 1, MPI_FTYPE, MPI_MAX, MPI_COMM_GRMHD);
2340 minsend = minptr[pl];
2341 MPI_Allreduce(&minsend, &minptr[pl], 1, MPI_FTYPE, MPI_MIN, MPI_COMM_GRMHD);
2344 sumsend = sumptr[pl];
2345 MPI_Allreduce(&sumsend, &sumptr[pl], 1, MPI_FTYPE, MPI_SUM, MPI_COMM_GRMHD);
2356 void myfwrite(
int bintxt, MPI_Datatype datatype,
void *ptr,
int start,
int nmemb,
int i,
int j,
int k, FILE**stream,
void*writebuf)
2362 static long double *writebuf16;
2363 static double *writebuf8;
2364 static float *writebuf4;
2365 static unsigned char *writebuf1;
2366 static int *writebuf4i;
2367 static long long int *writebuf8i;
2369 static long double *ptr16;
2370 static double *ptr8;
2372 static unsigned char *ptr1;
2374 static long long int *ptr8i;
2376 long long int streamnum;
2380 sizeofdatatype=getsizeofdatatype(datatype);
2382 if (datatype == MPI_UNSIGNED_CHAR) writebuf1 = (
unsigned char *) writebuf;
2383 else if (datatype == MPI_FLOAT) writebuf4 = (
float *) writebuf;
2384 else if (datatype == MPI_DOUBLE) writebuf8 = (
double *) writebuf;
2385 else if (datatype == MPI_LONG_DOUBLE) writebuf16 = (
long double *) writebuf;
2386 else if (datatype == MPI_INT) writebuf4i = (
int *) writebuf;
2387 else if (datatype == MPI_LONG_LONG_INT) writebuf8i = (
long long int *) writebuf;
2389 dualfprintf(
fail_file,
"No such datatype=%d\n",datatype);
2393 if (datatype == MPI_UNSIGNED_CHAR) ptr1 = (
unsigned char *) ptr;
2394 else if (datatype == MPI_FLOAT) ptr4 = (
float *) ptr;
2395 else if (datatype == MPI_DOUBLE) ptr8 = (
double *) ptr;
2396 else if (datatype == MPI_LONG_DOUBLE) ptr16 = (
long double *) ptr;
2397 else if (datatype == MPI_INT) ptr4i = (
int *) ptr;
2398 else if (datatype == MPI_LONG_LONG_INT) ptr8i = (
long long int *) ptr;
2400 dualfprintf(
fail_file,
"No such datatype=%d\n",datatype);
2407 fwrite((
char*)ptr+(sizeofdatatype*start), sizeofdatatype, nmemb, stream[0]);
2411 for(pl=start;pl<start+nmemb;pl++){
2413 fwrite((
char*)ptr+(sizeofdatatype*pl), sizeofdatatype, 1, stream[streamnum]);
2419 for(pl=start;pl<start+nmemb;pl++){
2422 if (datatype == MPI_UNSIGNED_CHAR) fprintf(stream[streamnum],
"%c ",ptr1[pl]);
2423 else if (datatype == MPI_FLOAT) fprintf(stream[streamnum],
"%15.7g ",ptr4[pl]);
2424 else if (datatype == MPI_DOUBLE) fprintf(stream[streamnum],
"%21.15g ",ptr8[pl]);
2425 else if (datatype == MPI_LONG_DOUBLE) fprintf(stream[streamnum],
"%31.25Lg ",ptr16[pl]);
2426 else if (datatype == MPI_INT) fprintf(stream[streamnum],
"%d ",ptr4i[pl]);
2427 else if (datatype == MPI_LONG_LONG_INT) fprintf(stream[streamnum],
"%lld ",ptr8i[pl]);
2434 for(pl=start;pl<start+nmemb;pl++){
2437 if (datatype == MPI_UNSIGNED_CHAR) writebuf1[
BUFFERMAP2] = ptr1[pl];
2438 if (datatype == MPI_FLOAT) writebuf4[
BUFFERMAP2] = ptr4[pl];
2439 if (datatype == MPI_DOUBLE) writebuf8[
BUFFERMAP2] = ptr8[pl];
2440 if (datatype == MPI_LONG_DOUBLE) writebuf16[
BUFFERMAP2] = ptr16[pl];
2441 if (datatype == MPI_INT) writebuf4i[
BUFFERMAP2] = ptr4i[pl];
2442 if (datatype == MPI_LONG_LONG_INT) writebuf8i[
BUFFERMAP2] = ptr8i[pl];
2448 for(pl=start;pl<start+nmemb;pl++){
2449 if (datatype == MPI_UNSIGNED_CHAR) writebuf1[
BUFFERMAP] = ptr1[pl];
2450 if (datatype == MPI_FLOAT) writebuf4[
BUFFERMAP] = ptr4[pl];
2451 if (datatype == MPI_DOUBLE) writebuf8[
BUFFERMAP] = ptr8[pl];
2452 if (datatype == MPI_LONG_DOUBLE) writebuf16[
BUFFERMAP] = ptr16[pl];
2453 if (datatype == MPI_INT) writebuf4i[
BUFFERMAP] = ptr4i[pl];
2454 if (datatype == MPI_LONG_LONG_INT) writebuf8i[
BUFFERMAP] = ptr8i[pl];
2461 void myfread(
int bintxt, MPI_Datatype datatype,
void *ptr,
int start,
int nmemb,
int i,
int j,
int k, FILE**stream,
void*writebuf)
2467 static long double *writebuf16;
2468 static double *writebuf8;
2469 static float *writebuf4;
2470 static unsigned char *writebuf1;
2471 static int *writebuf4i;
2472 static long long int *writebuf8i;
2474 static long double *ptr16;
2475 static double *ptr8;
2477 static unsigned char *ptr1;
2479 static long long int *ptr8i;
2481 unsigned short short4char;
2487 sizeofdatatype=getsizeofdatatype(datatype);
2489 if (datatype == MPI_UNSIGNED_CHAR) writebuf1 = (
unsigned char *) writebuf;
2490 else if (datatype == MPI_FLOAT) writebuf4 = (
float *) writebuf;
2491 else if (datatype == MPI_DOUBLE) writebuf8 = (
double *) writebuf;
2492 else if (datatype == MPI_LONG_DOUBLE) writebuf16 = (
long double *) writebuf;
2493 else if (datatype == MPI_INT) writebuf4i = (
int *) writebuf;
2494 else if (datatype == MPI_LONG_LONG_INT) writebuf8i = (
long long int *) writebuf;
2496 dualfprintf(
fail_file,
"No such datatype=%d\n",datatype);
2500 if (datatype == MPI_UNSIGNED_CHAR) ptr1 = (
unsigned char *) ptr;
2501 else if (datatype == MPI_FLOAT) ptr4 = (
float *) ptr;
2502 else if (datatype == MPI_DOUBLE) ptr8 = (
double *) ptr;
2503 else if (datatype == MPI_LONG_DOUBLE) ptr16 = (
long double *) ptr;
2504 else if (datatype == MPI_INT) ptr4i = (
int *) ptr;
2505 else if (datatype == MPI_LONG_LONG_INT) ptr8i = (
long long int *) ptr;
2507 dualfprintf(
fail_file,
"No such datatype=%d\n",datatype);
2514 fread((
char*)ptr+(sizeofdatatype*start), sizeofdatatype, nmemb, stream[0]);
2518 for(pl=start;pl<start+nmemb;pl++){
2520 fread((
char*)ptr+(sizeofdatatype*pl), sizeofdatatype, 1, stream[streamnum]);
2526 for(pl=start;pl<start+nmemb;pl++){
2529 if (datatype == MPI_UNSIGNED_CHAR){
2530 fscanf(stream[streamnum],
"%hu",&short4char);
2531 ptr1[pl]=short4char;
2533 else if (datatype == MPI_FLOAT) fscanf(stream[streamnum],
"%f",&ptr4[pl]);
2534 else if (datatype == MPI_DOUBLE) fscanf(stream[streamnum],
"%lf",&ptr8[pl]);
2535 else if (datatype == MPI_LONG_DOUBLE) fscanf(stream[streamnum],
"%Lf",&ptr16[pl]);
2536 else if (datatype == MPI_INT) fscanf(stream[streamnum],
"%d",&ptr4i[pl]);
2537 else if (datatype == MPI_LONG_LONG_INT) fscanf(stream[streamnum],
"%lld",&ptr8i[pl]);
2544 for(pl=start;pl<start+nmemb;pl++){
2546 if (datatype == MPI_UNSIGNED_CHAR) ptr1[pl]=writebuf1[
BUFFERMAP2];
2547 if (datatype == MPI_FLOAT) ptr4[pl]=writebuf4[
BUFFERMAP2];
2548 if (datatype == MPI_DOUBLE) ptr8[pl]=writebuf8[
BUFFERMAP2];
2549 if (datatype == MPI_LONG_DOUBLE) ptr16[pl]=writebuf16[
BUFFERMAP2];
2550 if (datatype == MPI_INT) ptr4i[pl]=writebuf4i[
BUFFERMAP2];
2551 if (datatype == MPI_LONG_LONG_INT) ptr8i[pl]=writebuf8i[
BUFFERMAP2];
2556 else for(pl=start;pl<start+nmemb;pl++){
2557 if (datatype == MPI_UNSIGNED_CHAR) ptr1[pl]=writebuf1[
BUFFERMAP];
2558 if (datatype == MPI_FLOAT) ptr4[pl]=writebuf4[
BUFFERMAP];
2559 if (datatype == MPI_DOUBLE) ptr8[pl]=writebuf8[
BUFFERMAP];
2560 if (datatype == MPI_LONG_DOUBLE) ptr16[pl]=writebuf16[
BUFFERMAP];
2561 if (datatype == MPI_INT) ptr4i[pl]=writebuf4i[
BUFFERMAP];
2562 if (datatype == MPI_LONG_LONG_INT) ptr8i[pl]=writebuf8i[
BUFFERMAP];
2569 void myset(MPI_Datatype datatype,
void *ptr,
int start,
int nmemb,
void*writebuf)
2573 static long double *writebuf16;
2574 static double *writebuf8;
2575 static float *writebuf4;
2576 static unsigned char *writebuf1;
2577 static int *writebuf4i;
2578 static long long int *writebuf8i;
2580 static long double *ptr16;
2581 static double *ptr8;
2583 static unsigned char *ptr1;
2585 static long long int *ptr8i;
2587 if (datatype == MPI_UNSIGNED_CHAR) writebuf1 = (
unsigned char *) writebuf;
2588 else if (datatype == MPI_FLOAT) writebuf4 = (
float *) writebuf;
2589 else if (datatype == MPI_DOUBLE) writebuf8 = (
double *) writebuf;
2590 else if (datatype == MPI_LONG_DOUBLE) writebuf16 = (
long double *) writebuf;
2591 else if (datatype == MPI_INT) writebuf4i = (
int *) writebuf;
2592 else if (datatype == MPI_LONG_LONG_INT) writebuf8i = (
long long int *) writebuf;
2594 dualfprintf(
fail_file,
"No such datatype=%d\n",datatype);
2598 if (datatype == MPI_UNSIGNED_CHAR) ptr1 = (
unsigned char *) ptr;
2599 else if (datatype == MPI_FLOAT) ptr4 = (
float *) ptr;
2600 else if (datatype == MPI_DOUBLE) ptr8 = (
double *) ptr;
2601 else if (datatype == MPI_LONG_DOUBLE) ptr16 = (
long double *) ptr;
2602 else if (datatype == MPI_INT) ptr4i = (
int *) ptr;
2603 else if (datatype == MPI_LONG_LONG_INT) ptr8i = (
long long int *) ptr;
2605 dualfprintf(
fail_file,
"No such datatype=%d\n",datatype);
2609 for(pl=start;pl<start+nmemb;pl++){
2611 if (datatype == MPI_UNSIGNED_CHAR) writebuf1[
nextcol++] = ptr1[pl];
2612 else if (datatype == MPI_FLOAT) writebuf4[
nextcol++] = ptr4[pl];
2613 else if (datatype == MPI_DOUBLE) writebuf8[
nextcol++] = ptr8[pl];
2614 else if (datatype == MPI_LONG_DOUBLE) writebuf16[
nextcol++] = ptr16[pl];
2615 else if (datatype == MPI_INT) writebuf4i[
nextcol++] = ptr4i[pl];
2616 else if (datatype == MPI_LONG_LONG_INT) writebuf8i[
nextcol++] = ptr8i[pl];
2623 void myget(MPI_Datatype datatype,
void *ptr,
int start,
int nmemb,
void*writebuf)
2627 static long double *writebuf16;
2628 static double *writebuf8;
2629 static float *writebuf4;
2630 static unsigned char *writebuf1;
2631 static int *writebuf4i;
2632 static long long int *writebuf8i;
2634 static long double *ptr16;
2635 static double *ptr8;
2637 static unsigned char *ptr1;
2639 static long long int *ptr8i;
2641 if (datatype == MPI_UNSIGNED_CHAR) writebuf1 = (
unsigned char *) writebuf;
2642 else if (datatype == MPI_FLOAT) writebuf4 = (
float *) writebuf;
2643 else if (datatype == MPI_DOUBLE) writebuf8 = (
double *) writebuf;
2644 else if (datatype == MPI_LONG_DOUBLE) writebuf16 = (
long double *) writebuf;
2645 else if (datatype == MPI_INT) writebuf4i = (
int *) writebuf;
2646 else if (datatype == MPI_LONG_LONG_INT) writebuf8i = (
long long int *) writebuf;
2648 dualfprintf(
fail_file,
"No such datatype=%d\n",datatype);
2652 if (datatype == MPI_UNSIGNED_CHAR) ptr1 = (
unsigned char *) ptr;
2653 else if (datatype == MPI_FLOAT) ptr4 = (
float *) ptr;
2654 else if (datatype == MPI_DOUBLE) ptr8 = (
double *) ptr;
2655 else if (datatype == MPI_LONG_DOUBLE) ptr16 = (
long double *) ptr;
2656 else if (datatype == MPI_INT) ptr4i = (
int *) ptr;
2657 else if (datatype == MPI_LONG_LONG_INT) ptr8i = (
long long int *) ptr;
2659 dualfprintf(
fail_file,
"No such datatype=%d\n",datatype);
2663 for(pl=start;pl<start+nmemb;pl++){
2665 if (datatype == MPI_UNSIGNED_CHAR) ptr1[pl] = writebuf1[
nextcol++];
2666 else if (datatype == MPI_FLOAT) ptr4[pl] = writebuf4[
nextcol++];
2667 else if (datatype == MPI_DOUBLE) ptr8[pl] = writebuf8[
nextcol++];
2668 else if (datatype == MPI_LONG_DOUBLE) ptr16[pl] = writebuf16[
nextcol++];
2669 else if (datatype == MPI_INT) ptr4i[pl] = writebuf4i[
nextcol++];
2670 else if (datatype == MPI_LONG_LONG_INT) ptr8i[pl] = writebuf8i[
nextcol++];
2677 int init_linklists(
void)
2679 struct blink * blinkptr;
2680 struct blink * cpulinkptr;
2682 long long int numlists;
2683 long long int numcells;
2702 set_numbuffers(maxnumcolumns,&NUMBUFFERS);
2705 for(i=0;i<NUMDUMPTYPES;i++) if(dnumcolumns[i]>0) setuplinklist(
dnumcolumns[i],i);
2708 trifprintf(
"end setuplinklists: %d\n",NUMDUMPTYPES);
2718 trifprintf(
"start per cpu lists\n");
2722 logfprintf(
"i=%d\n",i);
2726 while(blinkptr!=NULL){
2727 numcells+=blinkptr->
num;
2730 blinkptr=blinkptr->
np;
2732 logfprintf(
"i=%d numlists=%lld numcells=%lld\n",i,numlists,numcells);
2739 trifprintf(
"start cpu==0 lists\n");
2742 logfprintf(
"i=%d\n",i);
2746 while(cpulinkptr!=NULL){
2747 numcells+=cpulinkptr->
num;
2750 cpulinkptr=cpulinkptr->
np;
2752 logfprintf(
"i=%d numlists=%lld numcells=%lld\n",i,numlists,numcells);
2774 int setuplinklist(
int numcolumns,
int which)
2776 long long int gcount,lcount,numlinks;
2777 long long int i,
j,
k,
col,li,lj,lk,pi,pj,pk,pid,firstlink;
2778 struct blink * clinkptr0, *clinkptr;
2779 struct blink * linkptr0for0, *linkptrfor0;
2780 long long int *lcountfor0;
2781 long long int firstlinkfor0;
2782 long long int *firstlijk,*li0,*lj0,*lk0,*lcol0;
2784 long long int *cpulist0;
2785 long long int numcpusinlist0,lcpu,itercpu,buffersize;
2786 long long int maxnumsize;
2789 set_maxnumsize(numcolumns,&maxnumsize);
2798 stderrfprintf(
"max cpus in a list=%lld\n",buffersize); fflush(stderr);
2799 if((cpulist0=(
long long int*)malloc(
sizeof(
long long int)*buffersize))==NULL){
2800 dualfprintf(
fail_file,
"can't allocate cpulist0\n");
2803 if((lcountfor0=(
long long int*)malloc(
sizeof(
long long int)*numprocs))==NULL){
2804 dualfprintf(
fail_file,
"can't allocate lcountfor0\n");
2807 if((firstlijk=(
long long int*)malloc(
sizeof(
long long int)*numprocs))==NULL){
2808 dualfprintf(
fail_file,
"can't allocate firstlijk\n");
2811 if((li0=(
long long int*)malloc(
sizeof(
long long int)*numprocs))==NULL){
2812 dualfprintf(
fail_file,
"can't allocate li0\n");
2815 if((lj0=(
long long int*)malloc(
sizeof(
long long int)*numprocs))==NULL){
2816 dualfprintf(
fail_file,
"can't allocate lj0\n");
2819 if((lk0=(
long long int*)malloc(
sizeof(
long long int)*numprocs))==NULL){
2820 dualfprintf(
fail_file,
"can't allocate lk0\n");
2823 if((lcol0=(
long long int*)malloc(
sizeof(
long long int)*numprocs))==NULL){
2824 dualfprintf(
fail_file,
"can't allocate lcol0\n");
2827 for(i=0;i<buffersize;i++){
2831 lcountfor0[
i]=firstlijk[
i]=li0[
i]=lj0[
i]=lk0[
i]=lcol0[
i]=0;
2845 for(itercpu=0;itercpu<
numprocs;itercpu++){ firstlijk[itercpu]=1; }
2861 pi=(i/(
long long int)N1);
2862 pj=(j/(
long long int)N2);
2863 pk=(k/(
long long int)N3);
2866 if(myid==pid) lcount++;
2871 cpulist0[numcpusinlist0++]=pid;
2877 dualfprintf(
fail_file,
"col!=0 col=%lld, so chunking bad: numcolumns=%d which=%d\n",col,numcolumns,which);
2891 if((gcount%(gcountmod(numcolumns))==0)||(gcount==(
long long int)
totalzones*(
long long int)numcolumns)){
2895 for(itercpu=0;itercpu<numcpusinlist0;itercpu++){
2896 lcpu=cpulist0[itercpu];
2897 if(lcountfor0[lcpu]>0){
2905 linkptrfor0=linkptr0for0=addlink(NULL);
2909 linkptrfor0=addlink(linkptrfor0);
2911 linkptrfor0->
cpu=lcpu;
2912 linkptrfor0->
num=lcountfor0[lcpu];
2913 linkptrfor0->
i=li0[lcpu];
2914 linkptrfor0->
j=lj0[lcpu];
2915 linkptrfor0->
k=lk0[lcpu];
2916 linkptrfor0->
col=lcol0[lcpu];
2927 dualfprintf(
fail_file,
"wtf: shoudn't be here. Maybe passed more CPUs to batch system (mpirun) than passed to code?\n");
2936 logfprintf(
"numcolumns=%d lcount=%lld\n",numcolumns,lcount);
2940 clinkptr=clinkptr0=addlink(NULL);
2941 clinkptr->
num=lcount;
2945 clinkptr=addlink(clinkptr);
2946 clinkptr->
num=lcount;
2959 struct blink * addlink(
struct blink * clinkptr)
2963 pb=(
struct blink *)malloc(
sizeof(
struct blink));
2966 if(clinkptr!=NULL) clinkptr->
np=pb;