1
! Copyright (C) 2006 Imperial College London and others.
3
! Please see the AUTHORS file in the main source directory for a full list
4
! of copyright holders.
7
! Applied Modelling and Computation Group
8
! Department of Earth Science and Engineering
9
! Imperial College London
11
! amcgsoftware@imperial.ac.uk
13
! This library is free software; you can redistribute it and/or
14
! modify it under the terms of the GNU Lesser General Public
15
! License as published by the Free Software Foundation,
16
! version 2.1 of the License.
18
! This library is distributed in the hope that it will be useful,
19
! but WITHOUT ANY WARRANTY; without even the implied warranty of
20
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
! Lesser General Public License for more details.
23
! You should have received a copy of the GNU Lesser General Public
24
! License along with this library; if not, write to the Free Software
25
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
32
SUBROUTINE CAL_BULK_DENSITY( NPHASE, NCOMP, CV_NONODS, CV_PHA_NONODS, NCOEF, DEN, DERIV, &
33
T, P, MASSFRAC, EOS_COEFS, EOS_OPTION )
35
INTEGER, intent( in ) :: NPHASE, NCOMP, CV_NONODS, CV_PHA_NONODS, NCOEF
36
REAL, DIMENSION( CV_PHA_NONODS ), intent( inout ) :: DEN, DERIV
37
REAL, DIMENSION( CV_PHA_NONODS ), intent( in ) :: T
38
REAL, DIMENSION( CV_NONODS ), intent( in ) :: P
39
REAL, DIMENSION( CV_PHA_NONODS * NCOMP ), intent( in ) :: MASSFRAC
40
REAL, DIMENSION( NPHASE, NCOEF ), intent( in ) :: EOS_COEFS
41
INTEGER, DIMENSION( NPHASE ), intent( in ) :: EOS_OPTION
43
INTEGER :: ICOMP, CV_NOD, IPHASE, NOD, NCOMP2
45
write(357,*) 'In CAL_BULK_DENSITY'
53
Loop_Comp: DO ICOMP = 1, NCOMP2
55
CALL CAL_DENSITY( NPHASE, ICOMP, CV_NONODS, CV_PHA_NONODS, NCOEF, DEN, DERIV, &
56
T, P, EOS_COEFS, EOS_OPTION )
60
write(357,*) 'Leaving CAL_BULK_DENSITY'
63
END SUBROUTINE CAL_BULK_DENSITY
65
SUBROUTINE CAL_DENSITY( NPHASE, ICOMP, CV_NONODS, CV_PHA_NONODS, NCOEF, DEN, DERIV, &
66
T, P, EOS_COEFS, EOS_OPTION )
67
! This sub calculates the DEN ,DERIV for multiphase flows i.e. the EoS
70
INTEGER, intent( in ) :: NPHASE, ICOMP, CV_NONODS, CV_PHA_NONODS, NCOEF
71
REAL, DIMENSION( CV_PHA_NONODS ), intent( inout ) :: DEN, DERIV
72
REAL, DIMENSION( CV_PHA_NONODS ), intent( in ) :: T
73
REAL, DIMENSION( CV_NONODS ), intent( in ) :: P
74
REAL, DIMENSION( NPHASE, NCOEF ), intent( in ) :: EOS_COEFS
75
INTEGER, DIMENSION( NPHASE ), intent( in ) :: EOS_OPTION
77
REAL, PARAMETER :: TOLER = 1.0E-10
78
REAL :: DEN_P1, DEN_M1, PERT_P
79
INTEGER :: IPHASE, CV_NOD, NODE
81
write(357,*) 'In CAL_DENSITY'
83
Loop_Phase: DO IPHASE = 1, NPHASE
85
Loop_CV: DO CV_NOD = 1, CV_NONODS
87
NODE = CV_NOD + ( IPHASE - 1 ) * CV_NONODS
89
CALL CAL_DENSITY_EOS( NCOEF, DEN( NODE ), T( NODE ), P( CV_NOD ), &
90
EOS_COEFS( IPHASE, : ), EOS_OPTION( IPHASE ) )
92
IF( EOS_OPTION( IPHASE ) == 1) THEN
93
PERT_P = 0.001 * ( ABS(P( CV_NOD )) + ABS(EOS_COEFS( IPHASE, 1 )) )
95
PERT_P = 0.001 * ABS(P( CV_NOD ))
97
PERT_P =MAX(TOLER, PERT_P)
99
CALL CAL_DENSITY_EOS( NCOEF, DEN_P1, T( NODE ), P( CV_NOD ) + PERT_P, &
100
EOS_COEFS( IPHASE, : ), EOS_OPTION( IPHASE ) )
101
CALL CAL_DENSITY_EOS( NCOEF, DEN_M1, T( NODE ), P( CV_NOD ) - PERT_P, &
102
EOS_COEFS( IPHASE, : ), EOS_OPTION( IPHASE ) )
104
! Calculating d(DEN) / dP
105
DERIV( NODE ) = ( DEN_P1 - DEN_M1 ) / ( 2. * PERT_P )
111
write(357,*) 'Leaving CAL_DENSITY'
115
END SUBROUTINE CAL_DENSITY
119
SUBROUTINE CAL_DENSITY_EOS( NCOEF, DEN, T, P , &
120
EOS_COEFS, EOS_OPTION )
122
INTEGER, intent( in ) :: NCOEF
123
REAL, intent( inout ) :: DEN
124
REAL, intent( in ) :: T, P
125
REAL, DIMENSION( NCOEF ), intent( in ) :: EOS_COEFS
126
INTEGER, intent( in ) :: EOS_OPTION
128
IF( EOS_OPTION == 1 ) THEN
129
! stiffened gas EoS...
130
DEN = ( P + EOS_COEFS( 1 )) * EOS_COEFS( 2 ) / T
131
ELSEIF( EOS_OPTION == 2 ) THEN
132
! Linear EoS in pressure and temperature...
134
DEN = EOS_COEFS( 1 ) + EOS_COEFS( 2 ) * P + EOS_COEFS( 3 ) * T &
135
+ EOS_COEFS( 4 ) * P * T + EOS_COEFS( 5 ) * ( P **2 ) + EOS_COEFS( 6 ) * ( T **2 ) &
136
+ EOS_COEFS( 7 ) * ( P **2 ) * T + EOS_COEFS( 8 ) * P * ( T **2 ) + EOS_COEFS( 9 ) * (( P * T ) **2 )
142
END SUBROUTINE CAL_DENSITY_EOS
147
SUBROUTINE CAL_CPDEN( NPHASE, CV_NONODS, CV_PHA_NONODS, CPDEN, DEN, NCP_COEFS, CP_COEFS, CP_OPTION, STOTEL, CV_SNLOC, SUF_CPD_BCU, SUF_D_BCU )
149
! This sub calculates the CPDEN ie. CP*DEN
151
INTEGER, intent( in ) :: NPHASE, CV_NONODS, CV_PHA_NONODS, NCP_COEFS, STOTEL, CV_SNLOC
152
REAL, DIMENSION( CV_PHA_NONODS ), intent( in ) :: DEN
153
REAL, DIMENSION( CV_PHA_NONODS ), intent( inout ) :: CPDEN
154
REAL, DIMENSION( STOTEL * CV_SNLOC * NPHASE ), intent( in ) :: SUF_D_BCU
155
REAL, DIMENSION( STOTEL * CV_SNLOC * NPHASE ), intent( inout ) :: SUF_CPD_BCU
156
REAL, DIMENSION( NPHASE, NCP_COEFS ), intent( in ) :: CP_COEFS
157
INTEGER, DIMENSION( NPHASE ), intent( in ) :: CP_OPTION
159
INTEGER :: IPHASE, CV_NOD, CV_NOD_IPHA, IS_IPHA, II
161
Loop_Phase1: DO IPHASE = 1, NPHASE
163
Loop_CV: DO CV_NOD = 1, CV_NONODS
165
CV_NOD_IPHA = CV_NOD + ( IPHASE - 1 ) * CV_NONODS
167
IF( CP_OPTION( IPHASE ) == 1 ) THEN
168
CPDEN( CV_NOD_IPHA ) = CP_COEFS( IPHASE, 1 ) * DEN( CV_NOD_IPHA )
178
Loop_Surfaces: DO II = 1, STOTEL * CV_SNLOC
180
Loop_Phase2: DO IPHASE = 1, NPHASE
181
IS_IPHA = II + ( IPHASE - 1 ) * NPHASE
183
IF( CP_OPTION( IPHASE ) == 1 ) THEN
184
SUF_CPD_BCU( IS_IPHA ) = CP_COEFS( IPHASE, 1 ) * SUF_D_BCU( IS_IPHA )
194
END SUBROUTINE CAL_CPDEN
198
SUBROUTINE CAL_U_ABSORB( MAT_NONODS, CV_NONODS, NPHASE, NDIM, SATURA, TOTELE, CV_NLOC, MAT_NLOC, &
199
CV_NDGLN, MAT_NDGLN, &
200
NUABS_COEFS, UABS_COEFS, UABS_OPTION, U_ABSORB, VOLFRA_PORE, PERM, &
201
X, X_NLOC, X_NONODS, X_NDGLN, &
202
OPT_VEL_UPWIND_COEFS, NOPT_VEL_UPWIND_COEFS )
203
! Calculate absorption for momentum eqns
204
use matrix_operations
207
INTEGER, intent( in ) :: MAT_NONODS, CV_NONODS, NPHASE, NDIM, TOTELE, CV_NLOC,MAT_NLOC, &
208
NUABS_COEFS, X_NLOC, X_NONODS, NOPT_VEL_UPWIND_COEFS
209
REAL, DIMENSION( CV_NONODS * NPHASE ), intent( in ) :: SATURA
210
INTEGER, DIMENSION( TOTELE * CV_NLOC ), intent( in ) :: CV_NDGLN
211
INTEGER, DIMENSION( TOTELE * X_NLOC ), intent( in ) :: X_NDGLN
212
INTEGER, DIMENSION( TOTELE * MAT_NLOC ), intent( in ) :: MAT_NDGLN
213
REAL, DIMENSION( NPHASE, NUABS_COEFS ), intent( in ) :: UABS_COEFS
214
REAL, DIMENSION( X_NONODS ), intent( in ) :: X
215
INTEGER, DIMENSION( NPHASE ), intent( in ) :: UABS_OPTION
216
REAL, DIMENSION( MAT_NONODS, NDIM * NPHASE, NDIM * NPHASE ), intent( inout ) :: U_ABSORB
217
REAL, DIMENSION( TOTELE ), intent( in ) :: VOLFRA_PORE
218
REAL, DIMENSION( TOTELE, NDIM, NDIM ), intent( in ) :: PERM
219
REAL, DIMENSION( NOPT_VEL_UPWIND_COEFS ), intent( inout ) :: OPT_VEL_UPWIND_COEFS
221
REAL, DIMENSION( :, :, :), allocatable :: U_ABSORB2
222
REAL, DIMENSION( : ), allocatable :: SATURA2
224
INTEGER :: ELE, IMAT, ICV, IPHASE, CV_ILOC, IDIM, JDIM, IJ
226
write(357,*) 'In CAL_U_ABSORB'
228
ALLOCATE( U_ABSORB2( MAT_NONODS, NDIM * NPHASE, NDIM * NPHASE ))
229
ALLOCATE( SATURA2( CV_NONODS * NPHASE ))
233
write(357,*)'b4 in cal_u_absorb2, SATURA0',size(SATURA),SATURA
234
CALL CAL_U_ABSORB2( MAT_NONODS, CV_NONODS, NPHASE, NDIM, SATURA, TOTELE, CV_NLOC, MAT_NLOC, &
235
CV_NDGLN, MAT_NDGLN, &
236
NUABS_COEFS, UABS_COEFS, UABS_OPTION, U_ABSORB, PERM, &
237
X, X_NLOC, X_NONODS, X_NDGLN )
241
SATURA2( 1 : CV_NONODS ) = SATURA( 1 : CV_NONODS ) + PERT
242
IF (NPHASE > 1) SATURA2( 1 + CV_NONODS : 2 * CV_NONODS ) = SATURA( 1 + CV_NONODS : 2 * CV_NONODS ) - PERT
244
!write(357,*)'b4 in cal_u_absorb2, MAT_NONODS, CV_NONODS, NPHASE, NDIM:',MAT_NONODS, CV_NONODS, NPHASE, NDIM
245
!write(357,*)'b4 in cal_u_absorb2, TOTELE, CV_NLOC, MAT_NLOC, X_NLOC, X_NONODS:',TOTELE, CV_NLOC, MAT_NLOC, X_NLOC, X_NONODS
246
!write(357,*)'b4 in cal_u_absorb2, SATURA',size(SATURA),SATURA
247
!write(357,*)'b4 in cal_u_absorb2, SATURA2',size(SATURA2),SATURA2
248
!write(357,*)'b4 in cal_u_absorb2, CV_NDGLN',size(CV_NDGLN),CV_NDGLN
249
!write(357,*)'b4 in cal_u_absorb2, MAT_NDGLN',size(MAT_NDGLN),MAT_NDGLN
250
!write(357,*)'b4 in cal_u_absorb2, UABS_COEFS',size(UABS_COEFS),UABS_COEFS
251
!write(357,*)'b4 in cal_u_absorb2, UABS_OPTION',size(UABS_OPTION),UABS_OPTION
252
!write(357,*)'b4 in cal_u_absorb2, VOLFRA_PORE',size(VOLFRA_PORE),VOLFRA_PORE
253
!write(357,*)'b4 in cal_u_absorb2, PERM',size(PERM),PERM
254
!write(357,*)'b4 in cal_u_absorb2, X',size(X),X
255
!write(357,*)'b4 in cal_u_absorb2, X_NDGLN',size(X_NDGLN),X_NDGLN
256
!write(357,*)'b4 in cal_u_absorb2, U_ABSORB2:', size(U_ABSORB2),U_ABSORB2
257
!write(357,*)'b4 in cal_u_absorb2, OPT_VEL_UPWIND_COEFS:', size(OPT_VEL_UPWIND_COEFS),OPT_VEL_UPWIND_COEFS
259
CALL CAL_U_ABSORB2( MAT_NONODS, CV_NONODS, NPHASE, NDIM, SATURA2, TOTELE, CV_NLOC, MAT_NLOC, &
260
CV_NDGLN, MAT_NDGLN, &
261
NUABS_COEFS, UABS_COEFS, UABS_OPTION, U_ABSORB2, PERM, &
262
X, X_NLOC, X_NONODS, X_NDGLN )
264
write(357,*)'after in cal_u_absorb, U_ABSORB2:', size(U_ABSORB2),U_ABSORB2
268
IMAT=MAT_NDGLN((ELE-1)*MAT_NLOC+CV_ILOC)
269
ICV=CV_NDGLN((ELE-1)*CV_NLOC+CV_ILOC)
273
IJ=(IPHASE-1)*MAT_NONODS*NDIM*NDIM + (IMAT-1)*NDIM*NDIM + (IDIM-1)*NDIM +JDIM
274
OPT_VEL_UPWIND_COEFS(IJ) &
275
= U_ABSORB(IMAT, IDIM+(IPHASE-1)*NDIM, JDIM+(IPHASE-1)*NDIM)
276
! This is the gradient...
277
OPT_VEL_UPWIND_COEFS(IJ+NPHASE*MAT_NONODS*NDIM*NDIM) &
278
= (U_ABSORB2(IMAT, IDIM+(IPHASE-1)*NDIM, JDIM+(IPHASE-1)*NDIM) &
279
-U_ABSORB(IMAT, IDIM+(IPHASE-1)*NDIM, JDIM+(IPHASE-1)*NDIM)) &
280
/ (SATURA2(ICV+(IPHASE-1)*CV_NONODS)-SATURA(ICV+(IPHASE-1)*CV_NONODS))
287
write(357,*)'in cal_u_absorb, U_ABSORB:', size(U_ABSORB),U_ABSORB
288
write(357,*)'in cal_u_absorb, OPT_VEL_UPWIND_COEFS:', size(OPT_VEL_UPWIND_COEFS),OPT_VEL_UPWIND_COEFS
289
write(357,*) 'Leaving CAL_U_ABSORB'
292
END SUBROUTINE CAL_U_ABSORB
297
SUBROUTINE CAL_U_ABSORB2( MAT_NONODS, CV_NONODS, NPHASE, NDIM, SATURA, TOTELE, CV_NLOC, MAT_NLOC, &
298
CV_NDGLN, MAT_NDGLN, &
299
NUABS_COEFS, UABS_COEFS, UABS_OPTION, U_ABSORB, PERM, &
300
X, X_NLOC, X_NONODS, X_NDGLN )
301
! Calculate absorption for momentum eqns
302
use matrix_operations
305
INTEGER, intent( in ) :: MAT_NONODS, CV_NONODS, NPHASE, NDIM, TOTELE, CV_NLOC,MAT_NLOC, &
306
NUABS_COEFS, X_NLOC, X_NONODS
307
REAL, DIMENSION( CV_NONODS * NPHASE ), intent( in ) :: SATURA
308
INTEGER, DIMENSION( TOTELE * CV_NLOC ), intent( in ) :: CV_NDGLN
309
INTEGER, DIMENSION( TOTELE * X_NLOC ), intent( in ) :: X_NDGLN
310
INTEGER, DIMENSION( TOTELE * MAT_NLOC ), intent( in ) :: MAT_NDGLN
311
REAL, DIMENSION( NPHASE, NUABS_COEFS ), intent( in ) :: UABS_COEFS
312
REAL, DIMENSION( X_NONODS ), intent( in ) :: X
313
INTEGER, DIMENSION( NPHASE ), intent( in ) :: UABS_OPTION
314
REAL, DIMENSION( MAT_NONODS, NDIM * NPHASE, NDIM * NPHASE ), intent( inout ) :: U_ABSORB
315
REAL, DIMENSION( TOTELE, NDIM, NDIM ), intent( in ) :: PERM
317
REAL, PARAMETER :: TOLER = 1.E-10, REF_MOBILITY = 10.0
318
INTEGER :: ELE, CV_ILOC, CV_NOD, CV_PHA_NOD, MAT_NOD, JPHA_JDIM, &
319
IPHA_IDIM, IDIM, JDIM, IPHASE, II, jphase, X_NODI, MAT_NOD1, MAT_NOD2, MAT_NOD3, &
320
CV_NOD1, CV_NOD2, ELE2, CV_PHA_NOD1, CV_PHA_NOD2, &
321
MAT_NOD_MID, CV_ILOC2
322
REAL :: SATURATION, ABS_SUM, RSUM, &
323
U_ABS1, U_ABS2, U_ABS3
324
REAL, DIMENSION( :, :, :), allocatable :: INV_PERM
327
write(357,*) 'In CAL_U_ABSORB2'
329
ALLOCATE( INV_PERM( TOTELE, NDIM, NDIM ))
331
CALL PHA_BLOCK_INV( INV_PERM, PERM, TOTELE, NDIM )
335
Loop_ELE: DO ELE = 1, TOTELE
337
Loop_CVNLOC: DO CV_ILOC = 1, CV_NLOC
339
MAT_NOD = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + CV_ILOC)
340
CV_NOD = CV_NDGLN(( ELE - 1) * CV_NLOC + CV_ILOC )
342
Loop_NPHASE: DO IPHASE = 1, NPHASE
343
CV_PHA_NOD = CV_NOD + ( IPHASE - 1 ) * CV_NONODS
345
Loop_DimensionsI: DO IDIM = 1, NDIM
347
Loop_DimensionsJ: DO JDIM = 1, NDIM
349
SATURATION = SATURA( CV_PHA_NOD )
350
IPHA_IDIM = ( IPHASE - 1 ) * NDIM + IDIM
351
JPHA_JDIM = ( IPHASE - 1 ) * NDIM + JDIM
352
!JPHA_JDIM = IPHA_IDIM
354
Case_UABSOption: SELECT CASE( UABS_OPTION( IPHASE ) )
356
! no absorption option
357
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ) = 0.0
360
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ) = INV_PERM( ELE, IDIM, JDIM )
362
CASE( 2 ) ! A standard polynomial representation of relative permeability
364
DO II = 1, NUABS_COEFS
365
ABS_SUM = ABS_SUM + UABS_COEFS( IPHASE, II) * SATURATION** (II - 1 )
367
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ) = INV_PERM( ELE, IDIM, JDIM ) / &
368
MAX( TOLER, ABS_SUM )
370
CASE( 3 ) ! From Tara and Martin's notes for relative permeability
372
CALL ABS3( U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ), &
373
INV_PERM( ELE, IDIM, JDIM ), max(0.0,SATURA(CV_NOD)), IPHASE)
377
DO II = 1, NUABS_COEFS
378
ABS_SUM = ABS_SUM + UABS_COEFS( IPHASE, II) * SATURATION** (II - 1 )
380
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ) = ABS_SUM
383
write(357,*) 'Unknown Option -- UABS_OPTION( IPHASE )'
385
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ) = ABS_SUM
388
END SELECT Case_UABSOption
391
! write(357,*)'ELE, IDIM, JDIM, iphase, U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ):', &
392
! ELE, IDIM, JDIM, iphase, U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )
393
!U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ) = INV_PERM( ELE, IDIM, JDIM ) / &
394
! MAX( TOLER, UABS_COEFS( IPHASE, 1 ) + UABS_COEFS( IPHASE, 2) * SATURATION + &
395
! UABS_COEFS( IPHASE, 3 ) * SATURATION **2 )
396
!write(357,*) 'MAT_NOD, IPHA, JPHA, sat., U_ABSORB:', MAT_NOD, IPHA_IDIM, JPHA_JDIM, saturation, U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )
398
END DO Loop_DimensionsJ
400
END DO Loop_DimensionsI
409
Conditional_NotUsed1: IF(.false.) THEN
411
! Use upwind absorptions.
412
! IF((CV_NONODS==CV_NLOC*TOTELE).OR.(CV_NLOC==1)) THEN
416
MAT_NOD=MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + CV_ILOC)
417
CV_NOD=CV_NDGLN(( ELE - 1 ) * CV_NLOC + CV_ILOC)
419
DO IPHA_IDIM=1,NDIM*NPHASE
420
DO JPHA_JDIM=1,NDIM*NPHASE
421
if(IPHA_IDIM==JPHA_JDIM) then
423
1.0, 0.5*(SATURA(CV_NOD)+SATURA(CV_NOD-1)), IPHA_IDIM)
424
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )=RSUM
425
U_ABSORB( MAT_NOD-1, IPHA_IDIM, JPHA_JDIM )=RSUM
433
DO CV_ILOC=CV_NLOC,1,-1
434
MAT_NOD=MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + CV_ILOC)
445
MAT_NOD2=MAT_NDGLN(( ELE2 - 1 ) * MAT_NLOC + CV_ILOC2)
446
DO IPHA_IDIM=1,NDIM*NPHASE
447
DO JPHA_JDIM=1,NDIM*NPHASE
448
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )=U_ABSORB( MAT_NOD2, IPHA_IDIM, JPHA_JDIM )
454
ENDIF Conditional_NotUsed1
456
Conditional_NotUsed2: IF(.FALSE.) THEN
458
DO IPHA_IDIM=1,NDIM*NPHASE
459
DO JPHA_JDIM=1,NDIM*NPHASE
462
DO CV_ILOC = 1, CV_NLOC
463
MAT_NOD = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + CV_ILOC)
464
X_NODI = X_NDGLN(( ELE - 1 ) * X_NLOC + CV_ILOC)
465
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )=X(X_NODI)
470
ENDIF Conditional_NotUsed2
474
! Average absoption throughout element -using the harmonic average
476
DO IPHA_IDIM=1,NDIM*NPHASE
477
DO JPHA_JDIM=1,NDIM*NPHASE
480
DO CV_ILOC = 1, CV_NLOC
481
MAT_NOD = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + CV_ILOC)
482
! RSUM=RSUM+ (1./max(1.e-10,U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )))/REAL(CV_NLOC+1)
483
! IF(CV_ILOC==2) RSUM=RSUM+ (1./max(1.e-10,U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )))/REAL(CV_NLOC+1)
484
! RSUM=RSUM+ U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )/REAL(CV_NLOC)
485
RSUM=RSUM+ U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )/REAL(CV_NLOC+1)
486
IF(CV_ILOC==2) RSUM=RSUM+ U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )/REAL(CV_NLOC+1)
487
! RSUM=max(RSUM, U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ))
488
! RSUM=min(RSUM, U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ))
490
MAT_NOD1 = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + 1)
491
MAT_NOD2 = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + 2)
492
MAT_NOD3 = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + 3)
495
0.66666* U_ABSORB( MAT_NOD1, IPHA_IDIM, JPHA_JDIM ) &
496
+0.33333* U_ABSORB( MAT_NOD2, IPHA_IDIM, JPHA_JDIM )
499
0.5*0.5* U_ABSORB( MAT_NOD1, IPHA_IDIM, JPHA_JDIM ) &
500
+0.5* U_ABSORB( MAT_NOD2, IPHA_IDIM, JPHA_JDIM ) &
501
+0.5*0.5* U_ABSORB( MAT_NOD3, IPHA_IDIM, JPHA_JDIM )
504
0.33333* U_ABSORB( MAT_NOD2, IPHA_IDIM, JPHA_JDIM ) &
505
+0.66666* U_ABSORB( MAT_NOD3, IPHA_IDIM, JPHA_JDIM )
507
U_ABSORB( MAT_NOD1, IPHA_IDIM, JPHA_JDIM )=U_ABS1
508
U_ABSORB( MAT_NOD2, IPHA_IDIM, JPHA_JDIM )=U_ABS2
509
U_ABSORB( MAT_NOD3, IPHA_IDIM, JPHA_JDIM )=U_ABS3
511
DO CV_ILOC = 1, -CV_NLOC
512
MAT_NOD = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + CV_ILOC)
513
MAT_NOD1 = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + 3)
514
! U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )= &
515
! 0.25*U_ABSORB( MAT_NOD1, IPHA_IDIM, JPHA_JDIM ) &
516
! +0.25*U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )
517
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )=RSUM
518
! U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )=0.65*1./RSUM &
519
! + 0.35*U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )
520
! U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )=0.5*1./RSUM &
521
! + 0.5*U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )
522
! U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM )=1./RSUM
530
! write(357,*)'CV_NONODs,TOTELE*CV_NLOC,CV_NLOC:',CV_NONODs,TOTELE*CV_NLOC,CV_NLOC
533
! IF(CV_NONODS/=TOTELE*CV_NLOC) THEN
534
Conditional_NotUsed3: IF(.false.) THEN
538
DO IPHASE = 1, NPHASE
541
IPHA_IDIM = ( IPHASE - 1 ) * NDIM + IDIM
542
JPHA_JDIM = ( IPHASE - 1 ) * NDIM + JDIM
544
MAT_NOD = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + CV_ILOC)
545
CV_NOD = CV_NDGLN(( ELE - 1 ) * CV_NLOC + CV_ILOC)
546
SATURATION=SATURA(CV_NOD + ( IPHASE - 1 ) * CV_NONODS )
547
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ) &
548
= U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ) &
549
/ max(0.03,SATURATION)
556
DO IPHASE = 1, NPHASE
559
IPHA_IDIM = ( IPHASE - 1 ) * NDIM + IDIM
560
JPHA_JDIM = ( IPHASE - 1 ) * NDIM + JDIM
561
MAT_NOD1 = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + MAT_NLOC)
562
MAT_NOD2 = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + 1)
563
MAT_NOD_MID = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + 2)
565
CV_NOD1 = CV_NDGLN(( ELE - 1 ) * CV_NLOC + CV_NLOC)
566
CV_NOD2 = CV_NDGLN(( ELE - 1 ) * CV_NLOC + 1)
568
CV_PHA_NOD1 = CV_NOD1 + ( IPHASE - 1 ) * CV_NONODS
569
CV_PHA_NOD2 = CV_NOD2 + ( IPHASE - 1 ) * CV_NONODS
573
IF(U_ABSORB( MAT_NOD_MID, IPHA_IDIM, JPHA_JDIM ) &
574
>U_ABSORB( MAT_NOD1, IPHA_IDIM, JPHA_JDIM ) ) THEN
575
IF(U_ABSORB( MAT_NOD_MID, IPHA_IDIM, JPHA_JDIM ) &
576
>U_ABSORB( MAT_NOD2, IPHA_IDIM, JPHA_JDIM ) ) THEN
577
U_ABSORB( MAT_NOD_MID, IPHA_IDIM, JPHA_JDIM )= &
578
MAX(U_ABSORB( MAT_NOD1, IPHA_IDIM, JPHA_JDIM ), &
579
U_ABSORB( MAT_NOD2, IPHA_IDIM, JPHA_JDIM ))
583
IF(U_ABSORB( MAT_NOD_MID, IPHA_IDIM, JPHA_JDIM ) &
584
<U_ABSORB( MAT_NOD1, IPHA_IDIM, JPHA_JDIM ) ) THEN
585
IF(U_ABSORB( MAT_NOD_MID, IPHA_IDIM, JPHA_JDIM ) &
586
<U_ABSORB( MAT_NOD2, IPHA_IDIM, JPHA_JDIM ) ) THEN
587
U_ABSORB( MAT_NOD_MID, IPHA_IDIM, JPHA_JDIM )= &
588
MIN(U_ABSORB( MAT_NOD1, IPHA_IDIM, JPHA_JDIM ), &
589
U_ABSORB( MAT_NOD2, IPHA_IDIM, JPHA_JDIM ))
594
U_ABSORB( MAT_NOD_MID, IPHA_IDIM, JPHA_JDIM )= &
595
0.5*U_ABSORB( MAT_NOD1, IPHA_IDIM, JPHA_JDIM ) &
596
+0.5*U_ABSORB( MAT_NOD2, IPHA_IDIM, JPHA_JDIM )
603
DO IPHASE = 1, NPHASE
606
IPHA_IDIM = ( IPHASE - 1 ) * NDIM + IDIM
607
JPHA_JDIM = ( IPHASE - 1 ) * NDIM + JDIM
609
MAT_NOD = MAT_NDGLN(( ELE - 1 ) * MAT_NLOC + CV_ILOC)
610
CV_NOD = CV_NDGLN(( ELE - 1 ) * CV_NLOC + CV_ILOC)
611
SATURATION=SATURA(CV_NOD + ( IPHASE - 1 ) * CV_NONODS )
612
U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ) &
613
= U_ABSORB( MAT_NOD, IPHA_IDIM, JPHA_JDIM ) &
614
* max(0.03,SATURATION)
621
ENDIF Conditional_NotUsed3
623
write(357,*)'NUABS_COEFS,UABS_COEFS:',NUABS_COEFS,UABS_COEFS
624
write(357,*)'U_ABSORB:'
625
do mat_nod =1, -mat_nonods
627
write(357,*)mat_nod,iphase,(U_ABSORB( MAT_NOD, iphase, jphase ),jphase=1,2)
630
! write(357,*)'U_ABSORB:',U_ABSORB
632
DEALLOCATE( INV_PERM )
634
write(357,*) 'Leaving CAL_U_ABSORB2'
638
END SUBROUTINE CAL_U_ABSORB2
643
SUBROUTINE ABS3( ABSP, INV_PERM, SAT, IPHASE )
645
REAL, intent( inout ) :: ABSP
646
REAL, intent( in ) :: SAT, INV_PERM
647
INTEGER, intent( in ) :: IPHASE
649
REAL :: VISC1, VISC2, S_GC, S_OR, REF_MOBILITY, &
650
KR1, KR2, KR, VISC, SATURATION, ABS_SUM, SAT2
658
IF( IPHASE == 2 ) SATURATION = 1. - SAT
660
IF( SAT < S_GC ) THEN
662
ELSE IF( SAT > 1. -S_OR ) THEN
665
KR1 = ( ( SAT - S_GC) / ( 1. - S_GC - S_OR ))**2
669
IF( SAT2 < S_OR ) THEN
671
ELSEIF( SAT2 > 1. - S_GC ) THEN
674
KR2 = ( ( SAT2 - S_OR ) / ( 1. - S_GC - S_OR ))**2
678
IF( IPHASE == 1 ) THEN
686
ABS_SUM = KR / MAX( 1.e-6, VISC * max( 0.01, SATURATION ))
688
ABSP = INV_PERM / MAX( 1.e-6, ABS_SUM )
690
if( iphase == 1 ) then
691
ABSP = min( 1.e+4, ABSP )
692
if( saturation < 0.1 ) then
693
ABSP = ( 1. + max( 100. * ( 0.1 - saturation ), 0.0 )) * ABSP
696
ABSP = min( 1.e+5, ABSP )
697
if( saturation < 0.3 ) then
698
ABSP = ( 1. + max( 100. * ( 0.3 - saturation ), 0.0 )) * ABSP
707
SUBROUTINE CALC_CAPIL_PRES( CAPIL_PRES_OPT, CV_NONODS, NPHASE, NCAPIL_PRES_COEF, &
708
CAPIL_PRES_COEF, IPLIKE_GRAD_SOU, PLIKE_GRAD_SOU_COEF, PLIKE_GRAD_SOU_GRAD, SATURA )
710
! CAPIL_PRES_OPT is the capillary pressure option for deciding what form it might take.
711
! CAPIL_PRES_COEF( NCAPIL_PRES_COEF, NPHASE, NPHASE ) are the coefficients
712
! Capillary pressure coefs have the dims CAPIL_PRES_COEF( NCAPIL_PRES_COEF, NPHASE,NPHASE )
713
! used to calulcate the capillary pressure.
716
INTEGER, intent( in ) :: IPLIKE_GRAD_SOU, CAPIL_PRES_OPT, CV_NONODS, NPHASE, NCAPIL_PRES_COEF
717
REAL, DIMENSION( NCAPIL_PRES_COEF, NPHASE, NPHASE ), intent( in ) :: CAPIL_PRES_COEF
718
REAL, DIMENSION( IPLIKE_GRAD_SOU*CV_NONODS * NPHASE ), intent( inout ) :: &
719
PLIKE_GRAD_SOU_COEF, PLIKE_GRAD_SOU_GRAD
720
REAL, DIMENSION( CV_NONODS * NPHASE ), intent( in ) :: SATURA
722
INTEGER :: IPHASE, JPHASE
725
IF( IPLIKE_GRAD_SOU /= 1 ) THEN
726
WRITE(357,*),'PROBLEM WITH THE CAPILLARY OPTION SET UP'
731
Case_CapillaryPressure: SELECT CASE( CAPIL_PRES_OPT )
735
WRITE(357,*),'PROBLEM WITH THE CAPILLARY OPTION SET UP - OPTION NOT AVAILABLE'
739
! Capillary pressure coefs
740
! In this form PLIKE_GRAD_SOU_GRAD is the actual capillary pressure.
741
PLIKE_GRAD_SOU_COEF = 1.0
742
PLIKE_GRAD_SOU_GRAD = 0.0
744
DO IPHASE = 1, NPHASE
746
DO JPHASE = 1, NPHASE
748
PLIKE_GRAD_SOU_GRAD( 1 + ( IPHASE - 1 ) * CV_NONODS : IPHASE * CV_NONODS ) = &
749
PLIKE_GRAD_SOU_GRAD( 1 + ( IPHASE - 1 ) * CV_NONODS : IPHASE * CV_NONODS ) + &
750
CAPIL_PRES_COEF( 1, IPHASE, JPHASE ) * &
751
MAX( SATURA( 1 + ( JPHASE - 1 ) * CV_NONODS : JPHASE * CV_NONODS ), 0.0 ) &
752
** CAPIL_PRES_COEF( 2, IPHASE, JPHASE )
758
end SELECT Case_CapillaryPressure
761
END SUBROUTINE CALC_CAPIL_PRES
764
end module multiphase_EOS