C
C Program GRDNORM to calculate the spatial density of the Lebesgue norm
C Ln of gridded values
C
C Version: 5.20
C Date: 1998, November 4
C
C Coded by: Ludek Klimes
C Department of Geophysics, Charles University Prague,
C Ke Karlovu 3, 121 16 Praha 2, Czech Republic,
C E-mail: klimes@seis.karlov.mff.cuni.cz
C
C.......................................................................
C
C
C Description of the data files:
C
C The data are read in by the list directed input (free format).
C In the description of data files, each numbered paragraph indicates
C the beginning of a new input operation (new READ statement).
C If the symbolic name of the input variable is enclosed in apostrophes,
C the corresponding value in input data is of the type CHARACTER, i.e.
C it should be a character string enclosed in apostrophes. If the first
C letter of the symbolic name is I-N, the corresponding value is of the
C type INTEGER. Otherwise, the input parameter is of the type REAL and
C may or may not contain a decimal point.
C
C Input data read from the * external unit:
C The interactive * external unit may also be redirected to the file
C containing the relevant data.
C (1) 'SEP','GRD','GRDNEW',/
C 'SEP'...String in apostrophes containing the name of the input
C SEP parameter file with the data specifying the dimensions
C of the input and output grids.
C Description of files SEP
C 'GRD'...String in apostrophes containing the name of the input
C ASCII files with the grid values.
C 'GRDNEW'... String in apostrophes containing the name of the
C output ASCII file containing the grid values of the
C calculated norm.
C /... Input data line must be terminated by a slash.
C Default: 'SEP'='grd.h', 'GRD'='grd.out', 'GRDNEW'='grdnew.out'.
C
C
C Data file 'SEP' has the form of the SEP (Stanford Exploration Project)
C parameter file:
C All the data are specified in the form of PARAMETER=VALUE, e.g.
C N1=50, with PARAMETER directly preceding = without intervening
C spaces and with VALUE directly following = without intervening
C spaces. The PARAMETER=VALUE couple must be delimited by a space
C or comma from both sides.
C The PARAMETER string is not case-sensitive.
C PARAMETER= followed by a space resets the default parameter value.
C All other text in the input files is ignored. The file thus may
C contain unused data or comments without leading comment character.
C Everything between comment character # and the end of the
C respective line is ignored, too.
C The PARAMETER=VALUE couples may be specified in any order.
C The last appearance takes precedence.
C Data specifying dimensions of the input 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 N4=positive integer... Number of spatial grids (number of time
C levels).
C Default: N4=1
C O1=real... First coordinate of the grid origin (first point of the
C grid).
C Default: O1=0.
C O2=real... Second coordinate of the grid origin.
C Default: O2=0.
C O3=real... Third coordinate of the grid origin.
C Default: O3=0.
C O4=real... Time corresponding to the first spatial grid.
C Default: O4=0.
C D1=real... Grid interval in the direction of the first coordinate
C axis.
C Default: D1=1.
C D2=real... Grid interval in the direction of the second coordinate
C axis.
C Default: D2=1.
C D4=real... Time interval.
C Default: D4=1.
C Data specifying dimensions of the output grid:
C N1NEW=positive integer
C N2NEW=positive integer
C N3NEW=positive integer
C O1NEW=real
C O2NEW=real
C O3NEW=real
C D1NEW=real
C D2NEW=real
C D3NEW=real
C D4NEW=real... Analogous to N1, N2, N3, N4, O1, O2, O3, O4, D1,
C D2, D3 and D4, respectively, but for the output grid.
C The output grid should be a coarser grid than the input
C grid. The input grid is then divided into the subgrids
C corresponding to individual gridpoints of the coarser
C output grid. Each subgrid is composed of gridpoints of
C the input grid, which are closer to the corresponding
C gridpoint than to other gridpoints of the output grid.
C Empty subgrids are not allowed. The Lebesgue norm Ln,
C where n is given by parameter GNORM, is calculated over
C each subgrid. Output file 'SEPNEW' thus describes the
C grid of the norms.
C Examples:
C (a) If 'SEPNEW' specifies grid N1=1 N2=1 N3=1 N4=1, the
C norm of the whole grid is calculated.
C (b) If 'SEPNEW' specifies grid N1=1 N2=1 N3=1, whereas N4
C is not specified and defaults to N4 of the input grid,
C the norm of the space grid is calculated separately at
C each time level. Output than consists of N4 norms.
C (c) If 'SEPNEW' specifies grid N2=1, whereas N1, N3 and N4
C are not specified and default to the dimensions of the
C input grid, input grid contains a probability density
C function and GNORM=1, the output grid contains the
C gridded marginal probability density in the X1X3 plane
C at each time level. Output than consists of N1*N3*N4
C values.
C Defaults: N1NEW=N1, N2NEW=N2, N3NEW=N3,
C O1NEW=O1, O2NEW=O2, O3NEW=O3,
C D1NEW=D1, D2NEW=D2, D3NEW=D3.
C Type of the norm:
C GNORM=real... The norm is [1/NSUB][sum(ABS(G)**GNORM)]**(1/GNORM).
C The summation is performed over each subgrid. NSUB is the
C number of points within the subgrid.
C If GNORM.EQ.0., the harmonic average is calculated.
C If GNORM.GT.998., the maximum is calculated.
C If GNORM.LT.-998., the minimum is calculated.
C Default: GNORM=1.
C
C=======================================================================
C
C Common block /RAMC/:
INCLUDE 'ram.inc'
C ram.inc
C
C.......................................................................
C
C Filenames and parameters:
CHARACTER*80 FILE1,FILE2,FILE3
INTEGER LU
REAL UNDEF
PARAMETER (LU=1,UNDEF=-999999.)
C Input data:
INTEGER N1,N2,N3,N4,N1NEW,N2NEW,N3NEW,N4NEW
REAL O1,O2,O3,O4,D1,D2,D3,D4
REAL O1NEW,O2NEW,O3NEW,O4NEW,D1NEW,D2NEW,D3NEW,D4NEW,GNORM
C Other variables:
INTEGER N123,N1234,NSUB,NALL,I,I1,I2,I3,I4
INTEGER INEW,I1NEW,I2NEW,I3NEW,I4NEW
INTEGER I1MIN,I2MIN,I3MIN,I4MIN,I1MAX,I2MAX,I3MAX,I4MAX
REAL X1,X2,X3,X4,RAMNEW
C
C.......................................................................
C
C Reading main input data:
FILE1='grd.h'
FILE2='grd.out'
FILE3='grdnew.out'
WRITE(*,'(A)')
* '+GRDNORM: Enter 2 filenames [grd.h, grd.out, grdnew.out]: '
READ(*,*) FILE1,FILE2,FILE3
WRITE(*,'(A)')
* '+GRDNORM: Reading, calculating... '
C
C Reading grid dimensions:
C Original grid:
CALL RSEP1(LU,FILE1)
CALL RSEP3I('N1',N1,1)
CALL RSEP3I('N2',N2,1)
CALL RSEP3I('N3',N3,1)
CALL RSEP3I('N4',N4,1)
CALL RSEP3R('O1',O1,0.)
CALL RSEP3R('O2',O2,0.)
CALL RSEP3R('O3',O3,0.)
CALL RSEP3R('O4',O4,0.)
CALL RSEP3R('D1',D1,1.)
CALL RSEP3R('D2',D2,1.)
CALL RSEP3R('D3',D3,1.)
CALL RSEP3R('D4',D4,1.)
C New grid:
CALL RSEP3I('N1NEW',N1NEW,N1)
CALL RSEP3I('N2NEW',N2NEW,N2)
CALL RSEP3I('N3NEW',N3NEW,N3)
CALL RSEP3I('N4NEW',N4NEW,N4)
CALL RSEP3R('O1NEW',O1NEW,O1)
CALL RSEP3R('O2NEW',O2NEW,O2)
CALL RSEP3R('O3NEW',O3NEW,O3)
CALL RSEP3R('O4NEW',O4NEW,O4)
CALL RSEP3R('D1NEW',D1NEW,D1)
CALL RSEP3R('D2NEW',D2NEW,D2)
CALL RSEP3R('D3NEW',D3NEW,D3)
CALL RSEP3R('D4NEW',D4NEW,D4)
C Type of the norm:
CALL RSEP3R('GNORM',GNORM,1.)
C
C Dimensions of the new grid related to the old one:
O1=(O1NEW+0.5*D1NEW-O1)/D1
O2=(O2NEW+0.5*D2NEW-O2)/D2
O3=(O3NEW+0.5*D3NEW-O3)/D3
O4=(O4NEW+0.5*D4NEW-O4)/D4
D1=D1NEW/D1
D2=D2NEW/D2
D3=D3NEW/D3
D4=D4NEW/D4
N123 =N1*N2*N3
C4 N1234=N1*N2*N3*N4
N1234=N1*N2*N3
C
IF(N1234+N1NEW*N2NEW*N3NEW*N4NEW.GT.MRAM) THEN
C GRDNORM-01
CALL ERROR('GRDNORM-01: Too small array RAM(MRAM)')
C Too small array RAM(MRAM) to allocate both input and output
C grid values. If possible, increase dimension MRAM in include
C file ram.inc.
END IF
C
C Reading input grid values:
C4 CALL RARAY(LU,FILE2,'FORMATTED',.TRUE.,UNDEF,N123,N4,RAM)
OPEN(LU,FILE=FILE2,FORM='FORMATTED',STATUS='OLD')
C
C Calculating the spatial densities of the Lebesgue norm:
NALL=0
I4MIN=0
DO 24 I4NEW=0,N4NEW-1
IF(I4.LT.N4NEW-1) THEN
X4=O4+FLOAT(I4)*D4
I4MAX=MIN0(INT(X4),N4-1)
ELSE
I4MAX=N4-1
END IF
DO 14 I4=I4MIN,I4MAX
CALL RARRAY(LU,' ','FORMATTED',.TRUE.,UNDEF,N123,RAM)
I3MIN=0
DO 23 I3NEW=0,N3NEW-1
IF(I3NEW.LT.N3NEW-1) THEN
X3=O3+FLOAT(I3NEW)*D3
I3MAX=MIN0(INT(X3),N3-1)
ELSE
I3MAX=N3-1
END IF
I2MIN=0
DO 22 I2NEW=0,N2NEW-1
IF(I2NEW.LT.N2NEW-1) THEN
X2=O2+FLOAT(I2NEW)*D2
I2MAX=MIN0(INT(X2),N2-1)
ELSE
I2MAX=N2-1
END IF
INEW=N1234+N1NEW*(I2NEW+N2NEW*(I3NEW+N3NEW*I4NEW))
I1MIN=0
DO 21 I1NEW=0,N1NEW-1
IF(I1NEW.LT.N1NEW-1) THEN
X1=O1+FLOAT(I1NEW)*D1
I1MAX=MIN0(INT(X1),N1-1)
ELSE
I1MAX=N1-1
END IF
RAMNEW=0.
NSUB=0
DO 13 I3=I3MIN,I3MAX
DO 12 I2=I2MIN,I2MAX
C4 I=I1MIN+N1*(I2+N2*(I3+N3*I4))
I=I1MIN+N1*(I2+N2*I3)
DO 11 I1=I1MIN,I1MAX
I=I+1
NSUB=NSUB+1
IF(GNORM.EQ.0.) THEN
RAMNEW=RAMNEW+ALOG(RAM(I))
ELSE IF(GNORM.GT.998.) THEN
RAMNEW=AMAX1(RAM(I),RAMNEW)
ELSE IF(GNORM.LT.-998.) THEN
RAMNEW=AMIN1(RAM(I),RAMNEW)
ELSE
RAMNEW=RAMNEW+ABS(RAM(I))**GNORM
END IF
11 CONTINUE
12 CONTINUE
13 CONTINUE
NALL=NALL+NSUB
IF(NSUB.EQ.0) THEN
C
C GRDNORM-02
CALL ERROR('GRDNORM-02: Empty subgrid')
C The Lebesgue norm cannot be calculated and averaged
C over an empty subgrid consisting of no gridpoint of
C the given grid. Check the data for the 'new' grid.
END IF
IF(GNORM.GE.-998..AND.GNORM.LE.998.) THEN
RAMNEW=RAMNEW/FLOAT(NSUB)
IF(GNORM.EQ.0.) THEN
RAMNEW=EXP(RAMNEW)
ELSE
RAMNEW=RAMNEW**(1./GNORM)
END IF
END IF
INEW=INEW+1
RAM(INEW)=RAMNEW
I1MIN=I1MAX+1
21 CONTINUE
I2MIN=I2MAX+1
22 CONTINUE
I3MIN=I3MAX+1
23 CONTINUE
I4MIN=I4MAX+1
14 CONTINUE
24 CONTINUE
IF(NALL.NE.N1*N2*N3*N4) THEN
WRITE(*,*) ' Subgrids cover',NALL,' gridpoints of',N1*N2*N3*N4
C GRDNORM-03
CALL ERROR('GRDNORM-03: Gaps between subgrids')
C This error should not apperar. Contact the author.
END IF
C
C Writing output grid values:
CALL WARAY(LU,FILE3,'FORMATTED',.TRUE.,UNDEF,.FALSE.,0.,
* N1NEW*N2NEW*N3NEW,N4NEW,RAM(N1234+1))
WRITE(*,'(A)')
* '+GRDNORM: 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
C
C=======================================================================
C