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