File: RELATIVE:/../../../mfix.git/model/read_namelist.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2     !                                                                      !
3     !     Module name: READ_NAMELIST(POST)                                 !
4     !     Author: P. Nicoletti                            Date: 25-NOV-91  !
5     !                                                                      !
6     !     Purpose: Read in the NAMELIST variables                          !
7     !                                                                      !
8     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
9           SUBROUTINE READ_NAMELIST(READ_ACTION)
10     
11           USE bc
12           USE cdist
13           USE compar
14           USE constant
15           USE cutcell
16           USE dashboard
17           USE des_bc
18           USE des_rxns
19           USE des_thermo
20           USE discretelement
21           USE error_manager
22           USE fldvar
23           USE funits
24           USE geometry
25           USE ic
26           USE indices
27           USE is
28           USE leqsol
29           USE mfix_pic
30           USE output
31           USE parallel
32           USE param
33           USE param1
34           USE particle_filter
35           USE physprop
36           USE pic_bc
37           USE polygon
38           USE ps
39           USE qmom_kinetic_equation
40           USE quadric
41           USE residual
42           USE run
43           USE rxns
44           USE scalars
45           USE scales
46           USE stiff_chem
47           USE toleranc
48           USE ur_facs
49           USE usr
50           USE utilities, ONLY: blank_line, line_too_big, seek_comment
51           USE vtk
52           Use stl
53     
54           IMPLICIT NONE
55     
56     ! Dummy Arguments:
57     !------------------------------------------------------------------------//
58     ! Specify how much of the input to process.
59           INTEGER, INTENT(IN) :: READ_ACTION
60     
61     ! Local Variables:
62     !------------------------------------------------------------------------//
63     ! LINE_STRING(1:MAXCOL) has valid input data
64           INTEGER, PARAMETER :: MAXCOL = 80
65     ! Holds one line in the input file
66           CHARACTER(LEN=512) :: LINE_STRING
67     ! Length of noncomment string
68           INTEGER :: LINE_LEN
69     ! Line number
70           INTEGER :: LINE_NO
71     ! Coefficient of restitution (old symbol)
72           DOUBLE PRECISION e
73     ! Indicates whether currently reading rxns or rate
74           LOGICAL :: RXN_FLAG
75     ! Indicate whether to do a namelist read on the line
76           LOGICAL :: READ_FLAG
77     ! Logical to check if file exits.
78           LOGICAL :: lEXISTS
79     ! Error flag
80           LOGICAL :: ERROR
81     
82           CHARACTER(len=256) :: STRING
83           INTEGER :: IOS, II
84     
85     ! Flags restricting what data from the mfix.dat to process
86           LOGICAL :: READ_LOCKED, READ_FULL
87     
88     ! Local Parameters:
89     !---------------------------------------------------------------------//
90           INTEGER, PARAMETER :: READ_MFIX = 0
91           INTEGER, PARAMETER :: READ_POST = 1
92           INTEGER, PARAMETER :: READ_INIT = 2
93     
94     ! External Functions
95     !---------------------------------------------------------------------//
96     ! Returns integer if data past column MAXCOL.
97     !      INTEGER, EXTERNAL :: LINE_TOO_BIG
98     ! Integer function which returns COMMENT_INDEX
99     !      INTEGER, EXTERNAL :: SEEK_COMMENT
100     ! Blank line function
101     !      LOGICAL, EXTERNAL :: BLANK_LINE
102     
103           E = UNDEFINED
104           RXN_FLAG = .FALSE.
105           READ_FLAG = .TRUE.
106           NO_OF_RXNS = 0
107           LINE_NO = 0
108     
109           SELECT CASE(READ_ACTION)
110           CASE(READ_MFIX)
111              READ_LOCKED = .TRUE.
112              READ_FULL = .TRUE.
113           CASE(READ_POST)
114              READ_LOCKED = .TRUE.
115              READ_FULL = .FALSE.
116           CASE(READ_INIT)
117              READ_LOCKED = .FALSE.
118              READ_FULL = .TRUE.
119           END SELECT
120     
121     ! Open the mfix.dat file. Report errors if the file is not located or
122     ! there is difficulties opening it.
123           inquire(file='mfix.dat',exist=lEXISTS)
124           IF(.NOT.lEXISTS) THEN
125              IF(myPE == PE_IO) WRITE(*,1000)
126              CALL MFIX_EXIT(myPE)
127     
128      1000 FORMAT(2/,1X,70('*')/' From: READ_NAMELIST',/' Error 1000: ',    &
129              'The input data file, mfix.dat, is missing. Aborting.',/1x,   &
130              70('*'),2/)
131     
132           ELSE
133              OPEN(CONVERT='BIG_ENDIAN',UNIT=UNIT_DAT, FILE='mfix.dat', STATUS='OLD', IOSTAT=IOS)
134              IF(IOS /= 0) THEN
135                 IF(myPE == PE_IO) WRITE (*,1100)
136                 CALL MFIX_EXIT(myPE)
137              ENDIF
138     
139      1001 FORMAT(2/,1X,70('*')/' From: READ_NAMELIST',/' Error 1001: ',    &
140              'Unable to open the mfix.dat file. Aborting.',/1x,70('*'),2/)
141           ENDIF
142     
143     
144     ! Loop through the mfix.dat file and process the input data.
145           READ_LP: DO
146              READ (UNIT_DAT,"(A)",IOSTAT=IOS) LINE_STRING
147              IF(IOS < 0) EXIT READ_LP
148     
149              LINE_NO = LINE_NO + 1
150     
151              LINE_LEN = SEEK_COMMENT(LINE_STRING,LEN(LINE_STRING)) - 1
152              CALL REMOVE_COMMENT(LINE_STRING, LINE_LEN+1, LEN(LINE_STRING))
153     
154              IF(LINE_LEN <= 0) CYCLE READ_LP           ! comment line
155              IF(BLANK_LINE(LINE_STRING)) CYCLE READ_LP ! blank line
156     
157              IF(LINE_TOO_BIG(LINE_STRING,LINE_LEN,MAXCOL) > 0) THEN
158                 WRITE (*, 1100) trim(iVAL(LINE_NO)), trim(ival(MAXCOL)), &
159                    LINE_STRING(1:MAXCOL)
160                 CALL MFIX_EXIT(myPE)
161              ENDIF
162     
163      1100 FORMAT(//1X,70('*')/1x,'From: READ_NAMELIST',/1x,'Error 1100: ', &
164              'Line ',A,' in mfix.dat has is too long. Input lines should', &
165              /1x,'not pass column ',A,'.',2/3x,A,2/1x,'Please correct ',   &
166              'the mfix.dat file.',/1X,70('*'),2/)
167     
168     ! All subsequent lines are thermochemical data
169              IF(LINE_STRING(1:11) == 'THERMO DATA') EXIT READ_LP
170     
171              CALL SET_KEYWORD(ERROR)
172              IF (ERROR) THEN
173     ! At this point, the keyword was not identified therefore it is
174     ! either deprecated or unknown.
175                 CALL DEPRECATED_OR_UNKNOWN(LINE_NO, LINE_STRING(1:LINE_LEN))
176              ENDIF
177     
178           ENDDO READ_LP
179     
180           DO II=1, COMMAND_ARGUMENT_COUNT()
181              CALL GET_COMMAND_ARGUMENT(ii,LINE_STRING)
182              LINE_LEN = len(line_string)
183              CALL SET_KEYWORD(ERROR)
184              IF (ERROR) THEN
185                 CALL DEPRECATED_OR_UNKNOWN(LINE_NO, LINE_STRING(1:LINE_LEN))
186              ENDIF
187           ENDDO
188     
189           CLOSE(UNIT=UNIT_DAT)
190           IF (E /= UNDEFINED) C_E = E
191     
192           RETURN
193     
194           CONTAINS
195     
196     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
197     !                                                                      !
198     ! Subroutine: SET_KEYWORD(ERROR)                                       !
199     ! Author: P. Nicoletti                                Date: 25-NOV-91  !
200     !                                                                      !
201     ! Purpose: Process LINE_STRING for MFIX keyword data.                  !
202     !                                                                      !
203     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
204           SUBROUTINE SET_KEYWORD(ERROR)
205     
206           IMPLICIT NONE
207     
208           LOGICAL, INTENT(OUT) ::ERROR
209     
210     
211     
212     ! External namelist files:
213     !---------------------------------------------------------------------//
214           INCLUDE 'run_control.inc'
215           INCLUDE 'physical_params.inc'
216           INCLUDE 'numerical_params.inc'
217           INCLUDE 'geometry.inc'
218           INCLUDE 'gas_phase.inc'
219           INCLUDE 'solids_phase.inc'
220           INCLUDE 'tfm_solids.inc'
221           INCLUDE 'initial_conditions.inc'
222           INCLUDE 'boundary_conditions.inc'
223           INCLUDE 'internal_surfaces.inc'
224           INCLUDE 'point_sources.inc'
225           INCLUDE 'output_control.inc'
226           INCLUDE 'usr_hooks.inc'
227           INCLUDE 'chem_equations.inc'
228           INCLUDE 'dmp_batch_control.inc'
229           INCLUDE 'desnamelist.inc'
230           INCLUDE 'cartesian_grid_namelist.inc'
231           INCLUDE 'qmomknamelist.inc'
232           INCLUDE 'legacy.inc'
233           INCLUDE 'usrnlst.inc'
234     
235           ERROR = .FALSE.
236     
237     ! Make upper case all except species names
238           if(index(LINE_STRING,'SPECIES_NAME') == 0 .AND. &
239              index(LINE_STRING,'species_name') == 0 .AND. &
240              index(LINE_STRING,'Species_Name') == 0 .AND. &
241              index(LINE_STRING,'SPECIES_g') == 0 .AND.    &
242              index(LINE_STRING,'Species_g') == 0 .AND.    &
243              index(LINE_STRING,'species_g') == 0 .AND.    &
244              index(LINE_STRING,'SPECIES_s') == 0 .AND.    &
245              index(LINE_STRING,'Species_s') == 0 .AND.    &
246              index(LINE_STRING,'species_s') == 0)         &
247              CALL MAKE_UPPER_CASE (LINE_STRING, LINE_LEN)
248     
249           CALL REPLACE_TAB (LINE_STRING, LINE_LEN)
250           CALL REMOVE_PAR_BLANKS(LINE_STRING)
251     
252     ! Complete arithmetic operations and expand line
253           CALL PARSE_LINE (LINE_STRING, LINE_LEN, RXN_FLAG, READ_FLAG)
254     
255     ! Write the current line to a scratch file
256     ! and read the scratch file in NAMELIST format
257           IF(.NOT.READ_FLAG) RETURN
258     
259     
260     ! Run control keywords
261           IF(READ_LOCKED) THEN
262              STRING=''; STRING = '&RUN_CONTROL_LOCKED '//&
263                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
264              READ(STRING, NML=RUN_CONTROL_LOCKED,  IOSTAT=IOS)
265              IF(IOS == 0)  RETURN
266           ENDIF
267     
268           STRING=''; STRING = '&RUN_CONTROL_UNLOCKED '//&
269              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
270           READ(STRING, NML=RUN_CONTROL_UNLOCKED, IOSTAT=IOS)
271           IF(IOS == 0)  RETURN
272     
273     
274     ! Physical parameter keywords
275           IF(READ_LOCKED) THEN
276              STRING=''; STRING = '&PHYSICAL_PARAM_LOCKED '//&
277                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
278              READ(STRING, NML=PHYSICAL_PARAM_LOCKED, IOSTAT=IOS)
279              IF(IOS == 0)  RETURN
280           ENDIF
281     
282           STRING=''; STRING = '&PHYSICAL_PARAM_UNLOCKED '//&
283              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
284           READ(STRING, NML=PHYSICAL_PARAM_UNLOCKED, IOSTAT=IOS)
285           IF(IOS == 0)  RETURN
286     
287     
288     ! Numerical parameter keywords
289           IF(READ_LOCKED) THEN
290              STRING=''; STRING = '&NUMERICAL_PARAM_LOCKED '//&
291                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
292              READ(STRING, NML=NUMERICAL_PARAM_LOCKED, IOSTAT=IOS)
293              IF(IOS == 0)  RETURN
294           ENDIF
295     
296           STRING=''; STRING = '&NUMERICAL_PARAM_UNLOCKED '//&
297              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
298           READ(STRING, NML=NUMERICAL_PARAM_UNLOCKED, IOSTAT=IOS)
299           IF(IOS == 0)  RETURN
300     
301     
302     ! Geometry and discretization keywords
303           IF(READ_LOCKED) THEN
304              STRING=''; STRING = '&GEOMETRY_LOCKED '//&
305                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
306              READ(STRING, NML=GEOMETRY_LOCKED, IOSTAT=IOS)
307              IF(IOS == 0)  RETURN
308           ENDIF
309     
310           STRING=''; STRING = '&GEOMETRY_UNLOCKED '//&
311              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
312           READ(STRING, NML=GEOMETRY_UNLOCKED, IOSTAT=IOS)
313           IF(IOS == 0)  RETURN
314     
315     
316     ! Gas phase keywords
317           IF(READ_LOCKED) THEN
318              STRING=''; STRING = '&GAS_PHASE_LOCKED '//&
319                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
320              READ(STRING, NML=GAS_PHASE_LOCKED, IOSTAT=IOS)
321              IF(IOS == 0)  RETURN
322           ENDIF
323     
324           STRING=''; STRING = '&GAS_PHASE_UNLOCKED '//&
325              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
326           READ(STRING, NML=GAS_PHASE_UNLOCKED, IOSTAT=IOS)
327           IF(IOS == 0)  RETURN
328     
329     
330     ! Solidss phase keywords
331           IF(READ_LOCKED) THEN
332              STRING=''; STRING = '&SOLIDS_PHASE_LOCKED '//&
333                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
334              READ(STRING, NML=SOLIDS_PHASE_LOCKED, IOSTAT=IOS)
335              IF(IOS == 0)  RETURN
336           ENDIF
337     
338           STRING=''; STRING = '&SOLIDS_PHASE_UNLOCKED '//&
339              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
340           READ(STRING, NML=SOLIDS_PHASE_UNLOCKED, IOSTAT=IOS)
341           IF(IOS == 0)  RETURN
342     
343     
344     ! Two-fluid solids keywords
345           STRING=''; STRING = '&TFM_SOLIDS_UNLOCKED '//&
346              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
347           READ(STRING, NML=TFM_SOLIDS_UNLOCKED, IOSTAT=IOS)
348           IF(IOS == 0)  RETURN
349     
350     
351     ! Initial condtion keywords
352           IF(READ_LOCKED) THEN
353              STRING=''; STRING = '&INITIAL_CONDITIONS_LOCKED '//&
354                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
355              READ(STRING, NML=INITIAL_CONDITIONS_LOCKED, IOSTAT=IOS)
356              IF(IOS == 0)  RETURN
357           ENDIF
358     
359           STRING=''; STRING = '&INITIAL_CONDITIONS_UNLOCKED '//&
360              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
361           READ(STRING, NML=INITIAL_CONDITIONS_UNLOCKED, IOSTAT=IOS)
362           IF(IOS == 0)  RETURN
363     
364     
365     ! Boundary condition keywords
366           IF(READ_LOCKED) THEN
367              STRING=''; STRING = '&BOUNDARY_CONDITIONS_LOCKED '//&
368                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
369              READ(STRING, NML=BOUNDARY_CONDITIONS_LOCKED, IOSTAT=IOS)
370              IF(IOS == 0)  RETURN
371           ENDIF
372     
373           STRING=''; STRING = '&BOUNDARY_CONDITIONS_UNLOCKED '//&
374              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
375           READ(STRING, NML=BOUNDARY_CONDITIONS_UNLOCKED, IOSTAT=IOS)
376           IF(IOS == 0)  RETURN
377     
378     
379     ! Internal surface keywords
380           IF(READ_LOCKED) THEN
381              STRING=''; STRING = '&INTERNAL_SURFACES_LOCKED '//&
382                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
383              READ(STRING, NML=INTERNAL_SURFACES_LOCKED, IOSTAT=IOS)
384              IF(IOS == 0)  RETURN
385           ENDIF
386     
387           STRING=''; STRING = '&INTERNAL_SURFACES_UNLOCKED '//&
388              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
389           READ(STRING, NML=INTERNAL_SURFACES_UNLOCKED, IOSTAT=IOS)
390           IF(IOS == 0)  RETURN
391     
392     
393     ! Point source keywords
394           STRING=''; STRING = '&POINT_SOURCES_UNLOCKED '//&
395              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
396           READ(STRING, NML=POINT_SOURCES_UNLOCKED, IOSTAT=IOS)
397           IF(IOS == 0)  RETURN
398     
399     
400     ! Output control keywords
401           IF(READ_LOCKED) THEN
402              STRING=''; STRING = '&OUTPUT_CONTROL_LOCKED '//&
403                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
404              READ(STRING, NML=OUTPUT_CONTROL_LOCKED, IOSTAT=IOS)
405              IF(IOS == 0)  RETURN
406           ENDIF
407     
408           STRING=''; STRING = '&OUTPUT_CONTROL_UNLOCKED '//&
409              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
410           READ(STRING, NML=OUTPUT_CONTROL_UNLOCKED, IOSTAT=IOS)
411           IF(IOS == 0)  RETURN
412     
413     
414     ! User hook keywords
415           STRING=''; STRING = '&USER_HOOKS_UNLOCKED '//&
416              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
417           READ(STRING, NML=USER_HOOKS_UNLOCKED, IOSTAT=IOS)
418           IF(IOS == 0)  RETURN
419     
420     
421     ! Chemical equation keywords
422           STRING=''; STRING = '&CHEM_EQUATIONS_UNLOCKED '//&
423              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
424           READ(STRING, NML=CHEM_EQUATIONS_UNLOCKED, IOSTAT=IOS)
425           IF(IOS == 0)  RETURN
426     
427     
428     ! DMP and Batch Queue control keywords
429           IF(READ_LOCKED) THEN
430              STRING=''; STRING = '&DMP_BATCH_CONTROL_LOCKED '//&
431                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
432              READ(STRING, NML=DMP_BATCH_CONTROL_LOCKED, IOSTAT=IOS)
433              IF(IOS == 0)  RETURN
434           ENDIF
435     
436           STRING=''; STRING = '&DMP_BATCH_CONTROL_UNLOCKED '//&
437              trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
438           READ(STRING, NML=DMP_BATCH_CONTROL_UNLOCKED, IOSTAT=IOS)
439           IF(IOS == 0)  RETURN
440     
441     
442     ! Legacy keywords
443           IF(READ_LOCKED) THEN
444              STRING=''; STRING = '&LEGACY_LOCKED '//&
445                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
446              READ(STRING, NML=LEGACY_LOCKED, IOSTAT=IOS)
447              IF(IOS == 0)  RETURN
448     
449           ENDIF
450     
451     ! Stop processing keyword inputs if runing POST_MFIX
452            IF(.NOT.READ_FULL) RETURN
453     
454     
455           IF(READ_LOCKED) THEN
456     
457     ! Discrete Element model input parameters.
458              STRING=''; STRING = '&DES_INPUT_DATA '//&
459                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
460              READ(STRING, NML=DES_INPUT_DATA, IOSTAT=IOS)
461              IF(IOS == 0)  RETURN
462     
463     
464     ! User defined input parameters.
465              STRING=''; STRING = '&USR_INPUT_DATA '//&
466                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
467              READ(STRING, NML=USR_INPUT_DATA, IOSTAT=IOS)
468              IF(IOS == 0)  RETURN
469     
470     
471     ! Cartesian grid cut-cell input parameters.
472              STRING=''; STRING = '&CARTESIAN_GRID_INPUT_DATA '//&
473                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
474              READ(STRING, NML=CARTESIAN_GRID_INPUT_DATA, IOSTAT=IOS)
475              IF(IOS == 0)  RETURN
476     
477     
478     ! QMOMK input parameters.
479              STRING=''; STRING = '&QMOMK_INPUT_DATA '//&
480                 trim(adjustl(LINE_STRING(1:LINE_LEN)))//'/'
481              READ(STRING, NML=QMOMK_INPUT_DATA, IOSTAT=IOS)
482              IF(IOS == 0)  RETURN
483           ENDIF
484     
485           IF(READ_LOCKED) ERROR = .TRUE.
486     
487           RETURN
488           END SUBROUTINE SET_KEYWORD
489     
490     END SUBROUTINE READ_NAMELIST
491