HARM
harm and utilities
 All Data Structures Files Functions Variables Typedefs Macros Pages
restart.c
Go to the documentation of this file.
1 
8 #include "decs.h"
9 
10 #include "restart.h"
11 
12 
13 static int restart_process_extra_variables(void);
14 
15 static int restartupperpole_set(void);
16 
17 
18 int extrarestartfunction_new(void)
19 {
20  // nothing new to do
21  return(0);
22 }
23 
24 
29 int restart_init(int which)
30 {
31 
32 
33 
34  trifprintf("begin restart init\n");
35 
37  //
38  // set random seed
39  //
41  ranc(1,0);
42 
44  //
45  // get restart header and grid data
46  //
48  restart_read(which);
49 
50 
52  //
53  // set any extra things (only used with restart.rebeccaoldcode.c)
54  //
56  trifprintf("before extrarestartfunction()\n");
58 
59 
61  //
62  // get restart old metric
63  //
65  if(DOEVOLVEMETRIC){
66  trifprintf("before restartmetric_read(which)\n");
67  restartmetric_read(which);
68  }
69 
71  //
72  // process variables not written to file
73  //
75  trifprintf("before restart_process_extra_variables()\n");
76  restart_process_extra_variables();
77 
78 
80  //
81  // set all CPUs to have same restart header stuff (needed in mpicombine==1 mode)
82  //
84  trifprintf("before restart_read_defs()\n");
85  restart_read_defs();
86 
88  //
89  // set coordinate parameters by reading coordparms.dat
90  // assumes doesn't overwrite what just set (i.e. what's written to restart file)
91  //
93  trifprintf("before read_coord_parms()\n");
95 
97  //
98  // write header to screen to all CPUs
99  //
101  trifprintf("before write_restart_header(TEXTOUTPUT,log_file)\n");
102  logfprintf("header contents below\n");
104 
106  //
107  // check if failed inside rdump file
108  //
110  if(failed!=0){
111  dualfprintf(log_file,"WARNING: failed=%d in rdump file. Must clense the way between us.\n",failed);
112  dualfprintf(log_file,"Setting failed=0\n");
113  failed=0;
114  }
115 
116  // certain global.h parameters may override restart parameters. This happens, say, when the user decides not to DOAVG after restart, but DOAVGDIAG is still set. Without this the code will segfault in diag.c
117  // corresponds to "if" statements in initbase.c as well, where user has either choice or no choice.
118  if(DOAVG==0) DOAVGDIAG=0;
119 
120 
121 
123  //
124  // test read by looking at written file
125  //
127  trifprintf("before restart_write(3)\n");
128  restart_write(3);
129 
130  // can't check (e.g.) images here if wanting to look at conserved quantities
131 
132  trifprintf("proc: %d t=%21.15g failed=%d\n", myid, t, failed);
133 
134 
135  // very basic checks on primary grid-based quantities read from restart dump
136  restart_init_simple_checks(1);
137 
138 
139  trifprintf("end restart_init\n");
140 
141 
142  return(0);
143 
144 }
145 
146 
147 
148 
149 
150 
151 
155 int restart_process_extra_variables(void)
156 {
157  int i,j,k;
158 
159  // if evolving entropy need to reset primitive to avoid error checks detecting problem
160  if(DOENTROPY!=DONOENTROPY){
161  FULLLOOP GLOBALMACP0A1(pglobal,i,j,k,ENTROPY) = GLOBALMACP0A1(pglobal,i,j,k,UU);
162  }
163 
164 
165  return(0);
166 
167 }
168 
169 
170 
171 int restart_write(long dump_cnt)
172 {
173  MPI_Datatype datatype;
174  int whichdump;
175  char fileprefix[MAXFILENAME]={'\0'};
176  char filesuffix[MAXFILENAME]={'\0'};
177  char fileformat[MAXFILENAME]={'\0'};
178  long truedump_cnt;
179 
180 
181  // get special upperpole restart header and grid data (do inside restart_read() since always want this file with standard restart file)
182  if(FLUXB==FLUXCTSTAG && special3dspc==1 && N3>1) restartupperpole_write(dump_cnt);
183 
184 
185 
186  trifprintf("begin dumping rdump# %ld ... ",dump_cnt);
187 
188  whichdump=RESTARTDUMPTYPE;
189  datatype=MPI_FTYPE;
190  strcpy(fileprefix,"dumps/rdump");
191  if(dump_cnt>=0) {
192  strcpy(fileformat,"-%01ld"); // very quick restart
193  truedump_cnt=dump_cnt;
194  }
195  else {
196  strcpy(fileformat,"--%04ld"); // assumed at some longer cycle and never overwritten .. must rename this to normal format to use as real rdump.
197  truedump_cnt=-dump_cnt-1;
198  }
199  strcpy(filesuffix,"");
200 
201  if(dump_gen(WRITEFILE,truedump_cnt,binaryoutput,whichdump,datatype,fileprefix,fileformat,filesuffix,write_restart_header,rdump_content)>=1) return(1);
202 
203  trifprintf("end dumping rdump# %ld ... ",dump_cnt);
204 
205 
206  return(0);
207 
208 }
209 
210 
211 
213 void set_rdump_content_dnumcolumns_dnumversion(int *numcolumns, int *numversion)
214 {
215 
216  // always NPR
217  //*numcolumns=NPR*2; // primitives and conservatives
218  //*numcolumns=NPR; // primitives only
219 
220 
221  // spatial debug counters not crucial
222  // *numcolumns=NPR*2 + dnumcolumns[VPOTDUMPTYPE] + dnumcolumns[FAILFLOORDUDUMPTYPE] + dnumcolumns[DEBUGDUMPTYPE] ;
223 
224  *numcolumns=NPR*2 + dnumcolumns[DISSDUMPTYPE] + dnumcolumns[FAILFLOORDUDUMPTYPE] ;
225 
226 
228  // even with TRACKVPOT, with vpot as diagnostic, don't regenerate vpot from B, so need to store in restart file so can continue updating it.s
229  *numcolumns += dnumcolumns[VPOTDUMPTYPE];
230  }
231 
232  *numversion=1;
233 }
234 
235 
238 int rdump_content(int i, int j, int k, MPI_Datatype datatype,void *writebuf)
239 {
240 
241  // ensure what is written (even at t=0) for fake entropy primitive is just internal energy, as assumed through-out evolution.
242  if(ENTROPY>=0){
243  GLOBALMACP0A1(pglobal,i,j,k,ENTROPY)=GLOBALMACP0A1(pglobal,i,j,k,UU);
244  }
245 
246  // always NPR
247  myset(datatype,GLOBALMAC(pglobal,i,j,k),0,NPR,writebuf);
248  myset(datatype,GLOBALMAC(unewglobal,i,j,k),0,NPR,writebuf);
249 
250  // NOTEMARK: see also dump.c
251 
253  if(dnumcolumns[VPOTDUMPTYPE]>0){
254  int jj;
255  for(jj=0;jj<dnumcolumns[VPOTDUMPTYPE];jj++){
256  myset(datatype,&GLOBALMACP1A0(vpotarraydump,jj,i,j,k),0,1,writebuf); // 1 each
257  }
258  }
259  }
260 
261  if(dnumcolumns[DISSDUMPTYPE]>0){
262  myset(datatype,&GLOBALMAC(dissfunpos,i,j,k),0,dnumcolumns[DISSDUMPTYPE],writebuf);
263  }
264 
265 
266  if(dnumcolumns[FAILFLOORDUDUMPTYPE]>0){
267  myset(datatype,GLOBALMAC(failfloordu,i,j,k),0,dnumcolumns[FAILFLOORDUDUMPTYPE],writebuf);
268  }
269 
270  // too many of these and not crucial since just counters
271  // if(dnumcolumns[DEBUGDUMPTYPE]>0){
272  // myset(datatype,GLOBALMAC(failfloorcount,i,j,k),0,dnumcolumns[DEBUGDUMPTYPE],writebuf);
273  // }
274 
275 
276  return(0);
277 }
278 
279 
280 
281 
282 
283 
284 
285 
287 int restart_read(long dump_cnt)
288 {
289  MPI_Datatype datatype;
290  int whichdump;
291  char fileprefix[MAXFILENAME]={'\0'};
292  char filesuffix[MAXFILENAME]={'\0'};
293  char fileformat[MAXFILENAME]={'\0'};
294  int bintxt;
295 
296 
297  // get special upperpole restart header and grid data (do inside restart_read() since always want this file with standard restart file)
298  if(FLUXB==FLUXCTSTAG && special3dspc==1 && N3>1) restartupperpole_read(dump_cnt);
299  else restartupperpole_set();
300 
301 
302  trifprintf("begin reading rdump# %ld ... ",dump_cnt);
303 
304  whichdump=RESTARTDUMPTYPE;
305  datatype=MPI_FTYPE;
306  bintxt=binaryoutput;
307  strcpy(fileprefix,"dumps/rdump");
308  strcpy(fileformat,"-%01ld");
309  strcpy(filesuffix,"");
310 
311  int failreturn;
312  failreturn=dump_gen(READFILE,dump_cnt,bintxt,whichdump,datatype,fileprefix,fileformat,filesuffix,read_restart_header,rdump_read_content);
313 
314  if(failreturn==FILENOTFOUND){
315  dualfprintf(fail_file,"restart file not found\n");
316  myexit(87343363);
317  }
318  else if(failreturn>0){
319  dualfprintf(fail_file,"restart file: other read error\n");
320  myexit(7165766);
321  }
322 
323 
324 
325  // NOTE: for FLUXB==FLUXCTSTAG, unewglobal and vpot are bounded in initbase.c for boundary edges and inter-MPI edges
326 
327  trifprintf("end reading rdump# %ld ... ",dump_cnt);
328 
329 
330  return(0);
331 
332 }
333 
334 
336 int rdump_read_content(int i, int j, int k, MPI_Datatype datatype,void *writebuf)
337 {
338 
339  // always NPR
340  myget(datatype,GLOBALMAC(pglobal,i,j,k),0,NPR,writebuf);
341  myget(datatype,GLOBALMAC(unewglobal,i,j,k),0,NPR,writebuf);
342 
343  // NOTEMARK: see also dump.c
344 
346  if(dnumcolumns[VPOTDUMPTYPE]>0){
347  int jj;
348  for(jj=0;jj<dnumcolumns[VPOTDUMPTYPE];jj++){
349  myget(datatype,&GLOBALMACP1A0(vpotarraydump,jj,i,j,k),0,1,writebuf); // 1 each
350  }
351  }
352  }
353 
354  if(dnumcolumns[DISSDUMPTYPE]>0){
355  myget(datatype,&GLOBALMAC(dissfunpos,i,j,k),0,dnumcolumns[DISSDUMPTYPE],writebuf);
356  }
357 
358 
359  if(dnumcolumns[FAILFLOORDUDUMPTYPE]>0){
360  myget(datatype,GLOBALMAC(failfloordu,i,j,k),0,dnumcolumns[FAILFLOORDUDUMPTYPE],writebuf);
361  }
362 
363  // counters not crucial
364  // if(dnumcolumns[DEBUGDUMPTYPE]>0){
365  // myget(datatype,GLOBALMAC(failfloorcount,i,j,k),0,dnumcolumns[DEBUGDUMPTYPE],writebuf);
366  // }
367 
368 
369 
370 
371  return(0);
372 }
373 
374 
375 
376 
377 
378 
379 
380 
381 
382 
383 
390 int restartupperpole_read(long dump_cnt)
391 {
392  MPI_Datatype datatype;
393  int whichdump;
394  char fileprefix[MAXFILENAME]={'\0'};
395  char filesuffix[MAXFILENAME]={'\0'};
396  char fileformat[MAXFILENAME]={'\0'};
397  int bintxt;
398  int restartupperpole_set(void);
399 
400 
401  trifprintf("begin reading rdumpupperpole# %ld ... ",dump_cnt);
402 
403  whichdump=RESTARTUPPERPOLEDUMPTYPE;
404  datatype=MPI_FTYPE;
405  bintxt=binaryoutput;
406  strcpy(fileprefix,"dumps/rdumpupperpole");
407  strcpy(fileformat,"-%01ld");
408  strcpy(filesuffix,"");
409 
410  int failreturn;
411  failreturn=dump_gen(READFILE,dump_cnt,bintxt,whichdump,datatype,fileprefix,fileformat,filesuffix,read_restartupperpole_header,rupperpoledump_read_content);
412 
413  if(failreturn==FILENOTFOUND){
414  dualfprintf(fail_file,"SUPERWARNING: resetting upperpole to zero since no restart file for upperpole is available\n");
415  restartupperpole_set();
416  }
417  else if(failreturn>0) return(1);
418 
419 
420 
421 #if(0)
422  // NOT USED ANYMORE, but, if did remapping, it would look something like the below.
423  {
424  // SPECIAL CASE:
425  // now that have read-in shifted values, must assign them to correct locations
426 
427  int i,j,k,pliter,pl;
428  jshifted=j+SHIFT2;
429  LOOPF1 LOOPF3{
430  PLOOP(pliter,pl){
431  // if(pl==B1 || pl==B2 || pl==B3){
432  if(pl==B2){
433  GLOBALMACP0A1(unewglobal,i,jshifted-SHIFT2,k,pl)=GLOBALMACP0A1(unewglobal,i,jshifted,k,pl);
434  }
435  }
436  }
437  }
438 #endif
439 
440 
441  trifprintf("end reading rdumpupperpole# %ld ... ",dump_cnt);
442 
443 
444  return(0);
445 
446 }
447 
448 
449 
450 
452 static int restartupperpole_set(void)
453 {
454 
455  if(mycpupos[2]==ncpux2-1){// only need to operate on true upper pole
456  // then assume user knows what they are doing and just set array to zero
457  int i,j,k,jshifted;
458  DUMPGENLOOP{ // same loop as dump_gen() uses
459  if(j!=N2-1) continue; // force only assignment right at j==N2 so still doesn't matter what order the normal and upperpole restart calls are made
460  jshifted=j+SHIFT2;
461  GLOBALMACP0A1(unewglobal,i,jshifted,k,B2)=0.0;
462 
464  if(dnumcolumns[VPOTDUMPTYPE]>0){
465  int jj;
466  for(jj=0;jj<dnumcolumns[VPOTDUMPTYPE];jj++){
467  if(jj==2) continue; // skip A_2 that is not on pole, so not needed
468  GLOBALMACP1A0(vpotarraydump,jj,i,jshifted,k)=0.0;
469  }
470  }
471  }
472  }// end FULLLOOP
473  }// end if true upper pole
474 
475  return(0);
476 }
477 
478 
480 int read_restartupperpole_header(int whichdump, int whichdumpversion, int numcolumns, int bintxt, FILE *headerptr)
481 {
482 
483  if(bintxt==BINARYOUTPUT){
484  }
485  else{
486  // nothing so far, but must have new line if not NULL function
487  fprintf(headerptr,"\n");
488  fflush(headerptr);
489  }
490 
491  return(0);
492 }
493 
495 int write_restartupperpole_header(int whichdump, int whichdumpversion, int numcolumns, int bintxt, FILE *headerptr)
496 {
497 
498  if(bintxt==BINARYOUTPUT){
499  }
500  else{
501  // nothing so far, but must have new line if not NULL function
502  fprintf(headerptr,"\n");
503  fflush(headerptr);
504  }
505 
506  return(0);
507 }
508 
509 
511 int rupperpoledump_read_content(int i, int j, int k, MPI_Datatype datatype,void *writebuf)
512 {
513 
514  int jshifted;
515 
516  // j+SHIFT2 so that fake 3D read-in fills j=N2 for mycpupos[2]==ncpux2-1 (tj=totalsize[2]) when MPI routines think they are accessing j=N2-SHIFT2
517  jshifted=j+SHIFT2;
518 
519  // Just B2 is on pole
520  myget(datatype,GLOBALMAC(unewglobal,i,jshifted,k),B2,1,writebuf);
521 
522  // NOTEMARK: see also dump.c
524  if(dnumcolumns[VPOTDUMPTYPE]>0){
525  int jj;
526  for(jj=0;jj<dnumcolumns[VPOTDUMPTYPE];jj++){
527  if(jj==2) continue; // skip A_2 that is not on pole, so not needed
528  myget(datatype,&GLOBALMACP1A0(vpotarraydump,jj,i,jshifted,k),0,1,writebuf); // 1 each
529  }
530  }
531  }
532 
533 
534 
535  return(0);
536 }
537 
538 
539 
540 
541 
543 int restartupperpole_write(long dump_cnt)
544 {
545  MPI_Datatype datatype;
546  int whichdump;
547  char fileprefix[MAXFILENAME]={'\0'};
548  char filesuffix[MAXFILENAME]={'\0'};
549  char fileformat[MAXFILENAME]={'\0'};
550  long truedump_cnt;
551 
552  trifprintf("begin dumping rdumpupperpole# %ld ... ",dump_cnt);
553 
554  whichdump=RESTARTUPPERPOLEDUMPTYPE;
555  datatype=MPI_FTYPE;
556  strcpy(fileprefix,"dumps/rdumpupperpole");
557  if(dump_cnt>=0) {
558  strcpy(fileformat,"-%01ld"); // very quick restart
559  truedump_cnt=dump_cnt;
560  }
561  else {
562  strcpy(fileformat,"--%04ld"); // assumed at some longer cycle and never overwritten .. must rename this to normal format to use as real rdump.
563  truedump_cnt=-dump_cnt-1;
564  }
565  strcpy(filesuffix,"");
566 
567  if(dump_gen(WRITEFILE,truedump_cnt,binaryoutput,whichdump,datatype,fileprefix,fileformat,filesuffix,write_restartupperpole_header,rupperpoledump_content)>=1) return(1);
568 
569  trifprintf("end dumping rdumpupperpole# %ld ... ",dump_cnt);
570 
571 
572  return(0);
573 
574 }
575 
576 
577 
578 
581 void set_rupperpoledump_read_content_dnumcolumns_dnumversion(int *numcolumns, int *numversion)
582 {
583 
584  // Just B2 is on pole
585  *numcolumns=1;
586 
587 
589  // even with TRACKVPOT, with vpot as diagnostic, don't regenerate vpot from B, so need to store in restart file so can continue updating it.s
590  *numcolumns += NDIM-1; // only A_0, A_1, and A_3 are on pole
591  }
592 
593  *numversion=0;
594 }
595 
597 void set_rupperpoledump_content_dnumcolumns_dnumversion(int *numcolumns, int *numversion)
598 {
599  extern void set_rupperpoledump_read_content_dnumcolumns_dnumversion(int *numcolumns, int *numversion);
600 
601  // same as read:
602  set_rupperpoledump_read_content_dnumcolumns_dnumversion(numcolumns,numversion);
603 
604 }
605 
606 
607 
609 int rupperpoledump_content(int i, int j, int k, MPI_Datatype datatype,void *writebuf)
610 {
611 
612  int jshifted;
613 
614  // j+SHIFT2 so that fake 3D read-in fills j=N2 for mycpupos[2]==ncpux2-1 (tj=totalsize[2]) when MPI routines think they are accessing j=N2-SHIFT2
615  jshifted=j+SHIFT2;
616 
617  // Only B2 is on pole
618  myset(datatype,GLOBALMAC(unewglobal,i,jshifted,k),B2,1,writebuf);
619 
620  // NOTEMARK: see also dump.c
622  if(dnumcolumns[VPOTDUMPTYPE]>0){
623  int jj;
624  for(jj=0;jj<dnumcolumns[VPOTDUMPTYPE];jj++){
625  if(jj==2) continue; // skip A_2 that is not on pole, so not needed
626  myset(datatype,&GLOBALMACP1A0(vpotarraydump,jj,i,jshifted,k),0,1,writebuf); // 1 each
627  }
628  }
629  }
630 
631 
632  return(0);
633 }
634 
635 
636 
637 
638 
639 
640 
641 
642 
643 
644 
645 
646 
647 
648 
649 
650 
651 
652 
655 int restartmetric_write(long dump_cnt)
656 {
657  MPI_Datatype datatype;
658  int whichdump;
659  char fileprefix[MAXFILENAME]={'\0'};
660  char filesuffix[MAXFILENAME]={'\0'};
661  char fileformat[MAXFILENAME]={'\0'};
662  long truedump_cnt;
663 
664  trifprintf("begin dumping rmetricdump# %ld ... ",dump_cnt);
665 
666  whichdump=RESTARTMETRICDUMPTYPE;
667  datatype=MPI_FTYPE;
668  strcpy(fileprefix,"dumps/rmetricdump");
669  if(dump_cnt>=0) {
670  strcpy(fileformat,"-%01ld"); // very quick restart
671  truedump_cnt=dump_cnt;
672  }
673  else {
674  strcpy(fileformat,"--%04ld"); // assumed at some longer cycle and never overwritten .. must rename this to normal format to use as real rdump.
675  truedump_cnt=-dump_cnt-1;
676  }
677  strcpy(filesuffix,"");
678 
679 
680  if(dump_gen(WRITEFILE,truedump_cnt,binaryoutput,whichdump,datatype,fileprefix,fileformat,filesuffix,write_restartmetric_header,rmetricdump_content)>=1) return(1);
681 
682  trifprintf("end dumping rmetricdump# %ld ... ",dump_cnt);
683 
684 
685  return(0);
686 
687 }
688 
689 
690 void set_rmetricdump_content_dnumcolumns_dnumversion(int *numcolumns, int *numversion)
691 {
692  extern void set_rmetricdump_read_content_dnumcolumns_dnumversion(int *numcolumns, int *numversion);
693 
694  // same as read:
695  set_rmetricdump_read_content_dnumcolumns_dnumversion(numcolumns,numversion);
696 
697 }
698 
699 
701 int rmetricdump_content(int i, int j, int k, MPI_Datatype datatype,void *writebuf)
702 {
703  int gridpos;
704  struct of_compgeom *tempcompgeom;
705  FTYPE generalmatrixlower[NDIM][NDIM];
706  FTYPE generalmatrixupper[NDIM][NDIM];
707  int jj,kk;
708 
709 
710  GRIDLOOP(gridpos){ // note that in older code gridpos was quickest index! Now slowest compared to matrix indices
711 
712 #if(NEWMETRICSTORAGE)
713 
714  tempcompgeom = &GLOBALMETMACP1A0(compgeomlast,gridpos,i,j,k);
715 
716 
717  DLOOP(jj,kk){
718  generalmatrixlower[jj][kk]=tempcompgeom->gcov[GIND(jj,kk)];
719  generalmatrixupper[jj][kk]=tempcompgeom->gcon[GIND(jj,kk)];
720  }
721 
722  myset(datatype,generalmatrixlower,0,NDIM*NDIM,writebuf);
723  myset(datatype,generalmatrixupper,0,NDIM*NDIM,writebuf);
724  myset(datatype,tempcompgeom->gcovpert,0,NDIM,writebuf);
725  myset(datatype,&(tempcompgeom->gdet),0,1,writebuf);
726 #if(WHICHEOM!=WITHGDET)
727  myset(datatype,&(tempcompgeom->EOMFUNCMAC(0)),0,NPR,writebuf);
728  myset(datatype,&(tempcompgeom->IEOMFUNCNOSINGMAC(0)),0,NPR,writebuf);
729 #endif
730 #if(GDETVOLDIFF)
731  myset(datatype,&(tempcompgeom->gdetvol),0,1,writebuf);
732 #endif
733  myset(datatype,&(tempcompgeom->igdetnosing),0,1,writebuf);
734  myset(datatype,&(tempcompgeom->alphalapse),0,1,writebuf);
735  myset(datatype,&(tempcompgeom->betasqoalphasq),0,1,writebuf);
736  myset(datatype,&(tempcompgeom->beta),0,NDIM,writebuf);
737 
738 #else
739 
740  DLOOP(jj,kk){
741  generalmatrixlower[jj][kk]=GLOBALMETMACP1A1(gcovlast,gridpos,i,j,k,GIND(jj,kk));
742  }
743 
744  myset(datatype,generalmatrixlower,0,NDIM*NDIM,writebuf);
745  myset(datatype,GLOBALMETMACP1A0(gcovpertlast,gridpos,i,j,k),0,NDIM,writebuf);
746  myset(datatype,&(GLOBALMETMACP1A0(alphalapselast,gridpos,i,j,k)),0,1,writebuf);
747 
748 #endif
749 
750  }// end over gridpos
751 
752 
753  return(0);
754 }
755 
756 
757 
758 
759 
760 
761 
762 int write_restartmetric_header(int whichdump, int whichdumpversion, int numcolumns, int bintxt, FILE *headerptr)
763 {
764 
765  if(bintxt==BINARYOUTPUT){
766  }
767  else{
768  // nothing so far, but must have new line if not NULL function
769  fprintf(headerptr,"\n");
770  fflush(headerptr);
771  }
772 
773  return(0);
774 }
775 
776 int read_restartmetric_header(int whichdump, int whichdumpversion, int numcolumns, int bintxt, FILE *headerptr)
777 {
778 
779  if(bintxt==BINARYOUTPUT){
780  }
781  else{
782  // nothing so far, but must have new line if not NULL function
783  fprintf(headerptr,"\n");
784  fflush(headerptr);
785  }
786 
787  return(0);
788 }
789 
790 
791 int restartmetric_read(long dump_cnt)
792 {
793  MPI_Datatype datatype;
794  int whichdump;
795  char fileprefix[MAXFILENAME]={'\0'};
796  char filesuffix[MAXFILENAME]={'\0'};
797  char fileformat[MAXFILENAME]={'\0'};
798  int bintxt;
799 
800 
801  trifprintf("begin reading rmetricdump# %ld ... ",dump_cnt);
802 
803  dualfprintf(fail_file,"Reading in old metric, but so far need to bound somehow since no BCs but needed!\n");
804  myexit(2496736);
805 
806  whichdump=RESTARTMETRICDUMPTYPE;
807  datatype=MPI_FTYPE;
808  bintxt=binaryoutput;
809  strcpy(fileprefix,"dumps/rmetricdump");
810  strcpy(fileformat,"-%01ld");
811  strcpy(filesuffix,"");
812 
813  int failreturn;
814  failreturn=dump_gen(READFILE,dump_cnt,bintxt,whichdump,datatype,fileprefix,fileformat,filesuffix,read_restartmetric_header,rmetricdump_read_content);
815 
816  if(failreturn==FILENOTFOUND){
817  dualfprintf(fail_file,"restartmetric file not found\n");
818  myexit(26525667);
819  }
820  else if(failreturn>0){
821  dualfprintf(fail_file,"restartmetric file: other read error\n");
822  myexit(71857346);
823  }
824 
825 
826 
827 
828 
829  trifprintf("end reading rmetricdump# %ld ... ",dump_cnt);
830 
831 
832  return(0);
833 
834 }
835 
836 
837 
839 void set_rmetricdump_read_content_dnumcolumns_dnumversion(int *numcolumns, int *numversion)
840 {
841 
842 
843  if(DOEVOLVEMETRIC){
844 #if(NEWMETRICSTORAGE)
845  *numcolumns=NPG*(NDIM*NDIM + NDIM*NDIM + NDIM + 1 + 1 + 1 + 1 + NDIM); // See restart.c's rmetricdump_content()
846 #if(WHICHEOM!=WITHGDET)
847  *numcolumns+=NPG*(2*NPR);
848 #endif
849 #if(GDETVOLDIFF)
850  *numcolumns+=NPG*(1);
851 #endif
852 
853 #else
854  *numcolumns=NPG*(NDIM*NDIM+NDIM+1); // See restart.c's rmetricdump_content()
855 #endif
856  }
857  else{
858  *numcolumns=0;
859  }
860 
861  *numversion=0;
862 
863 
864 }
865 
867 int rmetricdump_read_content(int i, int j, int k, MPI_Datatype datatype,void *writebuf)
868 {
869  int gridpos;
870  struct of_compgeom *tempcompgeom;
871  FTYPE generalmatrixlower[NDIM][NDIM];
872  FTYPE generalmatrixupper[NDIM][NDIM];
873  int jj,kk;
874 
875 
876  GRIDLOOP(gridpos){ // note that in older code gridpos was quickest index! Now slowest compared to matrix indices
877 
878 #if(NEWMETRICSTORAGE)
879 
880  tempcompgeom = &GLOBALMETMACP1A0(compgeomlast,gridpos,i,j,k);
881 
882  myget(datatype,generalmatrixlower,0,NDIM*NDIM,writebuf);
883  myget(datatype,generalmatrixupper,0,NDIM*NDIM,writebuf);
884  myget(datatype,tempcompgeom->gcovpert,0,NDIM,writebuf);
885  myget(datatype,&(tempcompgeom->gdet),0,1,writebuf);
886 #if(WHICHEOM!=WITHGDET)
887  myget(datatype,&(tempcompgeom->EOMFUNCMAC(0)),0,NPR,writebuf);
888  myget(datatype,&(tempcompgeom->IEOMFUNCNOSINGMAC(0)),0,NPR,writebuf);
889 #endif
890 #if(GDETVOLDIFF)
891  myget(datatype,&(tempcompgeom->gdetvol),0,1,writebuf);
892 #endif
893  myget(datatype,&(tempcompgeom->igdetnosing),0,1,writebuf);
894  myget(datatype,&(tempcompgeom->alphalapse),0,1,writebuf);
895  myget(datatype,&(tempcompgeom->betasqoalphasq),0,1,writebuf);
896  myget(datatype,&(tempcompgeom->beta),0,NDIM,writebuf);
897 
898  // assign
899  DLOOP(jj,kk){
900  tempcompgeom->gcov[GIND(jj,kk)]=generalmatrixlower[jj][kk];
901  tempcompgeom->gcon[GIND(jj,kk)]=generalmatrixupper[jj][kk];
902  }
903 
904 #else
905 
906  myget(datatype,generalmatrixlower,0,NDIM*NDIM,writebuf);
907  myget(datatype,GLOBALMETMACP1A0(gcovpertlast,gridpos,i,j,k),0,NDIM,writebuf);
908  myget(datatype,&(GLOBALMETMACP1A0(alphalapselast,gridpos,i,j,k)),0,1,writebuf);
909 
910  // assign
911  DLOOP(jj,kk){
912  GLOBALMETMACP1A1(gcovlast,gridpos,i,j,k,GIND(jj,kk))=generalmatrixlower[jj][kk];
913  }
914 #endif
915 
916  }// end over gridpos
917 
918 
919  return(0);
920 
921 
922 
923 }
924 
925 
926 
927 
928 
929 
930 
931 
932 
933 
934 
935 
936 
937 
939 int bcast_restart_header(void)
940 {
941  int readwrite_restart_header(int readwrite, int bintxt, int bcasthead, FILE*headerptr);
942  int bcasthead;
943 
944  bcasthead=1;
945 
946  // 0 and NULL not used
947  readwrite_restart_header(NOTHINGHEAD, 0, bcasthead, NULL);
948 
949  return(0);
950 }
951 
952 
954 int read_restart_header_new(int whichdump, int whichdumpversion, int numcolumns, int bintxt, FILE*headerptr)
955 {
956  int readwrite_restart_header(int readwrite, int bintxt, int bcasthead, FILE*headerptr);
957  int bcasthead;
958 
959  bcasthead=0;
960 
961  readwrite_restart_header(READHEAD, bintxt, bcasthead, headerptr);
962 
963  return(0);
964 }
965 
966 
967 
968 int write_restart_header_new(int whichdump, int whichdumpversion, int numcolumns, int bintxt,FILE*headerptr)
969 {
970  int readwrite_restart_header(int readwrite, int bintxt, int bcasthead, FILE*headerptr);
971  int bcasthead;
972 
973  bcasthead=0;
974 
975  readwrite_restart_header(WRITEHEAD, bintxt, bcasthead, headerptr);
976 
977  return(0);
978 }
979 
980 
981 
985 int readwrite_restart_header(int readwrite, int bintxt, int bcasthead, FILE*headerptr)
986 {
987  int ii;
988  int k,dir,pl;
989  int enerregion, floor, tscale;
990  int idum1,idum2,idum3;
991  int dissloop;
992  int dtloop;
993  char headerone[MAXFILENAME];
994  char sheaderone[MAXFILENAME];
995  char ctypeheaderone[MAXFILENAME];
996 
997 
998  if(readwrite==READHEAD) trifprintf("begin reading header of restart file\n");
999  else if(readwrite==WRITEHEAD) trifprintf("begin writing header of restart file\n");
1000 
1001 
1002  // setup idum1,2,3 so read and write are processed same way
1003  if(readwrite==WRITEHEAD){
1004  idum1=totalsize[1];
1005  idum2=totalsize[2];
1006  idum3=totalsize[3];
1007  }
1008 
1009 
1010  if(readwrite==READHEAD){
1011  sprintf(headerone,"%s",HEADERONEIN);
1012  sprintf(sheaderone,"%s",SFTYPEHEADERONEIN);
1013  sprintf(ctypeheaderone,"%s",CTYPEHEADERONEIN);
1014  }
1015  else if(readwrite==WRITEHEAD){
1016  sprintf(headerone,"%s",HEADERONEOUT);
1017  sprintf(sheaderone,"%s",SFTYPEHEADERONEOUT);
1018  sprintf(ctypeheaderone,"%s",CTYPEHEADERONEOUT);
1019  }
1020 
1021 
1023  //
1024  // START HEADER read/write list
1025  //
1027  int headercount=0;
1028 
1029  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&idum1,sizeof(int),"%d",1,MPI_INT,headerptr);
1030  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&idum2,sizeof(int),"%d",1,MPI_INT,headerptr);
1031  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&idum3,sizeof(int),"%d",1,MPI_INT,headerptr); // 3D thing
1032 
1033  // all cpus read the rest of header the same
1034  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&t, sizeof(SFTYPE), headerone, 1, MPI_SFTYPE, headerptr);
1035  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&tf, sizeof(SFTYPE), sheaderone, 1, MPI_SFTYPE, headerptr);
1036  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&nstep, sizeof(long), "%ld", 1, MPI_LONG, headerptr);
1037  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&a, sizeof(SFTYPE), sheaderone, 1, MPI_SFTYPE, headerptr);
1038  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&MBH, sizeof(SFTYPE), sheaderone, 1, MPI_SFTYPE, headerptr);
1039  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&QBH, sizeof(SFTYPE), sheaderone, 1, MPI_SFTYPE, headerptr);
1040  if(readwrite!=READHEAD||1){
1041  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&EP3, sizeof(SFTYPE), sheaderone, 1, MPI_SFTYPE, headerptr);
1042  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&THETAROT, sizeof(SFTYPE), sheaderone, 1, MPI_SFTYPE, headerptr);
1043  }
1044  else{
1045  EP3=0.0;
1046 
1047  // radians
1048  THETAROT=1.5708; // as if restarted with this set
1049  }
1050 
1051  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&gam, sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1052  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&gamideal, sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1053  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&cour, sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1054 
1055 
1056  // for metric evolution
1057  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&Xmetricold, sizeof(FTYPE), headerone, NDIM, MPI_FTYPE, headerptr);
1058  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&Xmetricnew, sizeof(FTYPE), headerone, NDIM, MPI_FTYPE, headerptr);
1059 
1060 
1061  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&dt, sizeof(SFTYPE), sheaderone, 1, MPI_SFTYPE, headerptr);
1062  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&lim[1], sizeof(int), "%d", 1, MPI_INT, headerptr);
1063  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&lim[2], sizeof(int), "%d", 1, MPI_INT, headerptr);
1064  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&lim[3], sizeof(int), "%d", 1, MPI_INT, headerptr);
1065  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&TIMEORDER, sizeof(int), "%d", 1, MPI_INT, headerptr);
1066  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,fluxmethod, sizeof(int), "%d", NPR, MPI_INT, headerptr);
1067  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&FLUXB, sizeof(int), "%d", 1, MPI_INT, headerptr);
1068  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&UTOPRIMVERSION, sizeof(int), "%d", 1, MPI_INT, headerptr);
1069  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&failed, sizeof(int), "%d", 1, MPI_INT, headerptr);
1070 
1071  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&defcoord, sizeof(int), "%d", 1, MPI_INT, headerptr);
1072  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&R0, sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1073  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&Rin, sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1074  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&Rout, sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1075  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&hslope, sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1076  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&Zin, sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1077  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&Zout, sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1078  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&Rin_array, sizeof(FTYPE), headerone, NDIM, MPI_FTYPE, headerptr);
1079  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&Rout_array, sizeof(FTYPE), headerone, NDIM, MPI_FTYPE, headerptr);
1080 
1081  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&BCtype[0],sizeof(int), "%d", COMPDIM*2, MPI_INT, headerptr);
1082 
1083  // new May 6, 2003
1084  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&realnstep, sizeof(long), "%ld", 1, MPI_LONG, headerptr);
1085  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&debugfail,sizeof(int), "%d", 1, MPI_INT, headerptr);
1086  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&whichrestart,sizeof(int), "%d", 1, MPI_INT, headerptr);
1087  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&cooling,sizeof(int), "%d", 1, MPI_INT, headerptr);
1088  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&restartsteps[0],sizeof(long), "%ld", 1, MPI_LONG, headerptr);
1089  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&restartsteps[1],sizeof(long), "%ld", 1, MPI_LONG, headerptr);
1090 
1091  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&GAMMIEDUMP,sizeof(int), "%d", 1, MPI_INT, headerptr);
1092  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&GAMMIEIMAGE,sizeof(int), "%d", 1, MPI_INT, headerptr);
1093  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&GAMMIEENER,sizeof(int), "%d", 1, MPI_INT, headerptr);
1094  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DODIAGS,sizeof(int), "%d", 1, MPI_INT, headerptr);
1095  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOENERDIAG,sizeof(int), "%d", 1, MPI_INT, headerptr);
1096  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOGDUMPDIAG,sizeof(int), "%d", 1, MPI_INT, headerptr);
1097  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DORDUMPDIAG,sizeof(int), "%d", 1, MPI_INT, headerptr);
1098  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DODUMPDIAG,sizeof(int), "%d", 1, MPI_INT, headerptr);
1099  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOAVGDIAG,sizeof(int), "%d", 1, MPI_INT, headerptr);
1100  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOIMAGEDIAG,sizeof(int), "%d", 1, MPI_INT, headerptr);
1101  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOAREAMAPDIAG,sizeof(int), "%d", 1, MPI_INT, headerptr);
1102 
1103  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DODIAGEVERYSUBSTEP,sizeof(int), "%d", 1, MPI_INT, headerptr);
1104  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOENODEBUGEVERYSUBSTEP,sizeof(int), "%d", 1, MPI_INT, headerptr);
1105  if(readwrite==READHEAD&&0){
1106  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOCOLSPLIT,sizeof(int), "%d", NUMDUMPTYPES-1, MPI_INT, headerptr);
1107  int l5,inputl5=NUMDUMPTYPES-2;
1108  for(l5=NUMDUMPTYPES-1;l5>=0;l5--){
1109  if(l5!=RESTARTUPPERPOLEDUMPTYPE){
1110  DOCOLSPLIT[l5]=DOCOLSPLIT[inputl5];
1111  inputl5--;
1112  }
1113  }
1114  }
1115  else headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOCOLSPLIT,sizeof(int), "%d", NUMDUMPTYPES, MPI_INT, headerptr);
1116 
1117 
1118  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&POSDEFMETRIC,sizeof(int), "%d", 1, MPI_INT, headerptr);
1119  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&periodicx1,sizeof(int), "%d", 1, MPI_INT, headerptr);
1120  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&periodicx2,sizeof(int), "%d", 1, MPI_INT, headerptr);
1121  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&periodicx3,sizeof(int), "%d", 1, MPI_INT, headerptr); // 3D thing
1122  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&dofull2pi,sizeof(int), "%d", 1, MPI_INT, headerptr); // 3D thing
1123  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&binaryoutput,sizeof(int), "%d", 1, MPI_INT, headerptr);
1124  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&sortedoutput,sizeof(int), "%d", 1, MPI_INT, headerptr);
1125  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&defcon,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1126  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&SAFE,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1127  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&RHOMIN,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1128  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&UUMIN,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1129  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&RHOMINLIMIT,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1130  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&UUMINLIMIT,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1131  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&UULIMIT,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1132  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&BSQORHOLIMIT,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1133  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&BSQOULIMIT,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1134  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&UORHOLIMIT,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1135  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&GAMMAMAX,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1136  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&GAMMADAMP,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1137  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&GAMMAFAIL,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1138  // end new May 6, 2003
1139 
1140  // reorganized order for DT related stuff
1141  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DTr, sizeof(long), "%ld", 1, MPI_LONG, headerptr);
1142  if(readwrite==READHEAD&&0){
1143  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DTdumpgen[0], sizeof(SFTYPE), sheaderone, NUMDUMPTYPES-1, MPI_SFTYPE, headerptr);
1144  int l5,inputl5=NUMDUMPTYPES-2;
1145  for(l5=NUMDUMPTYPES-1;l5>=0;l5--){
1146  if(l5!=RESTARTUPPERPOLEDUMPTYPE){
1147  DTdumpgen[l5]=DTdumpgen[inputl5];
1148  inputl5--;
1149  }
1150  }
1151  }
1152  else headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DTdumpgen[0], sizeof(SFTYPE), sheaderone, NUMDUMPTYPES, MPI_SFTYPE, headerptr);
1153  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&rdump_cnt, sizeof(long), "%ld", 1, MPI_LONG, headerptr);
1154  if(readwrite==READHEAD&&0){
1155  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&dumpcntgen[0], sizeof(long), "%ld", NUMDUMPTYPES-1, MPI_LONG, headerptr);
1156  int l5,inputl5=NUMDUMPTYPES-2;
1157  for(l5=NUMDUMPTYPES-1;l5>=0;l5--){
1158  if(l5!=RESTARTUPPERPOLEDUMPTYPE){
1159  dumpcntgen[l5]=dumpcntgen[inputl5];
1160  inputl5--;
1161  }
1162  }
1163  }
1164  else headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&dumpcntgen[0], sizeof(long), "%ld", NUMDUMPTYPES, MPI_LONG, headerptr);
1165 
1166 
1167 
1168  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&prMAX[0],sizeof(FTYPE), headerone, NPR, MPI_FTYPE,headerptr);
1169  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&prfloorcoef[0],sizeof(FTYPE), headerone, NPR, MPI_FTYPE,headerptr);
1170  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&rescaletype,sizeof(int), "%d", 1, MPI_INT,headerptr);
1171 
1172  // Nov 11, 2006 : post-Sasha-WENO code WENO stuff
1173  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&avgscheme[1],sizeof(int), "%d", 1, MPI_INT,headerptr);
1174  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&avgscheme[2],sizeof(int), "%d", 1, MPI_INT,headerptr);
1175  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&avgscheme[3],sizeof(int), "%d", 1, MPI_INT,headerptr);
1176  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&dofluxreconevolvepointfield,sizeof(int), "%d", 1, MPI_INT,headerptr);
1177 
1178  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&do_transverse_flux_integration[0],sizeof(int), "%d", NPR, MPI_INT,headerptr);
1179  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&do_source_integration[0],sizeof(int), "%d", NPR, MPI_INT,headerptr);
1180  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&do_conserved_integration[0],sizeof(int), "%d", NPR, MPI_INT,headerptr);
1181  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&INVERTFROMAVERAGEIFFAILED,sizeof(int), "%d", 1, MPI_INT,headerptr);
1182  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&LIMIT_AC_PRIM_FRAC_CHANGE,sizeof(int), "%d", 1, MPI_INT,headerptr);
1183  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&LIMIT_AC_FRAC_CHANGE,sizeof(int), "%d", 1, MPI_INT,headerptr);
1184  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&MAX_AC_PRIM_FRAC_CHANGE,sizeof(FTYPE), headerone, 1, MPI_FTYPE,headerptr);
1185  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&MAX_AC_FRAC_CHANGE,sizeof(FTYPE), headerone, 1, MPI_FTYPE,headerptr);
1186  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOENOFLUX,sizeof(int), "%d", 1, MPI_INT,headerptr);
1187  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&PARAMODWENO,sizeof(int), "%d", 1, MPI_INT,headerptr);
1188 
1189 
1190  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&CHECKCONT,sizeof(int), "%d", 1, MPI_INT,headerptr);
1191  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOTSTEPDIAG,sizeof(int), "%d", 1, MPI_INT,headerptr);
1192  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOLOGSTEP,sizeof(int), "%d", 1, MPI_INT,headerptr);
1193  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&DOLOGPERF,sizeof(int), "%d", 1, MPI_INT,headerptr);
1194  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&NDTCCHECK,sizeof(int), "%d", 1, MPI_INT,headerptr);
1195  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&NZCCHECK,sizeof(int), "%d", 1, MPI_INT,headerptr);
1196  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&NDTDOTCCHECK,sizeof(int), "%d", 1, MPI_INT,headerptr);
1197  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&NGOCHECK,sizeof(int), "%d", 1, MPI_INT,headerptr);
1198  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&NTIMECHECK,sizeof(int), "%d", 1, MPI_INT,headerptr);
1199  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&PERFWALLTIME,sizeof(FTYPE), headerone, 1, MPI_FTYPE,headerptr);
1200  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&ZCPSESTIMATE,sizeof(FTYPE), headerone, 1, MPI_FTYPE,headerptr);
1201 
1202 
1203  // new June 6, 2003 (cumulatives)
1204  // always NPR
1205  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&pcumreg_tot[0][0][0],sizeof(SFTYPE), sheaderone, NUMENERREGIONS*(COMPDIM*2)*NPR, MPI_SFTYPE,headerptr);
1206  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&fladdreg_tot[0][0],sizeof(SFTYPE), sheaderone, NUMENERREGIONS*NPR, MPI_SFTYPE,headerptr);
1207  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&fladdtermsreg_tot[0][0][0],sizeof(SFTYPE), sheaderone, NUMENERREGIONS*NUMFAILFLOORFLAGS*NPR, MPI_SFTYPE,headerptr);
1208  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&sourceaddreg_tot[0][0],sizeof(SFTYPE), sheaderone, NUMENERREGIONS*NPR, MPI_SFTYPE,headerptr);
1209  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&sourceaddtermsreg_tot[0][0][0],sizeof(SFTYPE), sheaderone, NUMENERREGIONS*NUMSOURCES*NPR, MPI_SFTYPE,headerptr);
1210 
1211  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&Ureg_init_tot[0][0],sizeof(SFTYPE), sheaderone, NUMENERREGIONS*NPR, MPI_SFTYPE,headerptr);
1212  //FAILFLOORLOOP(indexfinalstep,tscale,floor)
1213  if(readwrite==READHEAD&&0){
1214  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&failfloorcountlocal_tot[0][0][0],sizeof(CTYPE),ctypeheaderone,2*NUMTSCALES*(NUMFAILFLOORFLAGS-3),MPI_CTYPE,headerptr);
1215  }
1216  else{ //new format
1217  headercount+=header1_gen(!DONOTACCESSMEMORY,readwrite,bintxt,bcasthead,&failfloorcountlocal_tot[0][0][0],sizeof(CTYPE),ctypeheaderone,2*NUMTSCALES*NUMFAILFLOORFLAGS,MPI_CTYPE,headerptr);
1218  }
1219 
1220  // end new June 6,2003
1221 
1222  headercount+=header1_gen(DODISS,readwrite,bintxt,bcasthead,&dissreg_tot[0][0],sizeof(SFTYPE), sheaderone, NUMENERREGIONS*NUMDISSVERSIONS, MPI_SFTYPE,headerptr);
1223 
1224  headercount+=header1_gen(DOLUMVSR,readwrite,bintxt,bcasthead,&lumvsr_tot[0],sizeof(SFTYPE),sheaderone, ncpux1*N1, MPI_SFTYPE, headerptr);
1225 
1226  // for consistent restart file, assume NUMDISSVERSIONS doesn't change
1227  for(dissloop=0;dissloop<NUMDISSVERSIONS;dissloop++){// this loop is over pointers, not a continuous memory space!
1228  headercount+=header1_gen(DODISSVSR,readwrite,bintxt,bcasthead,&dissvsr_tot[dissloop][0],sizeof(SFTYPE),sheaderone, ncpux1*N1, MPI_SFTYPE, headerptr);
1229  }
1230 
1231 
1232  // Aug 16, 2007 -- active region parameters (updated by JCM 07/24/08)
1233  headercount+=header1_gen(DOGRIDSECTIONING,readwrite,bintxt,bcasthead,&global_enerregiondef,sizeof(int), "%d", NUMENERREGIONS*NUMUPDOWN*NDIM, MPI_INT,headerptr);
1234  headercount+=header1_gen(DOGRIDSECTIONING,readwrite,bintxt,bcasthead,&t_transition_in,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1235  headercount+=header1_gen(DOGRIDSECTIONING,readwrite,bintxt,bcasthead,&t_transition_out,sizeof(FTYPE), headerone, 1, MPI_FTYPE, headerptr);
1236  //end Aug 16, 2007 (updated by JCM 07/24/08)
1237 
1238 
1239  trifprintf("\nheadercount=%d\n",headercount);
1240 
1241 
1242  // BELOW moved to dump_gen
1243  // now read of tail is controlled by dump_gen()
1244  // if(bintxt==TEXTOUTPUT){
1245  // flush to just after the header line in case binary read of data
1246  // if(readwrite==READHEAD) while(fgetc(headerptr)!='\n');
1247  // if(readwrite==READHEAD){
1248  // do nothing
1249  // }
1250  // else if(readwrite==WRITEHEAD) fprintf(headerptr,"\n");
1251  // }
1252 
1253 
1254  if(readwrite==WRITEHEAD) {
1255  if(bintxt==TEXTOUTPUT){
1256  // flush to just after the header line in case binary read of data
1257  fprintf(headerptr,"\n");
1258  }
1259 
1260  // flux header so written to disk fully
1261  // Only flush on writing as flushing on reading is undefined on VS
1262  fflush(headerptr);
1263  }
1264 
1265 
1266 
1267 
1268  if(readwrite==READHEAD){
1270  //
1271  // some checks
1272  if (idum1 != totalsize[1]) {
1273  dualfprintf(fail_file, "error reading restart file; N1 differs\n");
1274  dualfprintf(fail_file, "got totalsize[1]=%d needed totalsize[1]=%d\n",idum1,totalsize[1]);
1275  myexit(3);
1276  }
1277  if (idum2 != totalsize[2]) {
1278  dualfprintf(fail_file, "error reading restart file; N2 differs\n");
1279  dualfprintf(fail_file, "got totalsize[2]=%d needed totalsize[2]=%d\n",idum2,totalsize[2]);
1280  myexit(4);
1281  }
1282  if (idum3 != totalsize[3]) {
1283  dualfprintf(fail_file, "error reading restart file; N3 differs\n");
1284  dualfprintf(fail_file, "got totalsize[3]=%d needed totalsize[3]=%d\n",idum3,totalsize[3]);
1285  myexit(4);
1286  }
1287  }
1288 
1289 
1290 
1291  // final things need to set but lock to rdump header content since don't want to add new header entry. GODMARK: Eventually should add to restart header.
1292  if(readwrite==READHEAD){
1293  fakesteps[0]=restartsteps[0];
1294  fakesteps[1]=restartsteps[1];
1296  DTfake=MAX(1,DTr/10); // only thing that matters currently.
1297  }
1298  if(bcasthead){
1299  MPI_Bcast(&fakesteps, 2, MPI_INT, MPIid[0], MPI_COMM_GRMHD);
1300  MPI_Bcast(&whichfake, 1, MPI_INT, MPIid[0], MPI_COMM_GRMHD);
1301  MPI_Bcast(&DTfake, 1, MPI_INT, MPIid[0], MPI_COMM_GRMHD);
1302  }
1303 
1304 
1305 
1306  if(readwrite==READHEAD) trifprintf("end reading header of restart file\n");
1307  else if(readwrite==WRITEHEAD) trifprintf("end writing header of restart file\n");
1308 
1309 
1310 
1311 
1312 
1313 
1314 
1315 
1316 
1317 
1318 
1319 
1320  return(0);
1321 
1322 
1323 
1324 }
1325 
1326 
1328 int restart_read_defs_new(void)
1329 {
1330  int enerregion;
1331  int indexfinalstep,floor,tscale,sc;
1332  int dissloop;
1333  int dir,pl,pliter;
1334  int ii;
1335  int dtloop;
1336  int bcast_restart_header(void);
1337 
1338 
1339  if(myid==0){
1341  //
1342  // Define for cpu=0 only, which will continue to keep track of the total after restart
1343  //
1344  // Recall that PDUMPLOOP is only for primitives, while PLOOP should always be used for conserved quantities or fluxes
1345  // pdot and pdotterms computed each time and not cumulative, so no need to store.
1346  ENERREGIONLOOP(enerregion) DIRLOOP(dir) PLOOP(pliter,pl) pcumreg[enerregion][dir][pl]=pcumreg_tot[enerregion][dir][pl];
1347  ENERREGIONLOOP(enerregion) PLOOP(pliter,pl) fladdreg[enerregion][pl]=fladdreg_tot[enerregion][pl];
1348  ENERREGIONLOOP(enerregion) PLOOP(pliter,pl) FLOORLOOP(floor) fladdtermsreg[enerregion][floor][pl]=fladdtermsreg_tot[enerregion][floor][pl];
1349  ENERREGIONLOOP(enerregion) PLOOP(pliter,pl) sourceaddreg[enerregion][pl]=sourceaddreg_tot[enerregion][pl];
1350  ENERREGIONLOOP(enerregion) PLOOP(pliter,pl) SCLOOP(sc) sourceaddtermsreg[enerregion][sc][pl]=sourceaddtermsreg_tot[enerregion][sc][pl];
1351  ENERREGIONLOOP(enerregion) PLOOP(pliter,pl) Ureg_init[enerregion][pl]=Ureg_init_tot[enerregion][pl];
1352 
1353  if(DODEBUG){
1354  FAILFLOORLOOP(indexfinalstep,tscale,floor){
1355  failfloorcountlocal[indexfinalstep][tscale][floor]=failfloorcountlocal_tot[indexfinalstep][tscale][floor];
1356  // failfloorcountlocal overwritten by counttotal by integratel in dump_ener.c, so also put in spatial spot. Need this if not tracking counters spatially. Or shouldn't reset failfloorcountlocal to zero in counttotal in dump_ener.c and reset counters to zero elsewhere at start of simulation.
1357  // So just stick it somewhere we can easily track down later on this myid==0 core.
1358  int i=-N1NOT1;
1359  int j=-N2NOT1;
1360  int k=-N3NOT1;
1361  GLOBALMACP0A3(failfloorcount,i,j,k,indexfinalstep,tscale,floor) = failfloorcountlocal[indexfinalstep][tscale][floor];
1362  }
1363  }
1364 
1365  if(DODISS) ENERREGIONLOOP(enerregion) for(dissloop=0;dissloop<NUMDISSVERSIONS;dissloop++) dissreg[enerregion][dissloop]=dissreg_tot[enerregion][dissloop];
1366  // assume (*dissfunpos)[][] not restored since zeroed out each dump
1367 
1368  if(DOLUMVSR) for(ii=0;ii<ncpux1*N1;ii++) lumvsr[ii]=lumvsr_tot[ii];
1369  if(DODISSVSR) for(dissloop=0;dissloop<NUMDISSVERSIONS;dissloop++) for(ii=0;ii<ncpux1*N1;ii++) dissvsr[dissloop][ii]=dissvsr_tot[dissloop][ii];
1370 
1371  }
1372 
1373 
1375  //
1376  // broadcast things read from header to all CPUs
1377  //
1379  bcast_restart_header();
1380 
1381 
1382 
1383  return(0);
1384 }
1385 
1386 
1387 
1393 #include "restart.rebeccaoldcode.c"
1394 
1395 
1396