forked from ahmades/CMCsubPack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMISC.f
More file actions
executable file
·492 lines (459 loc) · 20.1 KB
/
MISC.f
File metadata and controls
executable file
·492 lines (459 loc) · 20.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
C==========================================================================================
C==========================================================================================
C==========================================================================================
C==========================================================================================
SUBROUTINE FINDDIFFDELTA(MFMEAN,MFVAR,H_MEAN,H_VAR)
C==================================================================================
C PURPOSE: NUMERICAL DIFFERENTIATION WITH RESPECT TO THE MIXTURE FRACTION MEAN
C (VARIANCE) REQUIRES THE SPECIFICATION OF A RANGE ABOUT THE MEAN
C (VARIANCE).
C GIVEN THE MIXTURE FRACTION MEAN (MFMEAN) AND VARIANCE (MFVAR),
C THIS SUBROUTINE COMPUTES H_MEAN AND H_VAR WHICH ARE NECESSARY TO
C DEFINE THE RANGE REQUIRED FOR DIFFERENTIATION.
C==================================================================================
C VARIABLE DESCRIPTION DATA TYPE
C -------- ----------- ---------
C
C INPUT:
C
C MFMEAN MIXTURE FRACTION MEAN DOUBLE PRECISION
C MFVAR MIXTURE FRACTION VARIANCE DOUBLE PRECISION
C==================================================================================
IMPLICIT NONE
DOUBLE PRECISION MFMEAN,MFVAR,H_MEAN,H_VAR
DOUBLE PRECISION PI,D_ZERO,D_ONE,D_HALF,D_TWO,D_THREE,
$ D_FOUR,D_EIGHT
COMMON/DBLECONSTANTS/PI,D_ZERO,D_ONE,D_HALF,D_TWO,D_THREE
COMMON/DBLECONSTANTS2/D_FOUR,D_EIGHT
C H_MEAN = (1.0D0 - DSQRT(D_ONE - 4.0D0*MFVAR))/2.0D0
C H_VAR = MFVAR/2.0D0
H_MEAN = (D_ONE - DSQRT(D_ONE - D_FOUR*MFVAR))/D_TWO
H_VAR = MFVAR/D_TWO
RETURN
END
C==========================================================================================
C==========================================================================================
C==========================================================================================
C==========================================================================================
SUBROUTINE CHECKPARMS(MFMEAN,MFVAR)
C==================================================================================
C PURPOSE: CHECKS THE VALIDITY OF THE VALUES OF THE MIXTURE FRACTION MEAN,
C THE MIXTURE FRACTION AND VARIANCE, AND THE INTENSITY OF SEGREGATION
C==================================================================================
C VARIABLE DESCRIPTION DATA TYPE
C -------- ----------- ---------
C
C INPUT:
C
C MFMEAN MIXTURE FRACTION MEAN DOUBLE PRECISION
C MFVAR MIXTURE FRACTION VARIANCE DOUBLE PRECISION
C==================================================================================
IMPLICIT NONE
INCLUDE 'formats.h'
DOUBLE PRECISION MFMEAN,MFVAR,ISEG
DOUBLE PRECISION PI,D_ZERO,D_ONE,D_HALF,D_TWO,D_THREE
COMMON/DBLECONSTANTS/PI,D_ZERO,D_ONE,D_HALF,D_TWO,D_THREE
LOGICAL VERBOSE
COMMON/LOGICALVARS/VERBOSE
ISEG = MFVAR/(MFMEAN*(D_ONE-MFMEAN))
IF(VERBOSE) THEN
WRITE(*,50)'============================================='
WRITE(*,50)'PARAMETERS CHECK:'
WRITE(*,50)'============================================='
WRITE(*,100)'MIXTURE FRACTION MEAN =', MFMEAN
WRITE(*,100)'MIXTURE FRACTION VARIANCE =', MFVAR
WRITE(*,100)'INTENSITY OF SEGREGATION =', ISEG
WRITE(*,50)' '
ENDIF
IF((MFMEAN.LT.D_ZERO).OR.(MFMEAN.GT.D_ONE)) THEN
WRITE(*,50)'============================================='
WRITE(*,50)'WRONG INPUT:'
WRITE(*,50)'MIXTURE FRACTION MEAN IS NOT BETWEEN 0 AND 1.'
WRITE(*,50)'COMPUTATIONS ABORTED.'
WRITE(*,50)'============================================='
STOP
ELSE
IF(VERBOSE)
$ WRITE(*,50)'MIXTUR FRACTION MEAN -> VALUE IS VALID.'
ENDIF
IF(MFVAR.LT.D_ZERO) THEN
WRITE(*,50)'============================================='
WRITE(*,50)'WRONG INPUT:'
WRITE(*,50)'MIXTURE FRACTION VARIANCE IS LESS THAN 0.'
WRITE(*,50)'COMPUTATIONS ABORTED.'
WRITE(*,50)'============================================='
STOP
ELSE
IF(VERBOSE)
$ WRITE(*,50)'MIXTUR FRACTION VARAINCE -> VALUE IS VALID.'
ENDIF
IF((ISEG.LT.D_ZERO).OR.(ISEG.GT.D_ONE)) THEN
WRITE(*,50)'WRONG INPUT:'
WRITE(*,50)'INTENSITY OF SEGREGATION IS NOT BETWEEN 0 AND 1.'
WRITE(*,50)'COMPUTATIONS ABORTED.'
WRITE(*,50)'============================================='
STOP
ELSE
IF(VERBOSE)
$ WRITE(*,50)'INTENSITY OF SEGREGATION -> VALUE IS VALID.'
ENDIF
IF(VERBOSE)
$ WRITE(*,50)'============================================='
RETURN
END
C==================================================================================
C==================================================================================
C==================================================================================
C==================================================================================
SUBROUTINE PDFAREA(PDF,ETA,NETA,AREA)
C==========================================================================================
C PURPOSE: COMPUTES THE AREA UNDER THE PDF BY INTEGRATING PDF(ETA) OVER ETA SPACE.
C
C NOTE: TRAPEZOIDAL INTEGRATION IS USED. LARGE ERRORS MAY ARISE
C WHEN COARSE MIXTURE FRACTION GRIDS ARE EMPLOYED.
C==========================================================================================
C VARIABLE DESCRIPTION DATA TYPE
C -------- ----------- ---------
C
C INPUT:
C
C PDF PROBABILITY DENSITY FUNCTION DOUBLE PRECISION (ARRAY,SIZE=NETA)
C ETA MIXTURE FRACTION GRID DOUBLE PRECISION (ARRAY,SIZE=NETA)
C NETA SIZE OF ETA AND CSDRI INTEGER
C
C
C OUTPUT:
C
C AREA AREA UNDER PDF DOUBLE PRECISION
C==========================================================================================
IMPLICIT NONE
INTEGER IETA,NETA
DOUBLE PRECISION PDF(NETA),ETA(NETA)
DOUBLE PRECISION AREA
DOUBLE PRECISION TRAP
EXTERNAL TRAP
AREA = TRAP(PDF,ETA,NETA)
RETURN
END
C==================================================================================
C==================================================================================
C==================================================================================
C==================================================================================
SUBROUTINE UNCONDAVG(X_COND,PDF,ETA,NETA,X_UNCOND)
C==========================================================================================
C PURPOSE: COMPUTES THE UNCONDITIONAL (FAVRE) AVERAGE OF QUANTITY X
C BY INTEGRATING <X|ETA>*PDF(ETA) OVER ETA SPACE.
C
C NOTE: TRAPEZOIDAL INTEGRATION IS USED. LARGE ERRORS MAY ARISE
C WHEN COARSE MIXTURE FRACTION GRIDS ARE EMPLOYED.
C==========================================================================================
C VARIABLE DESCRIPTION DATA TYPE
C -------- ----------- ---------
C
C INPUT:
C
C
C X_COND CONDITIONAL AVERAGE OF X . DOUBLE PRECISION (ARRAY,SIZE=NETA)
C PDF PROBABILITY DENSITY FUNCTION DOUBLE PRECISION (ARRAY,SIZE=NETA)
C ETA MIXTURE FRACTION GRID DOUBLE PRECISION (ARRAY,SIZE=NETA)
C NETA SIZE OF ETA AND CSDRI INTEGER
C
C
C OUTPUT:
C
C X_UNCOND UNCONDITIONAL AVERAGE OF X DOUBLE PRECISION
C==========================================================================================
IMPLICIT NONE
INTEGER IETA,NETA
DOUBLE PRECISION X_COND(NETA),PDF(NETA),ETA(NETA),X_UNCOND
DOUBLE PRECISION INTEGRAND(NETA)
DOUBLE PRECISION TRAP
EXTERNAL TRAP
DO IETA = 1,NETA
INTEGRAND(IETA) = X_COND(IETA)*PDF(IETA)
ENDDO
X_UNCOND = TRAP(INTEGRAND,ETA,NETA)
RETURN
END
C==================================================================================
C==================================================================================
C==================================================================================
C==================================================================================
DOUBLE PRECISION FUNCTION TRAP(F,X,N)
C==========================================================================================
C PURPOSE: COMPUTES THE INTEGRAL OF A DISCRETE FUNCTION USING TRAPEZOIDAL INTEGRATION
C
C NOTE: LARGE ERRORS MAY ARISE WHEN COARSE MIXTURE FRACTION GRIDS ARE EMPLOYED.
C==========================================================================================
C VARIABLE DESCRIPTION DATA TYPE
C -------- ----------- ---------
C
C INPUT:
C
C
C F DISCRETE FUNCTION OF X DOUBLE PRECISION (ARRAY,SIZE=N)
C X X VALUES DOUBLE PRECISION (ARRAY,SIZE=N)
C N SIZE OF F AND X INTEGER
C
C
C OUTPUT:
C
C TRAP INTEGRAL OF F(X) DOUBLE PRECISION
C==========================================================================================
IMPLICIT NONE
INTEGER N,I
DOUBLE PRECISION F(N),X(N)
TRAP = 0.0D0
DO I = 1,N-1
TRAP = TRAP + (X(I+1)-X(I)) * (F(I)+F(I+1))
ENDDO
TRAP = TRAP * 0.50D0
RETURN
END
C==================================================================================
C==================================================================================
C==================================================================================
C==================================================================================
DOUBLE PRECISION FUNCTION RELERRP(X1,X2)
C==========================================================================================
C PURPOSE: COMPUTES THE RELATIVE ERROR (%) OF X2 WITH RESPECT TO X1
C
C==========================================================================================
C VARIABLE DESCRIPTION DATA TYPE
C -------- ----------- ---------
C
C INPUT:
C
C
C X1 ACTUAL VALUE OF X DOUBLE PRECISION
C X2 ESTIMATED VALUE OF X DOUBLE PRECISION
C
C OUTPUT:
C
C RELERRP RELATIVE ERROR * 100 DOUBLE PRECISION
C==========================================================================================
IMPLICIT NONE
DOUBLE PRECISION X1,X2
RELERRP = 100.0D0*(X2-X1)/X1
RETURN
END
C==================================================================================
C==================================================================================
C==================================================================================
C==================================================================================
LOGICAL FUNCTION ISNAN(X)
C==========================================================================================
C PURPOSE: DETECTS THE OCCURRENCE OF NaN
C==========================================================================================
C VARIABLE DESCRIPTION DATA TYPE
C -------- ----------- ---------
C
C INPUT:
C
C
C X VARIABLE TO BE TESTED DOUBLE PRECISION
C
C OUTPUT:
C
C ISNAN TEST RESULT LOGICAL
C==========================================================================================
IMPLICIT NONE
DOUBLE PRECISION X
IF(DABS(X).LE.HUGE(X))THEN
ISNAN = .FALSE.
ELSE
ISNAN = .TRUE.
END IF
RETURN
END
C==================================================================================
C==================================================================================
C==================================================================================
C==================================================================================
LOGICAL FUNCTION ISINF(X)
C==========================================================================================
C PURPOSE: DETECTS THE OCCURRENCE OF INF
C==========================================================================================
C VARIABLE DESCRIPTION DATA TYPE
C -------- ----------- ---------
C
C INPUT:
C
C
C X VARIABLE TO BE TESTED DOUBLE PRECISION
C
C OUTPUT:
C
C IINF TEST RESULT LOGICAL
C==========================================================================================
IMPLICIT NONE
DOUBLE PRECISION X
IF ((X+1.0D0).EQ.X) THEN
ISINF = .TRUE.
ELSE
ISINF = .FALSE.
END IF
RETURN
END
C==========================================================================================
C==========================================================================================
C==========================================================================================
C==========================================================================================
SUBROUTINE LOCATE(X,NX,XX,INDX)
C==========================================================================================
C PURPOSE: GIVEN A MONOTONICALLY INCREASING REAL ARRAY X(1:NX) AND A REAL VALUE XX,
C THIS SUBROUTINE RETURNS INDX SUCH THAT XX IS CLOSETS TO X(INDX).
C==========================================================================================
C VARIABLE DESCRIPTION DATA TYPE
C -------- ----------- ---------
C
C INPUT:
C
C X ARRAY TO SEARCH DOUBLE PRECISION (ARRAY,SIZE=NX)
C NX SIZE OF X INTEGER
C XX VALUE TO LOCATE IN ARRAY DOUBLE PRECISION
C
C OUTPUT:
C
C INDX INDEX IN ARRAY X SUCH THAT DOUBLE PRECISION (ARRAY,SIZE=N)
C XX IS CLOSEST TO X(INDX)
C==========================================================================================
INTEGER NX,INDX,IX
DOUBLE PRECISION X(NX),XX
IF((XX.LT.X(1)).OR.(XX.GT.X(NX))) THEN
WRITE(*,*)'ERROR IN SUBROUTINE SEARCH: XX IS OUT OF BOUNDS'
WRITE(*,*)'COMPUTATIONS ABORTED'
STOP
ENDIF
IF(XX.EQ.X(NX)) THEN
INDX = NX
ELSE
DO IX = 1,NX-1
IF((XX.GE.X(IX)).AND.(XX.LT.X(IX+1))) INDX = IX
ENDDO
IF(DABS(XX-X(INDX+1)).LT.DABS(XX-X(INDX))) INDX = INDX+1
ENDIF
RETURN
END
C==========================================================================================
C==========================================================================================
C==========================================================================================
C==========================================================================================
SUBROUTINE MAXIMUM(ARRAY,NSIZE,MAXVAL,MAXVALIND)
IMPLICIT NONE
INTEGER J,NSIZE,MAXVALIND
DOUBLE PRECISION ARRAY(NSIZE),MAXVAL
MAXVAL = ARRAY(1)
MAXVALIND = 1
DO J = 2,NSIZE
IF(MAXVAL.LT.ARRAY(J)) THEN
MAXVAL = ARRAY(J)
MAXVALIND = J
ENDIF
ENDDO
RETURN
END
C==========================================================================================
C==========================================================================================
C==========================================================================================
C==========================================================================================
SUBROUTINE MINIMUM(ARRAY,NSIZE,MINVAL,MINVALIND)
IMPLICIT NONE
INTEGER J,NSIZE,MINVALIND
DOUBLE PRECISION ARRAY(NSIZE),MINVAL
MINVAL = ARRAY(1)
DO J = 2,NSIZE
IF(MINVAL.GT.ARRAY(J)) THEN
MINVAL = ARRAY(J)
MINVALIND = J
ENDIF
ENDDO
RETURN
END
C==========================================================================================
C==========================================================================================
C==========================================================================================
C==========================================================================================
SUBROUTINE PROD1D(X,NX,Y,NY,Z)
C RETURNS THE ELEMENTWISE PRODUCT OF 1D VECTORS X(NX) AND Y(NY) IN Z(NX).
C AN ERROR IS PRODUCED IF NX.NE.NY
IMPLICIT NONE
INTEGER I,NX,NY
DOUBLE PRECISION X(NX),Y(NY),Z(NX)
IF(NX.NE.NY) THEN
WRITE(*,*)'ERROR IN SUBROUTINE PROD1D'
WRITE(*,*)'THE ARRAYS X AND Y ARE NOT OF THE SAME SIZE'
WRITE(*,*)'COMPUTAIONS ABORTED'
STOP
ENDIF
DO I = 1,NX
Z(I) = X(I)*Y(I)
ENDDO
RETURN
END
C==========================================================================================
C==========================================================================================
C==========================================================================================
C==========================================================================================
SUBROUTINE PROGRESSPC(J,N)
C==========================================================================================
C PURPOSE: SHOWS THE PROGRESS (PERCENTAGE) AT INDEX J OF A DO LOOP THAT EXECUTES N TIMES
C==========================================================================================
IMPLICIT NONE
INTEGER I,J,K,N
CHARACTER(LEN=17) BAR
C SET UP BAR
BAR = " PROGRESS: ???% "
DO I = 1,N
BAR = BAR // " "
ENDDO
BAR(17:17) = " "
C FILL OUT BAR
WRITE(UNIT=BAR(12:14),FMT="(I3)") 100*J/N
C PRINT BAR
WRITE(UNIT=6,FMT="(A1,A17)",ADVANCE="NO") CHAR(13),BAR
IF (J.NE.N) THEN
FLUSH(UNIT = 6)
ELSE
WRITE(UNIT = 6,FMT=*)
ENDIF
RETURN
END
C==========================================================================================
C==========================================================================================
C==========================================================================================
C==========================================================================================
SUBROUTINE PROGRESSBAR(J,N)
C==========================================================================================
C PURPOSE: SHOWS THE PROGRESS (PERCENTAGE AND BAR) AT INDEX J OF A DO LOOP THAT
C EXECUTES N TIMES
C==========================================================================================
IMPLICIT NONE
INTEGER I,J,K,N
CHARACTER(LEN=N+18) BAR
CHARACTER(LEN=1000) FRM
C SET UP BAR
BAR = "PROGRESS: ???% |"
DO I = 1,N
BAR = BAR // " "
ENDDO
BAR(N+17:N+17) = "|"
BAR(N+18:N+18) = " "
C SET UP FORMAT
WRITE(FRM, '(I3)')N+18
FRM = ADJUSTL(FRM)
FRM = "(A1,A" // TRIM(FRM) // ")"
C FILL OUT BAR
WRITE(UNIT=BAR(11:13),FMT="(I3)") 100*J/N
DO K = 1, J
BAR(16+K:16+K) = "*"
ENDDO
C PRINT BAR
WRITE(UNIT=6,FMT=FRM(1:LEN_TRIM(FRM)),ADVANCE="NO") CHAR(13),BAR
IF (J.NE.N) THEN
FLUSH(UNIT = 6)
ELSE
WRITE(UNIT = 6,FMT=*)
ENDIF
RETURN
END