FUNCTION: dmc - computes ground state energy and wave function for particle in a box of length 2. CALLING SEQUENCE: dmc(tau,n_equil_blks, n_meas_blks, n_sweeps,n_wlks) PARAMETERS: tau - (imaginary) time step size (Del_tau in class) n_equil_blks - number of blocks used to equilibrate the random walk n_meas_blks - number of blocks used to measure energy Must be greater than 1; see aver_error in output. n_sweeps - number of steps -- sweeps thru walkers -- in each block n_wlks - number of walkers used to represent wave function in each step SYNOPSIS: - Scheme of code is as follows: 1. Randomly initialize the walkers and set up histogram to store them. 2. Equilibrate -- let random walk converge to ground state. 3. Measure the ground-state energy and wavefunction. 4. Output energy, error estimate and wavefunction in form of histogram in a file histdata. 5. There is a program plt which will plot histogram of walkers and compare it to the exact wavefunction. - Running time grows as (n_equil_blks + n_meas_blks) * n_sweeps * n_wlks; Second example below is 12 times as long as first example. EXAMPLES: dmc(0.05, 1, 2, 5, 10); dmc(0.05, 4, 5, 10, 20);
FUNCTION: energy - for each step (of all walkers), returns estimate of numerator and denominator for computing energy in dmc. CALLING SEQUENCE: energy() PARAMETERS: None but uses wlks (array of walkers), trlwfn (trial wavefunction). SYNOPSIS: - Scheme of code is as follows: 1. Go thru all the walkers, for each position adds H*phi_T for that position to numerator adds phi_T for that position to denominator 2. Returns both numerator and denominator - Present trial wavefunction is phi_T(x) = (1-x^2)^2.
FUNCTION: gaussian - generates a Gaussian random number with zero mean and unit variance. CALLING SEQUENCE: gaussian() PARAMETERS: None SYNOPSIS: - Based on the Box-Mueller algorithm discussed in class (Mon, 1/27). - The scheme is as follows: 1. Generate two random numbers x and y between [-1..1]. 2. Exclude those (x,y) such r = x^2 + y^2 >= 1. 3. From the "inverse factor" fac = sqrt(-2 ln(r))/r, we can produce two gaussian distributed numbers: (x*fac, y*fac). Note that the code avoids direct computations of 'cos' and 'sin', which are expensive. - This scheme is efficient; A VERY GOOD EXERCISE would be to compare it with the Metropolis algorithm.
FUNCTION: initialize - initializes walkers and histogram. CALLING SEQUENCE: initialize(tau, n_equil_blks, n_meas_blks, n_sweeps, n_wlks) PARAMETERS: Same as used by main program dmc. SYNOPSIS: - Dmc calls this function automatically. - Scheme of code is as follows: 1. Generates initial walker distribution (e.g., uniform inside box). 2. Initailizes value of histogram (wave function) in each bin to zero. 3. Creates functions - midpt - for computing midpoint position of each histogram bin - and bin - for computing which bin a given position x is in. 4. Also evaluates tauinv = 1/tau and rrtau = sqrt(tau) that are used elsewhere.
FUNCTION: output - puts successively numbered runs into file "histdata" The principal data list is called dataN where N is run number. The list contains histogram data for sampled wave function as well as exact wave function for plotting. CALLING SEQUENCE: output() PARAMETERS: None actually, but global varables are passed and created. the most important of which are: histarray - where output puts the histrogram data prior to output. histdata - name of file where output stores results for plotting dataN - data structue with wave function histogram suitable for plotting. The number N is assigned automatically and is printed on screen for your information. SYNOPSIS: - Prints on screen at conclusion of run: energy, error, run number (N), execution time - Rest of data is put in file histdata. Some data is printed as a comment such as the details of run parameters. These run parameters are also printed in the first two lines of the file dataN but are not presently used by programs. - Most of data structure dataN contains the histogram: bins, computed wavefunction and exact wavefunction for use by plotting routine.
FUNCTION: plt - make plot comparing histogram of diffusion Monte Carlo wave function and exact wave function. CALLING SEQUENCE: read histdata; plt(plot_dev,data_set) PARAMETERS: plot_dev - the choices are x11 (xterminal), ps (postscript) term (dumb terminal), vt100 (vt100 emulator). The default is term. data_set - the number of the data set you want to plot. These numbers are generated at end of each use of dmc. SYNOPSIS: - NOTE: must "read histdata;' prior to running plt. This needs to be done only once unless you run dmc again. - Produces a plot that compares DMC and exact wave functions. You can modify to put several DMC wave functions on same plot.
FUNCTION: step - does one step of random walk (sweep thru all walkers) CALLING SEQUENCE: step() PARAMETERS: None, but there are global variables shared with other routines: rr() - generates uniform random numbers between 0 and 1. gaussian() - generates gaussian random numbers with mean of zero and variance of unity. wlks - array storing the walkers. tauinv - 1/tau, used in computing image correction of the free Green's function, due to boundary condition rttau - sqrt(tau), used in generating free Green's function. SYNOPSIS: - Used inside the main program [dmc] to generate new set of walkers for each sweep. But idea of code is reusable. - Scheme of code is as follows: [ going right to left in Eq. (3) ] (a). Pick at random a walker whose value is a position -1=<dnow=<1 (b). Generate potential new walker from diffusion with free Green's function g_0, namely, dnxt := dnow + rttau*gaussian(); (c). Now deal with K(dnxt,dnow): 1). Test if dnxt is consistent with being inside length-two box. Free Green's function g_0 extends to infinity. 2). P in eq. (4) is exp(-2(1-abs(dnow))(1-abs(dnxt))/tau). If this is less than a random number, we accept dnxt. Otherwise return to step (a). BUG CHECK. - If program does not work, set printlevel to at least 5. And then type step(); If output not informative, increase printlevel to 10.