int gmx_pme_error(int argc,char *argv[]) { const char *desc[] = { "[TT]g_pme_error[tt] estimates the error of the electrostatic forces", "if using the sPME algorithm. The flag [TT]-tune[tt] will determine", "the splitting parameter such that the error is equally", "distributed over the real and reciprocal space part.", "The part of the error that stems from self interaction of the particles " "is computationally demanding. However, a good a approximation is to", "just use a fraction of the particles for this term which can be", "indicated by the flag [TT]-self[tt].[PAR]", }; real fs=0.0; /* 0 indicates: not set by the user */ real user_beta=-1.0; real fracself=1.0; t_inputinfo info; t_state state; /* The state from the tpr input file */ gmx_mtop_t mtop; /* The topology from the tpr input file */ t_inputrec *ir=NULL; /* The inputrec from the tpr file */ FILE *fp=NULL; t_commrec *cr; unsigned long PCA_Flags; gmx_bool bTUNE=FALSE; gmx_bool bVerbose=FALSE; int seed=0; static t_filenm fnm[] = { { efTPX, "-s", NULL, ffREAD }, { efOUT, "-o", "error", ffWRITE }, { efTPX, "-so", "tuned", ffOPTWR } }; output_env_t oenv=NULL; t_pargs pa[] = { { "-beta", FALSE, etREAL, {&user_beta}, "If positive, overwrite ewald_beta from [TT].tpr[tt] file with this value" }, { "-tune", FALSE, etBOOL, {&bTUNE}, "Tune the splitting parameter such that the error is equally distributed between real and reciprocal space" }, { "-self", FALSE, etREAL, {&fracself}, "If between 0.0 and 1.0, determine self interaction error from just this fraction of the charged particles" }, { "-seed", FALSE, etINT, {&seed}, "Random number seed used for Monte Carlo algorithm when [TT]-self[tt] is set to a value between 0.0 and 1.0" }, { "-v", FALSE, etBOOL, {&bVerbose}, "Be loud and noisy" } }; #define NFILE asize(fnm) cr = init_par(&argc,&argv); #ifdef GMX_LIB_MPI MPI_Barrier(MPI_COMM_WORLD); #endif if (MASTER(cr)) CopyRight(stderr,argv[0]); PCA_Flags = PCA_NOEXIT_ON_ARGS; PCA_Flags |= (MASTER(cr) ? 0 : PCA_QUIET); parse_common_args(&argc,argv,PCA_Flags, NFILE,fnm,asize(pa),pa,asize(desc),desc, 0,NULL,&oenv); if (!bTUNE) bTUNE = opt2bSet("-so",NFILE,fnm); info.n_entries = 1; /* Allocate memory for the inputinfo struct: */ create_info(&info); info.fourier_sp[0] = fs; /* Read in the tpr file and open logfile for reading */ if (MASTER(cr)) { snew(ir,1); read_tpr_file(opt2fn("-s",NFILE,fnm), &info, &state, &mtop, ir, user_beta,fracself); fp=fopen(opt2fn("-o",NFILE,fnm),"w"); } /* Check consistency if the user provided fourierspacing */ if (fs > 0 && MASTER(cr)) { /* Recalculate the grid dimensions using fourierspacing from user input */ info.nkx[0] = 0; info.nky[0] = 0; info.nkz[0] = 0; calc_grid(stdout,state.box,info.fourier_sp[0],&(info.nkx[0]),&(info.nky[0]),&(info.nkz[0])); if ( (ir->nkx != info.nkx[0]) || (ir->nky != info.nky[0]) || (ir->nkz != info.nkz[0]) ) gmx_fatal(FARGS, "Wrong fourierspacing %f nm, input file grid = %d x %d x %d, computed grid = %d x %d x %d", fs,ir->nkx,ir->nky,ir->nkz,info.nkx[0],info.nky[0],info.nkz[0]); } /* Estimate (S)PME force error */ /* Determine the volume of the simulation box */ if (MASTER(cr)) { info.volume = det(state.box); calc_recipbox(state.box,info.recipbox); info.natoms = mtop.natoms; info.bTUNE = bTUNE; } if (PAR(cr)) bcast_info(&info, cr); /* Get an error estimate of the input tpr file and do some tuning if requested */ estimate_PME_error(&info, &state, &mtop, fp, bVerbose, seed, cr); if (MASTER(cr)) { /* Write out optimized tpr file if requested */ if ( opt2bSet("-so",NFILE,fnm) || bTUNE ) { ir->ewald_rtol=info.ewald_rtol[0]; write_tpx_state(opt2fn("-so",NFILE,fnm),ir,&state,&mtop); } please_cite(fp,"Wang2010"); fclose(fp); } if (gmx_parallel_env_initialized()) { gmx_finalize(); } return 0; }
int gmx_pme_error(int argc,char *argv[]) { const char *desc[] = { "g_pme_error estimates the error of the electrostatic forces", "if using the SPME algorithm. The flag [TT]-tune[tt] will determine", "the splitting parameter such that the error is equally", "distributed over the real and reciprocal space part.", "As a part of the error stems from self interaction of the particles " "and is computationally very demanding a good a approximation is possible", "if just a fraction of the particles is used to calculate the average", "of this error by using the flag [TT]-self[tt].[PAR]", }; int repeats=2; real fs=0.0; /* 0 indicates: not set by the user */ real user_beta=-1.0; real fracself=-1.0; t_perf **perfdata; t_inputinfo info; t_state state; /* The state from the tpr input file */ gmx_mtop_t mtop; /* The topology from the tpr input file */ t_inputrec *ir=NULL; /* The inputrec from the tpr file */ FILE *fp=NULL; t_commrec *cr; unsigned long PCA_Flags; gmx_bool bTUNE=FALSE; static t_filenm fnm[] = { /* g_tune_pme */ { efTPX, "-s", NULL, ffREAD }, { efOUT, "-o", "error", ffWRITE }, { efTPX, "-so", "tuned", ffOPTWR } }; output_env_t oenv=NULL; t_pargs pa[] = { /***********************/ /* g_tune_pme options: */ /***********************/ { "-beta", FALSE, etREAL, {&user_beta}, "If positive, overwrite ewald_beta from tpr file with this value" }, { "-tune", FALSE, etBOOL, {&bTUNE}, "If flag is set the splitting parameter will be tuned to distribute the error equally in real and rec. space" }, { "-self", FALSE, etREAL, {&fracself}, "If positive, determine selfinteraction error just over this fraction (default=1.0)" } }; #define NFILE asize(fnm) cr = init_par(&argc,&argv); if (MASTER(cr)) CopyRight(stderr,argv[0]); PCA_Flags = PCA_NOEXIT_ON_ARGS; PCA_Flags |= (MASTER(cr) ? 0 : PCA_QUIET); parse_common_args(&argc,argv,PCA_Flags, NFILE,fnm,asize(pa),pa,asize(desc),desc, 0,NULL,&oenv); if (!bTUNE) bTUNE = opt2bSet("-so",NFILE,fnm); info.n_entries = 1; /* Allocate memory for the inputinfo struct: */ create_info(&info); info.fourier_sp[0] = fs; /* Read in the tpr file and open logfile for reading */ if (MASTER(cr)) { snew(ir,1); read_tpr_file(opt2fn("-s",NFILE,fnm), &info, &state, &mtop, ir, user_beta,fracself); fp=fopen(opt2fn("-o",NFILE,fnm),"w"); } /* Check consistency if the user provided fourierspacing */ if (fs > 0 && MASTER(cr)) { /* Recalculate the grid dimensions using fourierspacing from user input */ info.nkx[0] = 0; info.nky[0] = 0; info.nkz[0] = 0; calc_grid(stdout,state.box,info.fourier_sp[0],&(info.nkx[0]),&(info.nky[0]),&(info.nkz[0])); if ( (ir->nkx != info.nkx[0]) || (ir->nky != info.nky[0]) || (ir->nkz != info.nkz[0]) ) gmx_fatal(FARGS, "Wrong fourierspacing %f nm, input file grid = %d x %d x %d, computed grid = %d x %d x %d", fs,ir->nkx,ir->nky,ir->nkz,info.nkx[0],info.nky[0],info.nkz[0]); } /* Estimate (S)PME force error */ /* Determine the volume of the simulation box */ if (MASTER(cr)) { info.volume = det(state.box); calc_recipbox(state.box,info.recipbox); info.natoms = mtop.natoms; info.bTUNE = bTUNE; } if (PAR(cr)) bcast_info(&info, cr); /* Get an error estimate of the input tpr file */ estimate_PME_error(&info, &state, &mtop, fp, cr); if (MASTER(cr)) { ir->ewald_rtol=info.ewald_rtol[0]; write_tpx_state(opt2fn("-so",NFILE,fnm),ir,&state,&mtop); please_cite(fp,"Wang2010"); fclose(fp); } if (gmx_parallel_env_initialized()) { gmx_finalize(); } return 0; }