File: RELATIVE:/../../../mfix.git/model/check_data/check_axis.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2     !                                                                      !
3     !  Subroutine: CHECK_AXIS                                              !
4     !  Author: P. Nicoletti                               Date: 27-NOV-91  !
5     !                                                                      !
6     !  Purpose: check geometry data for one axis                           !
7     !                                                                      !
8     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
9           SUBROUTINE CHECK_AXIS(NA, DIMEN, ALENGTH, DA, AXIS, &
10              AXIS_INDEX, NO_IJK, SHIFT)
11     
12     !-----------------------------------------------
13     ! Modules
14     !-----------------------------------------------
15           USE param
16           USE param1
17     !      USE funits
18     
19           use error_manager
20     
21     
22           IMPLICIT NONE
23     !-----------------------------------------------
24     ! Dummy arguments
25     !-----------------------------------------------
26     ! number of axis cells (IMAX,JMAX,KMAX)
27           INTEGER, INTENT(INOUT) :: NA
28     ! maximum number of cells along axis based on domain decomposition
29           INTEGER, INTENT(IN) :: DIMEN
30     ! axis length (XLENGTH,YLENGTH,ZLENGTH)
31           DOUBLE PRECISION, INTENT(INOUT) :: ALENGTH
32     ! flag that specifies whether variation along that axis is
33     ! considered (passed variable for NO_I, NO_J, or NO_K)
34           LOGICAL, INTENT(IN) :: NO_IJK
35     ! shift dx, dy and dz values (true only for new and restart_1 runs)
36           LOGICAL, INTENT(IN) :: SHIFT
37     ! axis checked ('X','Y','Z')
38           CHARACTER, INTENT(IN) :: AXIS
39     ! index associated with AXIS ('I','J','K')
40           CHARACTER, INTENT(IN) :: AXIS_INDEX
41     ! cell sizes (DX,DY,DZ);
42     ! use explicit dimension for DA
43     ! DA should be dimensioned DA(DIMEN) rather than DA(0:DIMEN+1) to be
44     ! able to use the logic from previous versions that assumed DA(1)
45     ! as the first element.  An error check has been added to ensure that
46     ! DX, DY and DZ definitions in mfix.dat starts with the zeroth
47     ! element; i.e. DA(1).
48           DOUBLE PRECISION, INTENT(INOUT), DIMENSION(DIMEN) :: DA
49     !-----------------------------------------------
50     ! Local parameters
51     !-----------------------------------------------
52     ! percent error allowed in axis length checks
53           DOUBLE PRECISION, PARAMETER :: PERCENT_ERROR = 1.0
54     !-----------------------------------------------
55     ! Local variables
56     !-----------------------------------------------
57     ! number of items specified from NA, ALENGTH, DA
58           INTEGER :: N_SPECIFIED
59     ! loop counter
60           INTEGER :: LC
61     ! temporary storage
62           DOUBLE PRECISION :: TEMP_STOR, lSUM, lERR
63     !-----------------------------------------------
64     
65     
66           CALL INIT_ERR_MSG("CHECK_AXIS")
67     
68     ! 0) Ensure that if DA is defined then it starts with DA(1); i.e. DX(0), DY(0) or DZ(0)
69           IF(.NOT.NO_IJK)THEN
70             IF( DA(2) /= UNDEFINED .AND. DA(1) == UNDEFINED) THEN
71               WRITE(ERR_MSG, 1001) AXIS
72               CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
73             ENDIF
74           ENDIF
75     
76      1100 FORMAT('Error 1100: The grid specification must start with D',   &
77              A1,'(0)',/'Please correct the mfix.dat file.')
78     
79     ! 1) MAKE SURE AT LEAST TWO OF NA, ALENGTH, DA ARE SPECIFIED
80           N_SPECIFIED = 0
81           IF (NA /= UNDEFINED_I) N_SPECIFIED = N_SPECIFIED + 1
82           IF (ALENGTH /= UNDEFINED) N_SPECIFIED = N_SPECIFIED + 1
83           IF (DA(1) /= UNDEFINED) N_SPECIFIED = N_SPECIFIED + 1
84           IF (N_SPECIFIED < 2) THEN
85              WRITE(ERR_MSG, 1101) AXIS, AXIS, AXIS, AXIS_INDEX
86              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
87           ENDIF
88     
89      1101 FORMAT('Error 1101: Insufficient grid information for ',A1,'-',   &
90              'axis. You must',/'specify at least two of the following: ',  &
91              A1,'LENGTH, D',A1,', and ',A1,'MAX','Please correct the ',    &
92              'mfix.dat file.')
93     
94     
95     ! 2) NUMBER OF CELLS NOT SPECIFIED - calculate NA based on
96     !    input that was specified
97           IF(NA == UNDEFINED_I) THEN
98             IF(no_ijk) THEN
99               na = 1
100             ELSE
101               IF(DA(2) == UNDEFINED) THEN
102                 TEMP_STOR = ALENGTH/DA(1)
103                 NA = NINT(TEMP_STOR)
104                 IF(NA - 1 > 0) DA(2:NA) = DA(1)
105               ELSE
106                 NA = DIMEN
107                 DO LC = 2, DIMEN
108                    IF (DA(LC) == UNDEFINED) THEN
109                       NA = LC - 1
110                       EXIT
111                    ENDIF
112                 ENDDO
113               ENDIF
114             ENDIF
115             GO TO 700
116           ENDIF
117     
118     
119           IF(NA>=0 .AND. NA<=DIMEN) THEN
120     
121     ! 3) AXIS LENGTH NOT SPECIFIED - calculate ALENGTH based on
122     !    input that was specified
123              IF (ALENGTH == UNDEFINED) THEN
124                 IF(no_ijk) THEN
125                    ALENGTH = DA(1)
126                 ELSE
127                    IF(DA(2) == UNDEFINED) THEN
128                       IF(NA - 1 > 0) DA(2:NA) = DA(1)
129                    ENDIF
130                    ALENGTH = 0.0
131                    IF (NA > 0) ALENGTH = SUM(DA(:NA))
132                 ENDIF
133              ENDIF
134     
135     ! 4) CELL SIZE NOT SPECIFIED - calculate NON_VARIABLE DA based on
136     !    input that was specified
137              IF(DA(1) == UNDEFINED) THEN
138                 TEMP_STOR = ALENGTH/DBLE(NA)
139                 IF(NA > 0) DA(:NA) = TEMP_STOR
140              ENDIF
141     
142     ! 5) ALL 3 SPECIFIED
143              IF(.NOT.NO_IJK) THEN
144                 IF(DA(2) == UNDEFINED) THEN
145                    IF (NA - 1 > 0) DA(2:NA) = DA(1)
146                 ENDIF
147              ENDIF
148     
149           ENDIF
150     
151     ! 6) CHECK CONSISTENCY OF AXIS INPUT
152       700 CONTINUE
153     
154     ! This must be a legacy check because the code shouldn't get here
155     ! without exiting and DIMEN is calculated, not a hard-coded param.
156           IF (NA<0 .OR. .NOT.NO_IJK .AND. NA>DIMEN-2) THEN
157              WRITE(ERR_MSG, 1001) AXIS_INDEX//'MAX', trim(iVal(NA))
158              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
159           ENDIF
160     
161           IF(ALENGTH <= 0.0) THEN
162              WRITE(ERR_MSG, 1001) AXIS//'LENGTH'
163              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
164           ENDIF
165     
166           lSUM = 0.0
167           DO LC = 1, NA
168              IF (DA(LC)<=0.0 .OR. DA(LC)==UNDEFINED) THEN
169                 WRITE(ERR_MSG, 1201) trim(iVar(AXIS,LC))
170                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
171              ENDIF
172              lSUM = lSUM + DA(LC)
173           ENDDO
174     
175      1201 FORMAT('Error 1201: D',A,' is not specified or negative. ',      &
176              'Please correct',/'the mfix.dat file.')
177     
178     
179           lERR = 100.0*ABS(lSUM - ALENGTH)/ALENGTH
180           IF(lERR > PERCENT_ERROR) THEN
181              WRITE(ERR_MSG,1202) AXIS, AXIS, AXIS, ALENGTH, AXIS, lSUM, &
182                 lERR, PERCENT_ERROR
183              CALL FLUSH_ERR_MSG(FOOTER=.FALSE.)
184     
185              DO LC = 1, NA
186                 WRITE(ERR_MSG,"(4x,A,' = ',A)") trim(iVar('D'//AXIS,LC)),   &
187                    trim(iVal(DA(LC)))
188                 CALL FLUSH_ERR_MSG(HEADER=.FALSE., FOOTER=.FALSE.)
189              ENDDO
190              WRITE(ERR_MSG,"('Please correct the mfix.dat file')")
191              CALL FLUSH_ERR_MSG(HEADER=.FALSE., ABORT=.TRUE.)
192           ENDIF
193     
194      1202 FORMAT('Error 1202: ',A1,'LENGTH and sum(D',A1,') are not ',     &
195              'consistent.',/3x,A1,'LENGTH = ',g12.5,3x,'sum(D',A1,') = ',  &
196              g12.5,/3x,'ERROR   = ',g12.5,3x,'ERR TOL = ',g12.5,/'  ')
197     
198           DO LC = NA + 1, DIMEN
199              IF(SHIFT .AND. DA(LC)/=UNDEFINED) THEN
200                 WRITE(ERR_MSG, 1205) AXIS, AXIS_INDEX
201                 CALL ERROR_ROUTINE ('check_one_axis', 'AXIS error', 0, 2)
202                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
203              ENDIF
204           ENDDO
205     
206      1205 FORMAT('Error 1205: Too many D',A1,' values specified. Only ',A1,&
207              'MAX permitted.',/'Please correct the mfix.dat file.')
208     
209     
210           CALL FINL_ERR_MSG
211     
212           RETURN
213     
214     
215      1001 FORMAT('Error 1001: Illegal or unknown input: ',A,' = ',A,/      &
216              'Please correct the mfix.dat file.')
217     
218           END SUBROUTINE CHECK_AXIS
219