3 #define PROBEFILE (0 &&DOENERDIAG) // whether to do probe file
11 int dump_ener(
int doener,
int dordump,
int call_code)
15 static FILE *flener_file;
20 static FILE *ener_file;
25 static FILE *gener_file;
30 static FILE *metricparmsener_file;
33 static FILE *probe_file;
36 static FILE *debug_file;
37 static FILE *lumener_file;
46 int i,
j, k, pl, pliter, l, dir,sc,fl,indexfinalstep,floor,tscale;
51 FTYPE divb, divbmax = 0, divbavg =0;
65 static int firsttime = 1;
81 if ((call_code ==
INIT_OUT) || (firsttime == 1)) {
85 sprintf(dfnam,
"probe.dat%s",myidtxt);
86 if((probe_file=fopen(dfnam,
"at"))==NULL){
87 dualfprintf(
fail_file,
"Can't open probe file\n");
95 sprintf(dfnam,
"debug.out");
96 myfopen(dfnam,
"a+",
"error opening debug output file\n",&debug_file);
101 sprintf(dfnam,
"lumvsr.out");
102 myfopen(dfnam,
"a+",
"error opening lumvsr output file\n",&lumener_file);
108 sprintf(dfnam,
"dissvsr%d.out",fileiter);
109 myfopen(dfnam,
"a+",
"error opening dissvsr output file\n",&dissener_file[fileiter]);
116 sprintf(dfnam,
"selfgravvsr%d.out",fileiter);
117 myfopen(dfnam,
"a+",
"error opening selfgravvsr output file\n",&selfgravener_file[fileiter]);
123 sprintf(dfnam,
"metricparms.out");
124 myfopen(dfnam,
"a+",
"error opening metricparms output file\n",&metricparmsener_file);
131 FLENERNAME=FLENERREGIONNAME[enerregion];
137 ENERNAME=ENERREGIONNAME[enerregion];
139 GENERNAME=GENERREGIONNAME[enerregion];
147 else sprintf(FLENERNAME,
"flenerother%d.out",enerregion);
148 myfopen(FLENERNAME,
"a+",
"error opening FLenergy output file\n",&flenerreg_file[enerregion]);
152 else sprintf(ENERNAME,
"enerother%d.out",enerregion);
156 myfopen(ENERNAME,
"a+",
"error opening energy output file\n",&enerreg_file[enerregion]);
159 trifprintf(
"Start setup of %s file append\n", ENERNAME);
160 myfopen(ENERNAME,
"a+",
"error opening energy output file for append\n",&enerreg_file[enerregion]);
166 else sprintf(GENERNAME,
"generjet%d.out",enerregion-1);
167 myfopen(GENERNAME,
"a+",
"error opening energy output file\n",&generreg_file[enerregion]);
189 trifprintf(
".BE.%d",enerregion);
197 U_tot=Ureg_tot[enerregion];
198 U_final=Ureg_final[enerregion];
220 ener_file=enerreg_file[enerregion];
221 gener_file=generreg_file[enerregion];
222 flener_file=flenerreg_file[enerregion];
231 trifprintf(
"BI%d",enerregion);
242 if(integrate(NPR,U_tot,U_tot,
CONSTYPE,enerregion)>=1)
return(1);
311 trifprintf(
"AI%d",enerregion);
320 if (call_code ==
INIT_OUT || firsttime) {
330 PLOOP(pliter,pl) U_final[pl] = U_tot[pl];
333 trifprintf(
"\n\nEnergy: ini,fin,del: %21.15g %21.15g %21.15g\n",
336 trifprintf(
"\n\nMass: ini,fin,del: %21.15g %21.15g %21.15g\n",
342 ftemp0=(U_final[pl] -
U_init[pl]);
344 trifprintf(
"U[%d]: ini,fin,fdf,del,tfdf,tdel: %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g\n",
364 myfprintf(gener_file,
"%21.15g %21.15g %21.15g %21.15g %21.15g %21.15g ",
t, U_tot[
RHO], U_tot[
U3], U_tot[
UU], GLOBALMACP0A1(pdump,
N1 / 2,
N2 / 2,
N3 / 2,UU) * pow(GLOBALMACP0A1(pdump,
N1 / 2,
N2 / 2,
N3 / 2,RHO), -
gam), GLOBALMACP0A1(pdump,
N1 / 2,
N2 / 2,
N3 / 2,UU));
378 myfprintf(ener_file,
"%21.15g %ld ",
t ,
realnstep);
379 PLOOP(pliter,pl) myfprintf(ener_file,
"%21.15g ", U_tot[pl]);
385 myfprintf(ener_file,
"%21.15g %21.15g ", divbmax,divbavg);
386 if(
DODISS)
for(dissloop=0;dissloop<
NUMDISSVERSIONS;dissloop++) myfprintf(ener_file,
"%21.15g ", diss_tot[dissloop]);
387 else for(dissloop=0;dissloop<
NUMDISSVERSIONS;dissloop++) myfprintf(ener_file,
"%21.15g ", -1.0);
394 myfprintf(flener_file,
"%21.15g %ld ",
t,
realnstep);
402 for(dir=0;dir<=1;dir++)
PLOOP(pliter,pl)
FLLOOP(fl) myfprintf(flener_file,
"%21.15g ", pdottermsjet2_tot[dir][fl][pl]);
406 myfprintf(lumener_file,
"%21.15g %ld ",
t,
realnstep);
413 myfprintf(dissener_file[dissloop],
"%21.15g %ld ",
t,
realnstep);
414 for(ii=0;ii<
ncpux1*
N1;ii++) myfprintf(dissener_file[dissloop],
"%21.15g ",
dissvsr_tot[dissloop][ii]);
426 myfprintf(metricparmsener_file,
"%21.15g %ld ",
t,
realnstep);
440 myfprintf(metricparmsener_file,
"%21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %d ",
dE,
dJ,
MBH0+
dE,
a0+
dabh,(
a0+
dabh)/(
SMALL+
MBH0+
dE),
MBH0,
MBH,
a0,
a0/(
SMALL+
MBH0),a,a/(
SMALL+
MBH),
QBH0,
QBH0/(
SMALL+
MBH0),
QBH,
QBH/(
SMALL+
MBH),
EP30,
EP30/(
SMALL+
MBH0),
EP3,
EP3/(
SMALL+
MBH),
THETAROT0,
THETAROT0/(
SMALL+
MBH0),
THETAROT,
THETAROT/(
SMALL+
MBH),
Rhor,
Risco,
horizoni+
N1*
horizoncpupos1);
446 myfprintf(selfgravener_file[fileiter],
"%21.15g %ld ",
t,
realnstep);
451 myfprintf(selfgravener_file[fileiter],
"%21.15g %ld ",
t,
realnstep);
456 myfprintf(selfgravener_file[fileiter],
"%21.15g %ld ",
t,
realnstep);
461 myfprintf(selfgravener_file[fileiter],
"%21.15g %ld ",
t,
realnstep);
466 myfprintf(selfgravener_file[fileiter],
"%21.15g %ld ",
t,
realnstep);
470 myfprintf(selfgravener_file[fileiter],
"%21.15g ", phibh+
phivsr_tot[ii]);
473 myfprintf(selfgravener_file[fileiter],
"%21.15g %ld ",
t,
realnstep);
477 myfprintf(selfgravener_file[fileiter],
"%21.15g %ld ",
t,
realnstep);
481 myfprintf(selfgravener_file[fileiter],
"%21.15g %ld ",
t,
realnstep);
485 myfprintf(selfgravener_file[fileiter],
"%21.15g %ld ",
t,
realnstep);
503 #define ITER1 MAX(N1/4,1)
504 #define ITER2 MAX(N2/4,1)
505 #define ITER3 MAX(N3/4,1)
512 PDUMPLOOP(pliter,pl) fprintf(probe_file,
"%d %d %d %d %ld %21.15g %21.15g\n",
startpos[1]+i,
startpos[2]+j,
startpos[3]+k,pl,
realnstep,
t, GLOBALMACP0A1(pdump,i,j,k,pl));
521 myfprintf(debug_file,
"%21.15g %ld ",
t,
realnstep);
529 #if(COUNTTYPE==LONGLONGINTTYPE)
531 #elif(COUNTTYPE==DOUBLETYPE)
540 myfprintf(flener_file,
"\n");
541 myfprintf(ener_file,
"\n");
542 myfprintf(gener_file,
"\n");
544 if(
DOLUMVSR) myfprintf(lumener_file,
"\n");
546 if(
DODEBUG) myfprintf(debug_file,
"\n");
552 for(fileiter=0;fileiter<
NUMSELFGRAV;fileiter++) myfprintf(selfgravener_file[fileiter],
"\n");
556 trifprintf(
"W%d",enerregion);
565 myfclose(&flener_file,
"Couldn't close flener_file\n");
566 if(1) myfclose(&ener_file,
"Couldn't close ener_file\n");
567 if(1||
GAMMIEENER) myfclose(&gener_file,
"Couldn't close gener_file\n");
571 if(
DOEVOLVEMETRIC) myfclose(&metricparmsener_file,
"Couldn't close metricparmsener_file\n");
573 for(fileiter=0;fileiter<
NUMSELFGRAV;fileiter++) myfclose(&selfgravener_file[fileiter],
"Couldn't close selfgravener_file\n");
578 if(
DOLUMVSR) myfclose(&lumener_file,
"Couldn't close lumener_file\n");
579 if(
DODISSVSR)
for(dissloop=0;dissloop<
NUMDISSVERSIONS;dissloop++) myfclose(&dissener_file[dissloop],
"Couldn't close dissener_file\n");
580 if(
DODEBUG) myfclose(&debug_file,
"Couldn't close debug_file\n");
600 void appendener(FILE* ener_file,
SFTYPE (*pcum_totvar)[NPR],
SFTYPE*fladd_totvar,
SFTYPE *sourceadd_totvar)
606 FILE *ener_file_temp;
615 while ((!feof(ener_file)) && (gotit == 0)) {
617 fscanf(ener_file,
"%lf", &tcheck);
622 if ((l > 3+NPR+
COMPDIM*2*NPR) && (l < 3+NPR+2*
COMPDIM*2*NPR+NPR)) {
624 fscanf(ener_file,
"%lf", &pcum_totvar[dir][pl]);
628 fscanf(ener_file,
"%lf", &fladd_totvar[pl]);
632 fscanf(ener_file,
"%lf", &sourceadd_totvar[pl]);
639 while ((fgetc(ener_file) !=
'\n') && (!feof(ener_file)));
644 fpos0 = ftell(ener_file);
649 "Never found right time in loss file when appending: looking for t=%21.15g lastt=%21.15g\n",
654 "found goodtime t=%21.15g (wanted %21.15g) to restart ener file\n",
656 sprintf(dfnamtemp,
"%s0_ener%s.temp",
DATADIR,
".out");
657 sprintf(dfnam,
"%sener%s",
DATADIR,
".out");
658 sprintf(dfnamback,
"%s0_ener%s.back",
DATADIR,
".out");
661 if ((ener_file_temp = fopen(dfnamtemp,
"wt")) == NULL) {
663 "Cannot open temp ener file for appending: %s\n",
668 while (ftell(ener_file) < fpos0 + 1) {
671 fputc(fgetc(ener_file), ener_file_temp);
673 fclose(ener_file_temp);
675 rename(dfnam, dfnamback);
676 rename(dfnamtemp, dfnam);
680 if ((ener_file = fopen(dfnam,
"at")) == NULL) {
682 "2: error opening ener output file %s\n", dfnam);
685 trifprintf(
"End setup of ener file append\n");
695 int imax=0,jmax=0,kmax=0;
697 FTYPE divbmax=0,divbavg=0;
698 FTYPE divbmaxsend,divbavgsend;
711 if (divb > divbmax) {
721 logfprintf(
" proc: %04d : divbmax: %d %d %d : %21.15g divbavg: %21.15g\n", myid, imax, jmax, kmax, divbmax, divbavg / ((
FTYPE) (
N1*
N2*
N3)));
723 #if(USEMPI) // give CPU=0 total
724 divbmaxsend = divbmax;
725 divbavgsend = divbavg;
728 MPI_Barrier(MPI_COMM_GRMHD);
730 MPI_Reduce(&divbmaxsend, &divbmax, 1, MPI_FTYPE, MPI_MAX, MPIid[0], MPI_COMM_GRMHD);
732 MPI_Barrier(MPI_COMM_GRMHD);
734 MPI_Reduce(&divbavgsend, &divbavg, 1, MPI_FTYPE, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
736 MPI_Barrier(MPI_COMM_GRMHD);
743 myfprintf(
logfull_file,
" divbmax: %21.15g divbavg: %21.15g\n",divbmax, divbavg);
753 void setrestart(
int*appendoldvar)
769 void gettotal(
int doall,
int numvars,
SFTYPE* vars[],
int*sizes,
SFTYPE*vars_tot[])
780 for(k=0;k<numvars;k++){
781 for(j=0;j<sizes[k];j++){
782 vars_tot[k][
j] = vars[k][
j];
789 for(k=0;k<numvars;k++){
794 if(&vars[k][0] == &vars_tot[k][0]){
799 dualfprintf(
fail_file,
"Couldn't get memory for ptrsend in gettotal with k=%d numvars=%d sizes=%d\n",k,numvars,sizes[k]);
804 for(j=0;j<sizes[k];j++){
805 ptrsend[
j] = vars[k][
j];
810 ptrsend = &vars[k][0];
813 if(doall==0) MPI_Reduce(ptrsend, &vars_tot[k][0], sizes[k], MPI_SFTYPE, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
814 else MPI_Allreduce(ptrsend, &vars_tot[k][0], sizes[k], MPI_SFTYPE, MPI_SUM, MPI_COMM_GRMHD);
817 if(didmalloc) free(ptrsend);
838 void getalltotal(
int numvars,
SFTYPE* vars[],
int*sizes,
SFTYPE*vars_tot[])
847 for(k=0;k<numvars;k++){
848 for(j=0;j<sizes[k];j++){
849 vars_tot[k][
j] = vars[k][
j];
855 for(k=0;k<numvars;k++){
856 for(j=0;j<sizes[k];j++){
860 MPI_Allreduce(&send, &vars_tot[k][j], 1, MPI_SFTYPE, MPI_SUM, MPI_COMM_GRMHD);
869 void gettotall(
int numvars, CTYPE* vars[],
int*sizes,CTYPE *vars_tot[])
878 for(k=0;k<numvars;k++){
879 for(j=0;j<sizes[k];j++){
880 vars_tot[k][
j] = vars[k][
j];
886 for(k=0;k<numvars;k++){
887 for(j=0;j<sizes[k];j++){
890 MPI_Reduce(&send, &vars_tot[k][j], 1, MPI_CTYPE, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
899 int constotal(
int enerregion,
SFTYPE *vars)
906 struct of_geom *ptrgeom=&geomdontuse;
909 PLOOP(pliter,pl) vars[pl]= 0.0;
922 ftemp[pl]=GLOBALMACP0A1(udump,i,j,k,pl)*
dVF;
923 vars[pl] += ftemp[pl];
937 vars[pl] += ftemp[pl];
945 ftemp[pl]=GLOBALMACP0A1(unewglobal,i,j,k,pl)*
dVF;
946 vars[pl] += ftemp[pl];
960 int constotal2(
int enerregion,
SFTYPE *vars)
976 vars[0] += GLOBALMACP0A1(dissfunpos,i,j,k,0);
987 int counttotal(
int enerregion, CTYPE *vars,
int num)
991 for(variter=0;variter<num;variter++) vars[variter]= 0;
1001 for(variter=0;variter<num;variter++) vars[variter] +=
GLOBALMACP0A3(failfloorcount,i,j,k,0,0,variter) ;
1010 for(variter=0;variter<num;variter++) vars[variter] +=
GLOBALMACP0A3(failfloorcount,i,j,k,0,0,variter) ;
1021 int integrate(
int numelements,
SFTYPE * var,
SFTYPE *var_tot,
int type,
int enerregion)
1024 int totalsizes[
MAXPTRS],numptrs;
1028 if(constotal(enerregion,var)>=1)
return(1);
1029 totalsizes[0]=numelements;
1030 gettotal(0,1,&var,totalsizes,&var_tot);
1040 totalsizes[0]=numelements;
1041 gettotal(0,1,&var,totalsizes,&var_tot);
1046 gettotal(0,1,&var,totalsizes,&var_tot);
1052 totalsizes[0]=numelements;
1054 gettotal(1,1,&var,totalsizes,&var_tot);
1057 dualfprintf(
fail_file,
"No defined type=%d in integrate\n",type);
1065 int integratel(
int numelements, CTYPE * var, CTYPE *var_tot,
int type,
int enerregion)
1068 int totalsizes[
MAXPTRS],numptrs;
1073 if(counttotal(enerregion,var,numelements)>=1)
return(1);
1074 totalsizes[0]=numelements;
1075 gettotall(1,&var,totalsizes,&var_tot);
1078 dualfprintf(
fail_file,
"No defined type=%d in integratel\n",type);