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