File: N:\mfix\model\thermochemical\read_thermochemical_mod.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include "version.inc"
21
22 MODULE read_thermochemical
23
24 IMPLICIT NONE
25
26
27 CHARACTER(len=142) :: THERM = 'BURCAT.THR'
28
29 CONTAINS
30
31
32
33 SUBROUTINE READ_Therm_tester
34 Implicit none
35 DOUBLE PRECISION Ahigh(7), Alow(7)
36 DOUBLE PRECISION Thigh, Tlow, Tcom, MW
37 DOUBLE PRECISION Cp1, h1, h2, Hf298oR
38 CHARACTER(LEN=132) :: PATH
39 CHARACTER(LEN=18) :: SPECIES
40 integer funit, IER
41 CHARACTER(len=255) FILENAME
42 LOGICAL LocalCopy
43
44 SPECIES = 'CH4'
45 PATH = '.'
46 funit = 5
47
48 INQUIRE(FILE=TRIM(THERM),EXIST=LocalCopy)
49 IF(LocalCopy)Then
50 OPEN(CONVERT='BIG_ENDIAN',UNIT=funit,FILE=TRIM(THERM))
51 ELSE
52 FILENAME = './BURCAT.THR'
53 OPEN(CONVERT='BIG_ENDIAN',UNIT=funit,FILE=TRIM(FILENAME), ERR=500)
54 ENDIF
55
56
57 Call Read_Therm(funit, SPECIES, Thigh, Tlow, Tcom, MW, Ahigh, &
58 Alow, Hf298oR, IER)
59 IF(IER /= 0) GOTO 200
60
61 print *, SPECIES
62 print *, Thigh, Tlow, Tcom, MW, Hf298oR*1.987207
63
64
65
66
67
68
69
70
71
72
73
74
75 print *, Cp1, h1, h2
76 CLOSE(UNIT=funit)
77 ERROR_STOP
78 200 PRINT *, 'READ_Therm_tester: Species ', &
79 TRIM(SPECIES), ' not found in Database!'
80 ERROR_STOP
81 500 PRINT *, 'READ_Therm_tester: Cannot Open file ', TRIM(THERM), '!'
82 PRINT *, 'Check path or copy mfix/model/thermochemical/', &
83 TRIM(THERM), ' into run directory'
84 ERROR_STOP
85 END Subroutine READ_Therm_tester
86
87
88
89
90
91
92
93
94
95 SUBROUTINE READ_Therm(funit, Sp, Thigh, Tlow, Tcom, MW, Ahigh, &
96 Alow, Hf298oR, IER)
97
98
99
100
101
102 IMPLICIT NONE
103
104 CHARACTER(*) SP
105
106
107 CHARACTER(len=80) :: LINE_STRING
108
109 CHARACTER(len=18) :: SPECIES, ss
110 INTEGER i, funit, IER
111 DOUBLE PRECISION Ahigh(7), Alow(7), Hf298oR
112 DOUBLE PRECISION Thigh, Tlow, Tcom, MW
113
114
115
116 INTEGER, PARAMETER :: Max = 3
117 CHARACTER(LEN=18), DIMENSION(2,Max) :: SPECIES_ALIAS
118 SPECIES_ALIAS = RESHAPE ( (/ &
119
120
121 'O2 ', 'O2 REF ELEMENT ', &
122 'N2 ', 'N2 REF ELEMENT ', &
123 'CH4 ', 'CH4 ANHARMONIC ' &
124 /), (/2,Max/))
125
126
127 IER = 0
128 SPECIES = SP
129 DO i = 1, MAX
130 IF(TRIM(SP) == TRIM(SPECIES_ALIAS(1,I)))THEN
131 SPECIES = SPECIES_ALIAS(2,I)
132 ENDIF
133 ENDDO
134
135
136 LINE_STRING = ' '
137 DO WHILE(LINE_STRING(1:11) /= 'THERMO DATA')
138 READ(UNIT=funit, FMT='(A)',ERR=100,END=100)LINE_STRING
139 END DO
140
141 ss = ' '
142 call trimTab(SPECIES)
143 DO WHILE(TRIM(ss) /= TRIM(SPECIES))
144 READ(UNIT=funit, FMT='(A)',ERR=100,END=100)LINE_STRING
145 ss = LINE_STRING(1:18)
146 call trimTab(ss)
147
148 END DO
149
150
151
152 call get_values(LINE_STRING, Tlow, Thigh, MW)
153
154
155
156
157 = min(1.0d3, Thigh)
158 READ(UNIT=funit, FMT='(5E15.0)',ERR=300,END=300)Ahigh(1:5)
159 READ(UNIT=funit, FMT='(5E15.0)',ERR=300,END=300)Ahigh(6:7), Alow(1:3)
160 READ(UNIT=funit, FMT='(5E15.0)',ERR=300,END=300)Alow(4:7), Hf298oR
161
162
163
164 RETURN
165
166 = 1
167 RETURN
168
169 300 PRINT *, 'READ_Therm: Error reading coefficients for Species ', &
170 TRIM(LINE_STRING(1:18))
171 ERROR_STOP
172
173 END SUBROUTINE READ_Therm
174
175
176
177
178
179
180 PURE DOUBLE PRECISION FUNCTION calc_CpoR(T, M, N)
181
182
183 use physprop, only: Ahigh
184 use physprop, only: Alow
185 use physprop, only: Thigh
186 use physprop, only: Tlow
187 use physprop, only: Tcom
188
189 implicit none
190
191
192
193
194 DOUBLE PRECISION, intent(in) :: T
195
196 INTEGER, intent(in) :: M
197
198 INTEGER, intent(in) :: N
199
200
201
202
203 DOUBLE PRECISION :: xT
204
205
206 = max(min(T,Thigh(M,N)),Tlow(M,N))
207
208
209 IF(T < Tcom(M,N))THEN
210 calc_CpoR = calc_CpoR0(xT, Alow(1:5,M,N))
211 ELSE
212 calc_CpoR = calc_CpoR0(xT, Ahigh(1:5,M,N))
213 ENDIF
214
215 RETURN
216 END Function calc_CpoR
217
218
219
220
221
222
223
224 PURE DOUBLE PRECISION FUNCTION calc_CpoR0(T, A)
225
226 implicit none
227
228
229
230
231 DOUBLE PRECISION, intent(in) :: T
232
233 DOUBLE PRECISION, intent(in) :: A(1:5)
234
235
236 = (((A(5)*T +A(4))*T + A(3))*T + A(2))*T + A(1)
237
238 RETURN
239 END Function calc_CpoR0
240
241
242
243
244
245
246
247 DOUBLE PRECISION FUNCTION calc_ICpoR(T, M, N, IER)
248
249 use physprop, only: Ahigh
250 use physprop, only: Thigh
251 use physprop, only: ICpoR_h
252 use physprop, only: Alow
253 use physprop, only: Tlow
254 use physprop, only: ICpoR_l
255 use physprop, only: Tcom
256
257 implicit none
258
259
260
261
262 DOUBLE PRECISION, intent(in) :: T
263
264 INTEGER, intent(in) :: M
265
266 INTEGER, intent(in) :: N
267
268 INTEGER, intent(inout) :: IER
269
270
271
272 DOUBLE PRECISION :: xT
273
274
275
276 = T
277 IER = 0
278
279
280 if(T > Thigh(M,N)) THEN
281 xT = Thigh(M,N)
282 IER = 101
283 elseif(T < Tlow(M,N)) THEN
284 xT = Tlow(M,N)
285 IER = 102
286 endif
287
288
289 if (xT < Tcom(M,N)) then
290 calc_ICpoR = calc_ICpoR0(xT, Alow(1:5,M,N), ICpoR_l(M,N))
291 else
292 calc_ICpoR = calc_ICpoR0(xT, Ahigh(1:5,M,N), ICpoR_h(M,N))
293 endif
294
295 RETURN
296 END FUNCTION calc_ICpoR
297
298
299
300
301
302
303
304 PURE DOUBLE PRECISION FUNCTION calc_ICpoR0(T, A, REF_ICpoR)
305
306 implicit none
307
308
309
310
311 DOUBLE PRECISION, intent(in) :: T
312
313 DOUBLE PRECISION, intent(in) :: A(1:5)
314
315 DOUBLE PRECISION, intent(in) :: REF_ICpoR
316
317
318
319
320 DOUBLE PRECISION ICpoRT
321
322
323
324 = (((A(5)*T/5.0d0 + A(4)/4.0d0)*T + A(3)/3.0d0)*T + &
325 A(2)/2.0d0)*T + A(1)
326
327 calc_ICpoR0 = T*ICpoRT - REF_ICpoR
328
329 RETURN
330 END FUNCTION calc_ICpoR0
331
332
333
334
335
336
337
338
339
340
341
342 PURE DOUBLE PRECISION FUNCTION calc_H0oR(T, Th, Tl, Tc, Ah, Al)
343
344 implicit none
345
346
347
348
349 DOUBLE PRECISION, intent(in) :: Ah(7), Al(7)
350
351 DOUBLE PRECISION, intent(in) :: Th
352 DOUBLE PRECISION, intent(in) :: Tl
353 DOUBLE PRECISION, intent(in) :: Tc
354
355 DOUBLE PRECISION, intent(in) :: T
356
357
358
359
360
361
362
363
364
365
366
367 = 0.0
368
369 return
370 END FUNCTION calc_H0oR
371
372
373
374
375
376
377 SUBROUTINE replaceTab(C)
378
379 implicit none
380
381
382
383
384 CHARACTER(len=*) :: C
385
386
387
388
389 INTEGER :: I
390
391 DO I = 1, len(C)
392 IF(C(I:I) == CHAR(9)) C(I:I)=' '
393 ENDDO
394
395 RETURN
396 END SUBROUTINE replaceTab
397
398
399
400
401
402
403
404
405 SUBROUTINE trimTab(C)
406
407 implicit none
408
409
410
411
412 CHARACTER(len=*) :: C
413
414
415
416
417 INTEGER :: I
418
419 LOGICAL :: tabFound
420
421
422 = .FALSE.
423
424
425
426 DO I = 1, len(C)
427 IF(C(I:I) == CHAR(9) ) tabFound = .TRUE.
428 if(tabFound) C(I:I)=' '
429 ENDDO
430
431 RETURN
432 END SUBROUTINE trimTab
433
434 END MODULE read_thermochemical
435