C
C Program GRDRAN to compute the pseudorandom numbers distributed
C uniformly between -0.5 and 0.5 on the input grid.
C
C Version: 6.00
C Date: 2006, June 9
C
C Coded by Petr Bulant
C Department of Geophysics, Charles University Prague,
C Ke Karlovu 3, 121 16 Praha 2, Czech Republic,
C E-mail: bulant@seis.karlov.mff.cuni.cz
C
C.......................................................................
C
C Description of data files:
C
C Input data read from the standard input device (*):
C The data are read by the list directed input (free format) and
C consist of a single string 'SEP':
C 'SEP'...String in apostrophes containing the name of the input
C SEP parameter or history file with the input data.
C No default, 'SEP' must be specified and cannot be blank.
C
C
C Input data file 'SEP':
C File 'SEP' has the form of the SEP
C parameter file. The parameters, which do not differ from their
C defaults, need not be specified in file 'SEP'.
C Data specifying the parameters of the grid:
C N1=positive integer... Number of gridpoints along the X1 axis.
C Default: N1=1
C N2=positive integer... Number of gridpoints along the X2 axis.
C Default: N2=1
C N3=positive integer... Number of gridpoints along the X3 axis.
C Default: N3=1
C Data specifying the distribution:
C RANDIS='string'... Character specifying the distribution:
C RANDIS='U' or RANDIS='u': Uniform distribution between
C -0.5 and 0.5.
C RANDIS='G' or RANDIS='g': Gaussian distribution.
C Default: RANDIS='U'
C Selection of a particular pseudorandom representation:
C ISEED=integer ... Nonzero integer seed for the generation of
C pseudorandom numbers. Its sign is ignored.
C Default: ISEED=-1.
C Name of output formatted file with the computed values:
C RANOUT='string'
C Default: RANOUT='grdran.out'
C For general description of the files with gridded data refer to
C file forms.htm.
C Optional parameters specifying the form of the real quantities
C written in the output formatted files:
C MINDIG,MAXDIG=positive integers ... See the description in file
C forms.for.
C
C-----------------------------------------------------------------------
C
C Subroutines and external functions required:
EXTERNAL ERROR,RSEP1,RSEP3T,RSEP3I,WARRAY,RAN3
REAL RAN3
C ERROR...File error.for.
C RSEP1,RSEP3T,RSEP3I...
C File sep.for.
C WARRAY..File forms.for.
C RAN3... File ran3.for.
C
C Common block /RAMC/:
INCLUDE 'ram.inc'
C ram.inc
C
CHARACTER*80 FILSEP,FILOUT
CHARACTER*1 RANDIS
INTEGER LU1
PARAMETER (LU1=1)
INTEGER N1,N2,N3,ISEED,I1,N1N2N3
C-----------------------------------------------------------------------
C
C Reading a name of the file with the input data:
WRITE(*,'(A)') '+GRDRAN: Enter input filename: '
FILSEP=' '
READ(*,*) FILSEP
C
C Reading all the data from the SEP file into the memory:
IF (FILSEP.NE.' ') THEN
CALL RSEP1(LU1,FILSEP)
ELSE
C GRDRAN-01
CALL ERROR('GRDRAN-01: SEP file not given')
ENDIF
C
WRITE(*,'(A)') '+GRDRAN: Working ... '
C
C Filename of the output file:
CALL RSEP3T('RANOUT',FILOUT,'grdran.out')
C The values describing the grid:
CALL RSEP3I('N1',N1,1)
CALL RSEP3I('N2',N2,1)
CALL RSEP3I('N3',N3,1)
N1N2N3=N1*N2*N3
IF (N1N2N3.GT.MRAM) THEN
C GRDRAN-02
CALL ERROR('GRDRAN-02: Small array RAM.')
ENDIF
C Reading distribution:
CALL RSEP3T('RANDIS',RANDIS,'U')
C Reading numerical constant ISEED:
CALL RSEP3I('ISEED',ISEED,-1)
C
C Random numbers:
C Uniform distribution
IF (RANDIS.EQ.'U'.OR.RANDIS.EQ.'u') THEN
DO 10, I1=1,N1N2N3
RAM(I1)=RAN3(ISEED)-0.5
10 CONTINUE
ELSE IF (RANDIS.EQ.'G'.OR.RANDIS.EQ.'g') THEN
C Gaussian distribution
DO 21, I1=1,N1N2N3,2
20 CONTINUE
V1=2.*RAN3(ISEED)-1.
V2=2.*RAN3(ISEED)-1.
VV=V1*V1+V2*V2
IF(VV.GE.1.) GO TO 20
VV=SQRT(-2.*ALOG(VV)/VV)
RAM(I1)=V1*VV
IF (I.LT.N1N2N3) THEN
RAM(I1+1)=V2*VV
END IF
21 CONTINUE
ELSE
C GRDRAN-03
CALL ERROR('GRDRAN-03: Unknown distribution.')
C Check the value of parameter RANDIS.
ENDIF
C
IF (FILOUT.NE.' ') THEN
CALL WARRAY(LU1,FILOUT,'FORMATTED',.FALSE.,0.,.FALSE.,0.,
* N1N2N3,RAM)
ENDIF
WRITE(*,'(A)') '+GRDRAN: Done. '
STOP
END
C
C=======================================================================
C
INCLUDE 'error.for'
C error.for
INCLUDE 'sep.for'
C sep.for
INCLUDE 'forms.for'
C forms.for
INCLUDE 'length.for'
C length.for
INCLUDE 'ran3.for'
C ran3.for of Numerical Recipes
C
C=======================================================================
C