C
C Program INV4 to subtract two sets of grid values of a function
C describing the model:  GRID1-GRID2=GRID3.
C
C Date: 1996, September 30
C Coded by Ludek Klimes
C
C ......................................................................
C
C                                                    
C Description of the data files:
C
C Main input data file read from the interactive device (*):
C (1) 'GRID1','GRID2','GRID3',/
C     'GRID1','GRID2','GRID3'... Names of the input and output
C             files described below.
C     /...    Obligatory slash to enable future compatible extensions.
C     Default: 'GRID1'='inv3.dat', 'GRID2'='inv3.out',
C             'GRID3'='dif.out'.
C
C Input files 'GRID1','GRID2':
C (1) TEXTG,IGROUP
C     Identification of the group.
C     TEXTG...A string.  If its first character is 'I' or 'S', the
C             computed function describes a surface.  Otherwise, it
C             describes a material parameter.
C     IGROUP..Index of a surface, or of a complex block.
C (2) TEXTF
C     This input is not performed for a surface, i.e. if the first
C     character of textg (see above) is 'I' or 'S'.
C     TEXTF...String identifying a material parameter.
C (3) K1,K2,K3
C     K1,K2,K3... Indices of coordinates.
C (4) N1,N2,N3
C     N1,N2,N3... Numbers of grid lines.
C (5) X1(1),...,X1(N1)
C     The grid coordinates corresponding to the first independent
C     variable.
C (6) X2(1),...,X2(N2)
C     The grid coordinates corresponding to the second independent
C     variable.
C (7) X3(1),...,X3(N3)
C     The grid coordinates corresponding to the third independent
C     variable.
C (8) (((W(I1,I2,I3),I1=1,N1),I2=1,N2),I3=1,N3)
C     The values of function W at grid points. Function value
C     W(I1,I2,I3) corresponds to point (X1(I1),X2(I2),X3(I3)).
C
C Output file 'GRID3':
C (1) 'DIFFERENCES ............................' (a string)
C (2) (((D(I1,I2,I3),I1=1,N1),I2=1,N2),I3=1,N3)
C     Differences of function values.
C
C-----------------------------------------------------------------------
C
C     Filenames:
      CHARACTER*80 FILE1,FILE2,FILE3
C
C     Logical unit numbers:
      INTEGER LU1,LU2,LU3
      PARAMETER (LU1=11)
      PARAMETER (LU2=12)
      PARAMETER (LU3=13)
C
C     Auxiliary storage locations:
      CHARACTER*3 TEXT
      INTEGER MX
      PARAMETER (MX=100)
      INTEGER ICB,K1,K2,K3,N1,N2,N3,I1,I2,I3
      REAL X(MX,3),V1(MX),V2(MX)
C
C.......................................................................
C
C     Opening data files and reading the input data:
      WRITE(*,'(A)') ' Enter names of input and output files: '
      FILE1='inv3.dat'
      FILE2='inv3.out'
      FILE3='dif.out'
      READ(*,*) FILE1,FILE2,FILE3
      OPEN(LU1,FILE=FILE1,STATUS='OLD')
      OPEN(LU2,FILE=FILE2,STATUS='OLD')
      OPEN(LU3,FILE=FILE3)
      WRITE(*,'(A)') '+                                       '
C
      READ(LU1,*) TEXT,ICB
      READ(LU2,*) TEXT,I2
      IF(ICB.NE.I2) THEN
C       INV4-01
        CALL ERROR('INV4-01: Different index of a function')
      END IF
      IF(TEXT(1:1).NE.'I'.AND.TEXT(1:1).NE.'S') THEN
        READ(LU1,*) TEXT
        READ(LU2,*) TEXT
      END IF
      READ(LU1,*) K1,K2,K3
      READ(LU2,*) I1,I2,I3
      IF(K1.NE.I1.OR.K2.NE.I2.OR.K3.NE.I3) THEN
C       INV4-02
        CALL ERROR('INV4-02: Different indices of coordinates')
      END IF
      READ(LU1,*) N1,N2,N3
      READ(LU2,*) I1,I2,I3
      IF(N1.NE.I1.OR.N2.NE.I2.OR.N3.NE.I3) THEN
C       INV4-03
        CALL ERROR('INV4-03: Different numbers of grid lines')
      END IF
      IF(MAX0(N1,N2,N3).GT.MX) THEN
C       INV4-04
        CALL ERROR('INV4-04: Too many grid lines')
      END IF
      READ(LU1,*) (X(I1,K1),I1=1,N1)
      READ(LU2,*) (X(I1,K1),I1=1,N1)
      READ(LU1,*) (X(I2,K2),I2=1,N2)
      READ(LU2,*) (X(I2,K2),I2=1,N2)
      READ(LU1,*) (X(I3,K3),I3=1,N3)
      READ(LU2,*) (X(I3,K3),I3=1,N3)
      WRITE(LU3,'(A)') '''DIFFERENCES ............................'''
      DO 23 I3=1,N3
        DO 22 I2=1,N2
          READ(LU1,*) (V1(I1),I1=1,N1)
          READ(LU2,*) (V2(I1),I1=1,N1)
          DO 21 I1=1,N1
            V1(I1)=V1(I1)-V2(I1)
   21     CONTINUE
          WRITE(LU3,'(8F10.6)') (V1(I1),I1=1,N1)
   22   CONTINUE
        IF(N1.NE.1.AND.N2.NE.1) WRITE(LU3,*)
   23 CONTINUE
C
      STOP
      END
C
C=======================================================================
C
      INCLUDE 'error.for'
C     error.for
C
C=======================================================================
C