Sie sind auf Seite 1von 7

cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccc SUBROUTINE AVERAGE (MAG.

ENERGY,CHI,CB,IGROUP) c fine group averages from group add and sums these to total averages; c calculate undertainties and display results cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccc c Global variables INCLUDE 'PARAM.E8' INCLUDE 'TO.ALL' C Input/Ouput Variables : c all of the thermodynamics quant have 2 indices c (not all array elements are used, e.g. CHI (sweep,value)) c first index is the level: sweep, group, or total c second index is value: quantity, quant**2, or sigma**2 REAL MAG (3,3) REAL ENERGY (3,3) REAL CB (3,3) REAL CHI (3,3) INTEGER IGROUP c !magnetization !energy !specific heat !susceptibility !group index (input)

local variables REAL M, MSIG1, MSIG2 !magnetization and uncertainties REAL E, ESIG1, ESIG2 !energy and uncertainties REAL SUS, SUSSIG !which level of calculation INTEGER VALUE, SQUARE,TOTAL !which quantity DATA SWEEP,GROUP,TOAL/1,2,3/ DATA VALUE,SQUARE,SIGSQ/1,2,3/ CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC c 10 calculate group average and uncertainties from grup sums DO 10 IQUANT=VALUE,SQUARE MAG (GROUP,IQUANT)=MAG (GROUP,IQUANT)/NSIZE CONTINUE CHI (GROUP,VALUE)=MAG(GROUP,SQUARE)-MAG(GROUP,VALUE)**2 MAG (GROUP,SIGSQ)=CHI(GROUP,VALUE)/NSIZE IF (MAG(GROUP,SIGSQ).LT.0.) MAG(GROUP,SIGSQ)=0 CB (GROUP,VALUE)=ENERGY(GROUP,SQUARE)-ENERGY(GROUP,VALUE)**2 ENERGY (GROUP,SIGSQ)=CB(GROUP,VALUE)/NSIZE IF (ENERGY(GROUP,SIGSQ) .LT. 0.) ENERGY(GROUP,SIGSQ)=0. CHI(GROUP,SQUARE)=CHI(GROUP,VALUE)**2 CB (GROUP,SQUARE)=CB(GROUP,VALUE)**2 C C add group averages to toal sums DO 20 IQUANT=VALUE,SIGSQ MAG(TOTAL,IQUANT)=MAG(TOTAL,IQUANT)+MAG(GROUP,IQUANT) ENERGY(TOTAL,IQUANT)=ENERGY(TOTAL,IQUAN)+ENERGY(GROUP,IQUANT) CHI(TOTAL,IQUANT)=CHI(TOTAL,IQUANT)+CHI(GROUP,IQUANT) CB(TOTAL,IQUANT)=CB(TOTAL,IQUANT)+CB(GROUP,IQUANT) CONTINUE find total avarages using total sums accumulated so far M=MAG(TOTAL,VALUE)/IGROUP MSIG1=(MAG(TOTAL,SQUARE)/IGROUP-M**2)/IGROUP/NSIZE IF (MSIG1 .LT. 0) MSIG1=0. MSIG1=SQRT(MSIG1) MSIG2=SQRT(MAG(TOTAL,SIGSQ))/IGROUP

20 c c

c E=ENERGY(TOTAL,VALUE)IGROUP ESIG1=(ENERGY(TOTAL,SQUARE)/IGROUP-E**2)/IGROUP/NSIZE IF(ESIG1 .LT. 0) ESIG1=0. ESIG1=SQRT(ESIG1) ESIG2=SQRT(ENERGY(TOTAL,SIGSQ))/IGROUP c SUS=CHI(TOTAL,VALUE)/IGROUP SUSSIG=(CHI(TOTAL,SQUARE)/IGROUP-SUS**2)/IGROUP IF (SUSSIG .LT. 0.) SUSSIG=0. c C=CB(TOTAL,VALUE)/IGROUP CSIG=(CB(TOTAL,SQUARE)IGROUP-C**2)/IGROUP IF (CSIG .LT. 0.) CSIG=0. CSIG=SQRT(CSIG) c c write out summary IF (TTERM) CALL TXTOUT(MAG,ENERGY,CB,CHI,E,ESIG1,ESIG2, + M,MSIG1,MSIG2,SUS,SUSSIG,C,CSIG,IGROUP,OUNIT) IF (TITLE) CALL TXTOUT(MAG,ENERGY,CB,CHI,E,ESIG1,ESIG2, + M,MSIG1,MSIG2,SUS,SUSSIG,C,CSIG,IGROUP,TUNIT)

c RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC SUBROUTINE ZERO(ILEVEL,MAG,ENERGY,CHI,CB) c zero sums for ILEVEL thermodynamic values CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC c Input/Output variables: INTEGER ILEVEL !which level to zero (input) c all of the thermodynamic quant have 2 indices c (not all array elements are used, e.g. CHI(sweep,value)) c first index is the level: sweep, group, or total c second index is the value: quantity, quant**2, or sigma**2 REAL MAG(3,3) !magnetization (output) REAL ENERGY(3,3) !energy (output) REAL CB(3,3) !specific heat (output) REAL CHI(3,3) !susceptibility c Local variable: INTEGER IQUANT !which quantity CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC DO 10 IQUANT=1,3 MAG(ILEVEL,IQUANT)=0. ENERGY(ILEVEL,IQUANT)=0. CHI(ILEVEL,IQUANT)=0. CB (ILEVEL,IQUANT)=0. 10 CONTINUE RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC SUBROUTINE INIT c initializies constants, display header screen, c initializies menu arrays for input parameters CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC C Global variables:

INCLUDE 'IO.ALL' INCLUDE 'MENU.ALL' INCLUDE 'PARAM.E8' c Local parameters: CHARACTER*80 DESCRP !program description DIMENSION DESCRP(20) INTEGER NHEAD,NTEXT,NGRAPH !number of lines for each descri ption CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC c get enviroment parameters CALL SETUP c c display header screen DESCRP(1)='EXAMPLE 8' DESCRP(2)='Monte Carlo simulation of the 2-D Ising Model' DESCRP(3)='using Metropolis algorithm' NHEAD=3 c c text output description DESCRP(4)= 'acceptance rate, energy, magnetization, specific heat' DESCRP(5)= 'and susceptibility (all are values per spin)' NTEXT=2 c c graphics output description DESCRP(6)='spin configuration (blank=-1; x=+1)' NGRAPH=1 c CALL HEADER(DESCRP,NHEAD,NTEXT,NGRAPH) c c setup menu arrays, beginning with constant part CALL MENU c MTYPE(13)=FLOAT MPRMPT(13)='Enter value for magnetic field (units of kT)' MTAG(13)='magnetic field (units of kT)' MLOLIM(13)=-20. MHILIM(13)=20. MREALS(13)=0. c MTYPE(14)=FLOAT MPRMPPT(14)='Enter value for interaction strength (units of kT)'MTAG(14) ='interaction strength (units of kT)' MLOLIM(14)=-20. MHILIM(14)=20. MREALS(14)=.3 c MTYPE(15)=SKIP MREALS(15)=35. c MTYPE(38)=NUM MPRMPT(38)='Enter number of X lattice points' MTAG(38)='Number of X lattice points' MLOLIM(38)=2. MHILIM(38)=MAXX MINTS(38)=20 c MTYPE(39)=NUM MPRMPT(39)='Enter number of Y lattice points' MTAG(39)='Number of Y lattice points'

MLOLIM(39)=2. MHILIM(39)=MAXY MINTS(39)=20 c MTYPE(40)=NUM MPRMPT(40)='Integer random number seed for init fluctuation' MTAG(40)='Random number seed' MLOLIM(40)=1000. MHILIM(40)=99999. MINTS(40)=54767 c MTYPE(41)=NUM MPRMPT(41)='Number of thermalization sweeps' MTAG(41)='Thermalization sweeps' MLOLIM(41)=0 MHILIM(41)=1000 MINTS(41)=20 c MTYPE(42)=NUM MPRMPT(42)='Enter sampling frequency (to avoid coorelations)' MTAG(42)='Sampling frequency' MLOLIM(42)=1 MHILIM(42)=100 MINTS(42)=5 c MTYPE(43)=NUM MPRMPT(43)='Number of samples in a group' MTAG(43)='Group size' MLOLIM(43)=1 MHILIM(43)=1000 MINTS(43)=10 c MTYPE(44)=NUM MPRMPT(43)='Enter number of groups' MTAG(43)='Number of groups' MLOLIM(43)=1 MHILIM(43)=1000 MINTS(43)=10 c MTYPE(45)=SKIP MREALS(45)=60. c MSTRNG(MINTS(75))='example8.txt' c MTYPE(76)=BOOLEN MPRMPT(76)='Do you want the short version of the output?' MTAG(76)='Short version of output' MINTS(76)=0 c MTYPE(77)=SKIP MREALS(77)=80. c MSTRNG(MINTS(86))='exmpl8.grf' c MTYPE(87)=SKIP MREALS(87)=90. c RETURN

END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC SUBROUTINE PARAM c gets parameters from screen c ends program on request c closes old files c maps menu variables to program variables c open new files c calculates all derivative parameters c performs checks on parameters CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC c Global variables: INCLUDE 'MENU.ALL' INCLUDE 'IO.ALL' INCLUDE 'PARAM.E8' c Local variebles: INCLUDE 'MENU.ALL' INCLUDE 'IO.ALL' INCLUDE 'PARAM.E8' c Local variables: INTEGER IF !possible values for sum of neig hb. spins c map between menu indices and parameters INTEGER IB,IJ,INX,INY,IDSEED,INTHRM,INFREQ,INSIZE,INGRP,ITERSE PARAMETER (IB =13) PARAMETER (IJ =14) PARAMETER (INX =38) PARAMETER (INY =39) PARAMETER (IDSEED =40) PARAMETER (INTHRM =41) PARAMETER (INFREQ =42) PARAMETER (INSIZE =43) PARAMETER (INGRP =44) PARAMETER (ITERSE =76) c Functions: LOGICAL LOGCVT !converts l and 0 to true and fa lse CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC c get input from terminal CALL CLEAR CALL ASK(1,STOP) c c stop progam if requested IF (MREALS(IMAIN) .EQ. STOP) CALL FINISH c c close files if necessary IF (TNAME .NE. MSTRING(MINTS(ITNAME))) + CALL FLCLOS(TNAME,TUNIT) IF(GNAME .NE. MSTRNG(MINTS(IGNAME))) + CALL FLCOS(GNAME,GUNIT) c c set new parameter values c physical and numerical B=MREALS(IB) J=MREALS(IJ) NX=MINTS(INX)

NY=MINTS(INY) DSEED=DBLE(MINTS(IDSEED)) NTHERM=MINTS(INTHRM) NFREQ=MINTS(INFREQ) NSIZE=MINTS(INSIZE) NGROUP=MINTS(INGRP) c c text output TTERM=LOGCTV(MINTS(ITTERM)) TFILE=LOGCTV(MINTS(ITFILE)) TNAME=MSTRNG(MINTS(ITNAME)) TERSE=LOGCTV(MINTS(ITERSE)) graphics output GTERM=LOGCTV(MINTS(ITTERM)) GHRDCP=LOGCTV(MINTS(IGHRD)) GFILE=LOGCTV(MINTS(IGFILE)) GNAME=MSTRNG(MINTS(IGNAME)) open files IF (TFILE) CALL FLOPEN(TNAME,TUNIT) IF (GFILE) CALL FLOPEN(GNAME,GUNIT) !files may have been renamed MSTRNG(MINTS(ITNAME))=TNAME MSTRNG(MINTS(IGNAME))=GNAME c CALL CLEAR c c calculate derivative parameters NSPIN=NX*NY DO 10 IF=-4,4,2 !ratio of prob.;not all matrix elem are used RATIO(IF,-1)=EXP(2*(J*IF+B)) RATIO(IF,1)=1./RATIO(IF,-1) 10 CONTINUE c c calculate parameters for best looking for best looking text display IF (2*NX .LE. TRMWID) THEN XSKIP=.TRUE. !skip spaces in x xcntr=(TRMWID-2*NX)/2 !how to center display ELSE XSKIP=.FALSE. XCNTR=(TRWID-NX)/2 END IF IF (XCNTR .LT.1) XCNTR=1 IF (2*NY .LE. TRMLIN-5) THEN YSKIP=.TRUE. !skip lines in y YCNTR=(TRMLIN-2*NY)/2-3 !how to center display ELSE YSKIP=.FALSE. YCNTR=(TRMLIN-NY)/2-3 END IF IF (YCNTR .LT. 0) YCNTR=0 c RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC SUBROUTINE PRMOUNT(MUNIT,NLINES)

c c

c c

c write out parameter summary to MUNIT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC c Global variables: INCLUDE 'IO.ALL' INCLUDE 'PARAM.E8' c Input variables: INTEGER MUNIT !fortran unit number INTEGER NLINES !number of lines sent to terminal CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCC IF (MUNIT .EQ.QUNIT) CALL CLEAR c WRITE (MUNIT,5) WRITE (MUNIT,6) WRITE (MUNIT,7) B WRITE (MUNIT,8) J

Das könnte Ihnen auch gefallen