int main(int argc,char *argv[]) { #define NE 12 #define NT 7 #define NS 5 t_ebin *eb; int i; char buf[25]; char *ce[NE],*ct[NT],*cs[NS]; real e[NE],t[NT],s[NS]; int ie,it,is; eb=mk_ebin(); for(i=0; (i<NE); i++) { e[i]=i; sprintf(buf,"e%d",i); ce[i]=strdup(buf); } ie=get_ebin_space(eb,NE,ce); add_ebin(eb,ie,NE,e,0); for(i=0; (i<NS); i++) { s[i]=i; sprintf(buf,"s%d",i); cs[i]=strdup(buf); } is=get_ebin_space(eb,NS,cs); add_ebin(eb,is,NS,s,0); for(i=0; (i<NT); i++) { t[i]=i; sprintf(buf,"t%d",i); ct[i]=strdup(buf); } it=get_ebin_space(eb,NT,ct); add_ebin(eb,it,NT,t,0); printf("Normal:\n"); pr_ebin(stdout,eb,0,-1,5,eprNORMAL,1); printf("Average:\n"); pr_ebin(stdout,eb,ie,NE,5,eprAVER,1); pr_ebin(stdout,eb,is,NS,3,eprAVER,1); pr_ebin(stdout,eb,it,NT,4,eprAVER,1); printf("RMS:\n"); pr_ebin(stdout,eb,0,-1,5,eprRMS,1); }
void print_ebin(ener_file_t fp_ene, gmx_bool bEne, gmx_bool bDR, gmx_bool bOR, FILE *log, gmx_int64_t step, double time, int mode, t_mdebin *md, t_fcdata *fcd, gmx_groups_t *groups, t_grpopts *opts) { /*static char **grpnms=NULL;*/ char buf[246]; int i, j, n, ni, nj, b; int ndisre = 0; real *disre_rm3tav, *disre_rt; /* these are for the old-style blocks (1 subblock, only reals), because there can be only one per ID for these */ int nr[enxNR]; int id[enxNR]; real *block[enxNR]; t_enxframe fr; switch (mode) { case eprNORMAL: init_enxframe(&fr); fr.t = time; fr.step = step; fr.nsteps = md->ebin->nsteps; fr.dt = md->delta_t; fr.nsum = md->ebin->nsum; fr.nre = (bEne) ? md->ebin->nener : 0; fr.ener = md->ebin->e; ndisre = bDR ? fcd->disres.npair : 0; disre_rm3tav = fcd->disres.rm3tav; disre_rt = fcd->disres.rt; /* Optional additional old-style (real-only) blocks. */ for (i = 0; i < enxNR; i++) { nr[i] = 0; } if (fcd->orires.nr > 0 && bOR) { diagonalize_orires_tensors(&(fcd->orires)); nr[enxOR] = fcd->orires.nr; block[enxOR] = fcd->orires.otav; id[enxOR] = enxOR; nr[enxORI] = (fcd->orires.oinsl != fcd->orires.otav) ? fcd->orires.nr : 0; block[enxORI] = fcd->orires.oinsl; id[enxORI] = enxORI; nr[enxORT] = fcd->orires.nex*12; block[enxORT] = fcd->orires.eig; id[enxORT] = enxORT; } /* whether we are going to wrte anything out: */ if (fr.nre || ndisre || nr[enxOR] || nr[enxORI]) { /* the old-style blocks go first */ fr.nblock = 0; for (i = 0; i < enxNR; i++) { if (nr[i] > 0) { fr.nblock = i + 1; } } add_blocks_enxframe(&fr, fr.nblock); for (b = 0; b < fr.nblock; b++) { add_subblocks_enxblock(&(fr.block[b]), 1); fr.block[b].id = id[b]; fr.block[b].sub[0].nr = nr[b]; #if !GMX_DOUBLE fr.block[b].sub[0].type = xdr_datatype_float; fr.block[b].sub[0].fval = block[b]; #else fr.block[b].sub[0].type = xdr_datatype_double; fr.block[b].sub[0].dval = block[b]; #endif } /* check for disre block & fill it. */ if (ndisre > 0) { int db = fr.nblock; fr.nblock += 1; add_blocks_enxframe(&fr, fr.nblock); add_subblocks_enxblock(&(fr.block[db]), 2); fr.block[db].id = enxDISRE; fr.block[db].sub[0].nr = ndisre; fr.block[db].sub[1].nr = ndisre; #if !GMX_DOUBLE fr.block[db].sub[0].type = xdr_datatype_float; fr.block[db].sub[1].type = xdr_datatype_float; fr.block[db].sub[0].fval = disre_rt; fr.block[db].sub[1].fval = disre_rm3tav; #else fr.block[db].sub[0].type = xdr_datatype_double; fr.block[db].sub[1].type = xdr_datatype_double; fr.block[db].sub[0].dval = disre_rt; fr.block[db].sub[1].dval = disre_rm3tav; #endif } /* here we can put new-style blocks */ /* Free energy perturbation blocks */ if (md->dhc) { mde_delta_h_coll_handle_block(md->dhc, &fr, fr.nblock); } /* we can now free & reset the data in the blocks */ if (md->dhc) { mde_delta_h_coll_reset(md->dhc); } /* do the actual I/O */ do_enx(fp_ene, &fr); if (fr.nre) { /* We have stored the sums, so reset the sum history */ reset_ebin_sums(md->ebin); } } free_enxframe(&fr); break; case eprAVER: if (log) { pprint(log, "A V E R A G E S", md); } break; case eprRMS: if (log) { pprint(log, "R M S - F L U C T U A T I O N S", md); } break; default: gmx_fatal(FARGS, "Invalid print mode (%d)", mode); } if (log) { for (i = 0; i < opts->ngtc; i++) { if (opts->annealing[i] != eannNO) { fprintf(log, "Current ref_t for group %s: %8.1f\n", *(groups->grpname[groups->grps[egcTC].nm_ind[i]]), opts->ref_t[i]); } } if (mode == eprNORMAL && fcd->orires.nr > 0) { print_orires_log(log, &(fcd->orires)); } fprintf(log, " Energies (%s)\n", unit_energy); pr_ebin(log, md->ebin, md->ie, md->f_nre+md->nCrmsd, 5, mode, TRUE); fprintf(log, "\n"); if (mode == eprAVER) { if (md->bDynBox) { pr_ebin(log, md->ebin, md->ib, md->bTricl ? NTRICLBOXS : NBOXS, 5, mode, TRUE); fprintf(log, "\n"); } if (md->bConstrVir) { fprintf(log, " Constraint Virial (%s)\n", unit_energy); pr_ebin(log, md->ebin, md->isvir, 9, 3, mode, FALSE); fprintf(log, "\n"); fprintf(log, " Force Virial (%s)\n", unit_energy); pr_ebin(log, md->ebin, md->ifvir, 9, 3, mode, FALSE); fprintf(log, "\n"); } fprintf(log, " Total Virial (%s)\n", unit_energy); pr_ebin(log, md->ebin, md->ivir, 9, 3, mode, FALSE); fprintf(log, "\n"); fprintf(log, " Pressure (%s)\n", unit_pres_bar); pr_ebin(log, md->ebin, md->ipres, 9, 3, mode, FALSE); fprintf(log, "\n"); if (md->bMu) { fprintf(log, " Total Dipole (%s)\n", unit_dipole_D); pr_ebin(log, md->ebin, md->imu, 3, 3, mode, FALSE); fprintf(log, "\n"); } if (md->nE > 1) { if (md->print_grpnms == NULL) { snew(md->print_grpnms, md->nE); n = 0; for (i = 0; (i < md->nEg); i++) { ni = groups->grps[egcENER].nm_ind[i]; for (j = i; (j < md->nEg); j++) { nj = groups->grps[egcENER].nm_ind[j]; sprintf(buf, "%s-%s", *(groups->grpname[ni]), *(groups->grpname[nj])); md->print_grpnms[n++] = gmx_strdup(buf); } } } sprintf(buf, "Epot (%s)", unit_energy); fprintf(log, "%15s ", buf); for (i = 0; (i < egNR); i++) { if (md->bEInd[i]) { fprintf(log, "%12s ", egrp_nm[i]); } } fprintf(log, "\n"); for (i = 0; (i < md->nE); i++) { fprintf(log, "%15s", md->print_grpnms[i]); pr_ebin(log, md->ebin, md->igrp[i], md->nEc, md->nEc, mode, FALSE); } fprintf(log, "\n"); } if (md->nTC > 1) { pr_ebin(log, md->ebin, md->itemp, md->nTC, 4, mode, TRUE); fprintf(log, "\n"); } if (md->nU > 1) { fprintf(log, "%15s %12s %12s %12s\n", "Group", "Ux", "Uy", "Uz"); for (i = 0; (i < md->nU); i++) { ni = groups->grps[egcACC].nm_ind[i]; fprintf(log, "%15s", *groups->grpname[ni]); pr_ebin(log, md->ebin, md->iu+3*i, 3, 3, mode, FALSE); } fprintf(log, "\n"); } } } }
void print_ebin(int fp_ene,bool bEne,bool bDR,bool bOR, FILE *log,int steps,real time,int mode,bool bCompact, t_mdebin *md,t_fcdata *fcd,t_atoms *atoms) { static char **grpnms=NULL; static char *kjm="(kJ/mol)"; char buf[246]; int i,j,n,ni,nj,ndr,nor; int nr[enxNR]; real *block[enxNR]; t_enxframe fr; switch (mode) { case eprNORMAL: fr.t = time; fr.step = steps; fr.nre = (bEne) ? md->ebin->nener : 0; fr.ener = md->ebin->e; fr.ndisre = bDR ? fcd->disres.npr : 0; fr.rav = fcd->disres.rav; fr.rt = fcd->disres.rt; nr[enxOR] = bOR ? fcd->orires.nr : 0; nr[enxORI] = (bOR && (fcd->orires.oinsl != fcd->orires.otav)) ? fcd->orires.nr : 0; fr.nr = nr; block[enxOR] = fcd->orires.otav; block[enxORI] = fcd->orires.oinsl; fr.block = block; if (fr.nr[enxOR]) fr.nblock = 2; else fr.nblock = 0; if (fr.nre || fr.ndisre || fr.nr[enxOR] || fr.nr[enxORI]) do_enx(fp_ene,&fr); break; case eprAVER: if (log) pprint(log,"A V E R A G E S"); break; case eprRMS: if (log) pprint(log,"R M S - F L U C T U A T I O N S"); break; default: fatal_error(0,"Invalid print mode (%d)",mode); } if (log) { if (fcd->orires.nr) print_orires_log(log,fcd); fprintf(log," Energies %s\n",kjm); pr_ebin(log,md->ebin,md->ie,f_nre,5,mode,steps,TRUE); fprintf(log,"\n"); if (!bCompact) { if (bPC) { pr_ebin(log,md->ebin,md->ib, bTricl ? NTRICLBOXS : NBOXS,5,mode,steps,TRUE); fprintf(log,"\n"); } if (bShake) { fprintf(log," Shake Virial %s\n",kjm); pr_ebin(log,md->ebin,md->isvir,9,3,mode,steps,FALSE); fprintf(log,"\n"); fprintf(log," Force Virial %s\n",kjm); pr_ebin(log,md->ebin,md->ifvir,9,3,mode,steps,FALSE); fprintf(log,"\n"); } fprintf(log," Total Virial %s\n",kjm); pr_ebin(log,md->ebin,md->ivir,9,3,mode,steps,FALSE); fprintf(log,"\n"); fprintf(log," Pressure (bar)\n"); pr_ebin(log,md->ebin,md->ipres,9,3,mode,steps,FALSE); fprintf(log,"\n"); fprintf(log," Total Dipole (Debye)\n"); pr_ebin(log,md->ebin,md->imu,3,3,mode,steps,FALSE); fprintf(log,"\n"); if (md->nE > 1) { if (grpnms==NULL) { snew(grpnms,md->nE); n=0; for(i=0; (i<md->nEg); i++) { ni=atoms->grps[egcENER].nm_ind[i]; for(j=i; (j<md->nEg); j++) { nj=atoms->grps[egcENER].nm_ind[j]; sprintf(buf,"%s-%s",*(atoms->grpname[ni]),*(atoms->grpname[nj])); grpnms[n++]=strdup(buf); } } } sprintf(buf,"Epot %s",kjm); fprintf(log,"%15s ",buf); for(i=0; (i<egNR); i++) if (bEInd[i]) fprintf(log,"%12s ",egrp_nm[i]); fprintf(log,"\n"); for(i=0; (i<md->nE); i++) { fprintf(log,"%15s",grpnms[i]); pr_ebin(log,md->ebin,md->igrp[i],md->nEc,md->nEc,mode,steps,FALSE); } fprintf(log,"\n"); } if (md->nTC > 1) { pr_ebin(log,md->ebin,md->itc,2*md->nTC,4,mode,steps,TRUE); fprintf(log,"\n"); } if (md->nU > 1) { fprintf(log,"%15s %12s %12s %12s\n", "Group","Ux","Uy","Uz"); for(i=0; (i<md->nU); i++) { ni=atoms->grps[egcACC].nm_ind[i]; fprintf(log,"%15s",*atoms->grpname[ni]); pr_ebin(log,md->ebin,md->iu+3*i,3,3,mode,steps,FALSE); } fprintf(log,"\n"); } } } }
void print_ebin(int fp_ene,bool bEne,bool bDR,bool bOR, FILE *log,int step,int nsteps,real time,int mode,bool bCompact, t_mdebin *md,t_fcdata *fcd, gmx_groups_t *groups,t_grpopts *opts) { static char **grpnms=NULL; static char *kjm="(kJ/mol)"; char buf[246]; int i,j,n,ni,nj,ndr,nor; int nr[enxNR]; real *block[enxNR]; t_enxframe fr; switch (mode) { case eprNORMAL: fr.t = time; fr.step = step; fr.nre = (bEne) ? md->ebin->nener : 0; fr.ener = md->ebin->e; fr.ndisre = bDR ? fcd->disres.npair : 0; fr.disre_rm3tav = fcd->disres.rm3tav; fr.disre_rt = fcd->disres.rt; /* Optional additional blocks */ for(i=0; i<enxNR; i++) nr[i] = 0; if (fcd->orires.nr > 0 && bOR) { diagonalize_orires_tensors(&(fcd->orires)); nr[enxOR] = fcd->orires.nr; block[enxOR] = fcd->orires.otav; nr[enxORI] = (fcd->orires.oinsl != fcd->orires.otav) ? fcd->orires.nr : 0; block[enxORI] = fcd->orires.oinsl; nr[enxORT] = fcd->orires.nex*12; block[enxORT] = fcd->orires.eig; } fr.nblock = 0; for(i=0; i<enxNR; i++) if (nr[i] > 0) fr.nblock = i+1; fr.nr = nr; fr.block = block; if (fr.nre || fr.ndisre || fr.nr[enxOR] || fr.nr[enxORI]) do_enx(fp_ene,&fr); break; case eprAVER: if (log) pprint(log,"A V E R A G E S"); break; case eprRMS: if (log) pprint(log,"R M S - F L U C T U A T I O N S"); break; default: gmx_fatal(FARGS,"Invalid print mode (%d)",mode); } if (log) { for(i=0;i<opts->ngtc;i++) if(opts->annealing[i]!=eannNO) fprintf(log,"Current ref_t for group %s: %8.1f\n", *(groups->grpname[groups->grps[egcTC].nm_ind[i]]),opts->ref_t[i]); if (mode==eprNORMAL && fcd->orires.nr>0) print_orires_log(log,&(fcd->orires)); fprintf(log," Energies %s\n",kjm); pr_ebin(log,md->ebin,md->ie,f_nre+nCrmsd,5,mode,nsteps,TRUE); fprintf(log,"\n"); if (!bCompact) { if (bDynBox) { pr_ebin(log,md->ebin,md->ib, bTricl ? NTRICLBOXS : NBOXS,5,mode, nsteps,TRUE); fprintf(log,"\n"); } if (bConstrVir) { fprintf(log," Constraint Virial %s\n",kjm); pr_ebin(log,md->ebin,md->isvir,9,3,mode,nsteps,FALSE); fprintf(log,"\n"); fprintf(log," Force Virial %s\n",kjm); pr_ebin(log,md->ebin,md->ifvir,9,3,mode,nsteps,FALSE); fprintf(log,"\n"); } fprintf(log," Total Virial %s\n",kjm); pr_ebin(log,md->ebin,md->ivir,9,3,mode,nsteps,FALSE); fprintf(log,"\n"); fprintf(log," Pressure (bar)\n"); pr_ebin(log,md->ebin,md->ipres,9,3,mode,nsteps,FALSE); fprintf(log,"\n"); fprintf(log," Total Dipole (Debye)\n"); pr_ebin(log,md->ebin,md->imu,3,3,mode,nsteps,FALSE); fprintf(log,"\n"); if (md->nE > 1) { if (grpnms==NULL) { snew(grpnms,md->nE); n=0; for(i=0; (i<md->nEg); i++) { ni=groups->grps[egcENER].nm_ind[i]; for(j=i; (j<md->nEg); j++) { nj=groups->grps[egcENER].nm_ind[j]; sprintf(buf,"%s-%s",*(groups->grpname[ni]),*(groups->grpname[nj])); grpnms[n++]=strdup(buf); } } } sprintf(buf,"Epot %s",kjm); fprintf(log,"%15s ",buf); for(i=0; (i<egNR); i++) if (bEInd[i]) fprintf(log,"%12s ",egrp_nm[i]); fprintf(log,"\n"); for(i=0; (i<md->nE); i++) { fprintf(log,"%15s",grpnms[i]); pr_ebin(log,md->ebin,md->igrp[i],md->nEc,md->nEc,mode,nsteps,FALSE); } fprintf(log,"\n"); } if (md->nTC > 1) { pr_ebin(log,md->ebin,md->itemp,md->nTC,4,mode,nsteps,TRUE); fprintf(log,"\n"); } if (md->nU > 1) { fprintf(log,"%15s %12s %12s %12s\n", "Group","Ux","Uy","Uz"); for(i=0; (i<md->nU); i++) { ni=groups->grps[egcACC].nm_ind[i]; fprintf(log,"%15s",*groups->grpname[ni]); pr_ebin(log,md->ebin,md->iu+3*i,3,3,mode,nsteps,FALSE); } fprintf(log,"\n"); } } } }