File: N:\mfix\model\check_data\check_solids_model_prereqs.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2     !                                                                      !
3     !  SUBROUTINE: CHECK_SOLIDS_MODEL_PREREQS                              !
4     !  Purpose: Check the distributed parallel namelist variables.         !
5     !                                                                      !
6     !  Author: P. Nicoletti                               Date: 14-DEC-99  !
7     !  Reviewer: J.Musser                                 Date: 16-Jan-14  !
8     !                                                                      !
9     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
10           SUBROUTINE CHECK_SOLIDS_MODEL_PREREQS
11     
12     ! Modules
13     !---------------------------------------------------------------------//
14     ! Flag: Use DES E-L model
15           use discretelement, only: DISCRETE_ELEMENT
16     ! Flag: Use TFM and DEM solids models.
17           use discretelement, only: DES_CONTINUUM_HYBRID
18     ! Flag: gas/solids E-L simulation, otherwise granular flow.
19           use discretelement, only: DES_CONTINUUM_COUPLED
20     ! Flag: Fluid affects particles, but particles do not impact fluid.
21           use discretelement, only: DES_ONEWAY_COUPLED
22     ! Number of discrete solids phases.
23           use discretelement, only: DES_MMAX
24     ! Print E-L data.
25           use discretelement, only: PRINT_DES_DATA
26     
27           use error_manager
28     
29     ! Maximum number of solids phases.
30           use param, only: DIM_M
31     
32     ! Number of phases specified by the user.
33           use physprop, only: MMAX, SMAX
34     ! User specified constant gas density
35           use physprop, only: RO_g0
36     
37     ! Flag: Use MPPIC E-L model
38           use mfix_pic, only: MPPIC
39     ! Flag: Method of manufactured solutions (MMS)
40           use mms, only: USE_MMS
41     
42           use run, only: SOLIDS_MODEL
43     ! Flag: Use DES E-E solids model
44           use run, only: TFM_SOLIDS, TFM_COUNT
45           use run, only: DEM_SOLIDS, DEM_COUNT
46           use run, only: PIC_SOLIDS, PIC_COUNT
47     ! Flag: Solve species eq.
48           USE run, only: SPECIES_EQ, ANY_SPECIES_EQ
49     ! Kinetic theory model for TFM solids.
50           use run, only: KT_TYPE
51     
52     ! Number of scalar equations to solve
53           USE scalars, only: NSCALAR, phase4scalar
54     ! Phase associated with scalar transport.
55           USE scalars, only: phase4scalar
56           implicit none
57     
58     ! Local Variables
59     !---------------------------------------------------------------------//
60     ! Loop counter
61           INTEGER :: M ! Phase index
62     ! Error indicator for mmax
63           LOGICAL :: ERR_MMAX
64     ! Dummy integer
65           INTEGER :: N
66     !......................................................................!
67     
68     
69     ! Initialize the error manager.
70           CALL INIT_ERR_MSG("CHECK_SOLIDS_MODEL_PREREQS")
71     
72     ! Moved this here but will need to discuss if this is best route
73     ! going forward
74           ERR_MMAX = .FALSE.
75           IF (MMAX < 0) ERR_MMAX = .TRUE.
76           IF(TRIM(KT_TYPE) == 'GHD') THEN
77              IF (MMAX+1 > DIM_M) ERR_MMAX = .TRUE.
78           ELSE
79              IF (MMAX > DIM_M) ERR_MMAX = .TRUE.
80           ENDIF
81           IF((USE_MMS).AND.(MMAX > 1)) ERR_MMAX = .TRUE.
82     
83     ! Check MMAX
84           IF (ERR_MMAX) THEN
85              WRITE(ERR_MSG, 1000) iVal(DIM_M)
86              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
87           ENDIF
88      1000 FORMAT('Error 1000: MMAX out of range. Min: 0, Max: ',A)
89     
90     ! Loop over the phases to see what was specified.
91           DO M=1, MMAX
92              SOLIDS_MODEL(M) = trim(adjustl(SOLIDS_MODEL(M)))
93              SELECT CASE(SOLIDS_MODEL(M))
94              CASE ('TFM'); TFM_COUNT = TFM_COUNT + 1
95              CASE ('DEM'); DEM_COUNT = DEM_COUNT + 1
96              CASE ('PIC'); PIC_COUNT = PIC_COUNT + 1
97     
98              CASE DEFAULT
99                 WRITE(ERR_MSG,1001) iVar('SOLIDS_MODEL',M), SOLIDS_MODEL(M)
100                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
101     
102      1001 FORMAT('Error 1001: Unknown solids model: ',A,' = ',A)
103     
104              END SELECT
105           ENDDO
106     
107     ! Set the number of discrete phases.
108           DES_MMAX = DEM_COUNT + PIC_COUNT
109     
110     ! Set the number of TFM phases.  (should be equivalent to tfm_count)
111           MMAX = MMAX - DES_MMAX
112           SMAX = MMAX   ! USE smax in the TFM code for the number of TFM phases
113     ! For GHD theory increase MMAX by one to serve as 'mixture' phase
114           IF(TRIM(KT_TYPE) == 'GHD') THEN
115              MMAX = MMAX + 1
116              TFM_COUNT = TFM_COUNT + 1
117              SOLIDS_MODEL(MMAX) = 'TFM'
118           ENDIF
119     
120     
121     ! Clear out the unused phases.
122           SOLIDS_MODEL((MMAX+DES_MMAX)+1:DIM_M) = '---'
123     
124     ! Set the runtime flags:
125           TFM_SOLIDS = (TFM_COUNT > 0)
126           DEM_SOLIDS = (DEM_COUNT > 0)
127           PIC_SOLIDS = (PIC_COUNT > 0)
128     
129     ! MPPIC and continuum solids don't mix.
130           IF(PIC_SOLIDS .AND. TFM_SOLIDS)THEN
131              WRITE(ERR_MSG, 1002)
132              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
133           ENDIF
134      1002 FORMAT('Error 1002: MPPIC solids and continuum solids cannot ',&
135              'be combined.',/'Please correct the mfix.dat file.')
136     
137     
138     ! MPPIC and DEM solids don't mix.
139           IF(PIC_SOLIDS .AND. DEM_SOLIDS)THEN
140              WRITE(ERR_MSG, 1003)
141              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
142           ENDIF
143      1003 FORMAT('Error 1003: MPPIC solids and DES solids cannot be ',     &
144              'combined.',/'Please correct the mfix.dat file.')
145     
146     ! temporary move for now since these rely on definition of mmax/smax
147     ! Set variable ANY_SPECIES_EQ
148           M = max(SMAX, DES_MMAX)
149           ANY_SPECIES_EQ = any(SPECIES_EQ(:M))
150     
151     ! Check phase specification for scalars
152           DO N = 1, NScalar
153              IF(Phase4Scalar(N) < 0 .OR. Phase4Scalar(N) > MMAX) THEN
154                 WRITE(ERR_MSG,1004) iVar('Phase4Scalar',N), &
155                    iVal(phase4scalar(N))
156                 CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
157              ENDIF
158           ENDDO
159      1004 FORMAT('Error 1004: Illegal or unknown input: ',A,' = ',A,/  &
160              'Please correct the mfix.dat file.')
161     
162     ! Set the DEM runtime flag.
163           DISCRETE_ELEMENT = DEM_SOLIDS .OR. PIC_SOLIDS
164     ! Set the MMPIC runtime flag.
165           MPPIC = PIC_SOLIDS
166     ! Set the Hybird flag.
167           DES_CONTINUUM_HYBRID = (DEM_SOLIDS .AND. TFM_SOLIDS)
168     ! Set flag for coupled simulations
169           DES_CONTINUUM_COUPLED = .NOT.(RO_g0 == 0.0d0)
170     
171           IF(DES_CONTINUUM_HYBRID) CALL HYBRID_HACK
172     
173     ! Overwrite user settings if no Lagrangian solids
174           IF(.NOT.DISCRETE_ELEMENT) THEN
175              DES_CONTINUUM_COUPLED = .FALSE.   ! This keyword might get removed.
176              PRINT_DES_DATA = .FALSE.
177              DES_ONEWAY_COUPLED = .FALSE.
178           ENDIF
179     
180           CALL FINL_ERR_MSG
181     
182           RETURN
183     
184           END SUBROUTINE CHECK_SOLIDS_MODEL_PREREQS
185     
186     
187     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
188     !                                                                      !
189     !  SUBROUTINE: Hybrid_HACK                                             !
190     !  Purpose: Check the distributed parallel namelist variables.         !
191     !                                                                      !
192     !  Author: P. Nicoletti                               Date: 14-DEC-99  !
193     !  Reviewer: J.Musser                                 Date: 16-Jan-14  !
194     !                                                                      !
195     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
196           SUBROUTINE HYBRID_HACK
197     
198     ! Modules
199     !---------------------------------------------------------------------//
200     ! Maximum number of solids phases.
201           use param, only: DIM_M
202           use error_manager
203           use run, only: SOLIDS_MODEL
204     
205     ! Local variables
206     !---------------------------------------------------------------------//
207           integer :: TFM_MAX
208           integer :: DEM_MIN
209           integer :: M
210     !......................................................................!
211     
212     ! Initialize the error manager.
213           CALL INIT_ERR_MSG("HYBRID_HACK")
214     
215     ! Initialize the loop variables.
216           TFM_MAX = -DIM_M
217           DEM_MIN =  DIM_M
218     
219     ! Loop over the phases to see what was specified.
220           DO M=1, DIM_M
221              SELECT CASE(SOLIDS_MODEL(M))
222              CASE ('TFM'); TFM_MAX = max(M, TFM_MAX)
223              CASE ('DEM'); DEM_MIN = min(M, DEM_MIN)
224              END SELECT
225           ENDDO
226     
227           write(*,*)'  MAX TFM index: ', TFM_MAX
228           write(*,*)'  MIN DEM index: ', DEM_MIN
229     
230           IF(DEM_MIN < TFM_MAX) THEN
231              WRITE(ERR_MSG, 2000)
232              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
233           ENDIF
234     
235      2000 FORMAT('Error 2000: Illegal phase specification for hybrid ',    &
236              'model. All TFM',/'solids must be defined before DEM solids.',&
237              /'Please correct the mfix.dat file.')
238     
239           CALL FINL_ERR_MSG
240     
241           RETURN
242           END SUBROUTINE HYBRID_HACK
243