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;