Professional Documents
Culture Documents
265-291, 1994
Pergamo.
0098-3004(93)E0011-4
F D F L O W : A F O R T R A N - 7 7 SOLVER F O R 2-D
INCOMPRESSIBLE FLUID FLOW
C. M . LEMOS
Department of Coastal and Estuarine Dynamics, Instituto Hidrografico, R. das Trinas 49,
1296 Lisbon-Codex, Portugal
Key Words: Navier-Stokes equations, Finite differences, Computer program, Personal computers.
NOMENCLATURE
INTRODUCTION
I n this w o r k , a F O R T R A N - 7 7 p r o g r a m is p r e s e n t e d
a n d d o c u m e n t e d t h a t i m p l e m e n t s a finite difference
s o l u t i o n a l g o r i t h m for t h e i n c o m p r e s s i b l e N a v i e r S t o k e s e q u a t i o n s in t w o d i m e n s i o n s . T h i s p r o g r a m
w a s d e v e l o p e d p r i m a r i l y as a n e d u c a t i o n a l tool f o r
t e a c h i n g c o m p u t a t i o n a l fluid d y n a m i c s o n s m a l l P C s .
T h e s o l u t i o n a l g o r i t h m c o n s i s t s o f t w o stages. In t h e
first stage, a t e m p o r a r y velocity field u* is c a l c u l a t e d
from the momentum equation, with the pressure
g r a d i e n t e v a l u a t e d at t h e old t i m e level (nAt). T w o
finite difference s c h e m e s were i m p l e m e n t e d for t h e
c o m p u t a t i o n o f this t e m p o r a r y s o l u t i o n , o n e explicit
a n d a n o t h e r implicit ( f r a c t i o n a l - s t e p ) , w h i c h a r e b o t h
c o n s e r v a t i v e . In t h e s e c o n d stage, t h e a d v a n c e d - t i m e
velocity u ' + l a n d p r e s s u r e p ' + l a r e c a l c u l a t e d f r o m
t h e t e m p o r a r y s o l u t i o n u* u s i n g a p r e s s u r e - v e l o c i t y
i t e r a t i o n s c h e m e , so t h a t u" +1 satisfies t h e c o n t i n u i t y
equation.
Vxu,~-u*~O
velocity, used in the implicit
momentum
calculations
x = (x, y) = position vector
F o = subset of c~fZ on which Ditichlet-type conditions are imposed
fi=(:4, f) = auxiliary
265
266
C.M. LEMOS
GOVERNING EQUATIONS
The 2-D motion of an incompressible fluid
of uniform properties in a domain ~ with
smooth boundary ~3fL can be stated as an initialboundary value problem as follows: determine
u = ( u ( x , t ) , v ( x , t ) ) and p ( x , t ) V x = ( x , y ) =
f~ + c ~ for t > 0, such that
Ou
--
c2t
+ Vp + V . (uu - v V u ) = f,
v . u = 0,
(I)
(2)
Vx FD,
(3)
- ? + v ~-~" = F . ( x , t )
and
~/gr
V7 n = F A x : )
Vx FN,
(4)
where a f l = F o + F N ,
and n and z denote the
normal and tangential directions. These conditions
ub'ndS=O,t>:O.
(5)
n
Also, if FN = ff there are no boundary conditions for
the pressure. The initial condition u0(x ) = u(x,0) must
satisfy the incompressibility constraint
V ' u0 = 0,
(6)
VXFD.
(7)
@"+'
- -
On
'
(u " ~
= -n.
(8a)
-u*)
At
(8b)
267
- -THE BASIC
4Ay
ALGORITHM
-- - -
4Ax
Pi,j+l --Pi, j
v * = vT,j + At
kx
,)21
-~- U in/)
- ( u 7 ,.j+~+u7 ~.j)(v,"/+vL,.,)]
+v
+v
--
un
22vi4+ , o - l + f , ~ .
Ax
i,j+l
(10)
At(tJ - u " ) =
--Lx(t?t2)+vL~x(lJ),
(11)
(12)
12
(13)
,,
ui/-ui'i+At
1
- - - -
PT+l,j--pinj
[ ( U n+ I
4Ax
Ax
+v
+v
l)(Idn+l,j-I-~tdT`j
u n + I , j - - 2U~,j "~-un
L,,(4) = ~
I)1
l,j
(O,,, ~, ~ - 4 , , ,
,:),
Ax 2
,,j + u"
,,j- I L}
uT./+,- 2u~'
Ax 2
t-
(14)
(9)
268
C. M. LEMOS
dNI~X
II'I/~X
~+1
[a~]
=u~y + AtLx(Iu2]~y),
(15)
(16)
Vi,j
l
I dbi a j
b3
d2
Pi,j
Ilu ,j
Ut.l,dl m
Oi,&l
q i, j+l/2
l
1l
Pi,j
I
" .
, 07)
0
d3
a2
~bi= fi,,i,
(18a)
At
bi = - ut ~ - s,,
(18b)
Al
4 = 1 + % - u~) ~ x + 2s~
I~lUi+1/2,d
Al
a, = ur ~
1
qi,<2
Figure 2. Location of variables in typical mesh cell:
fractional indices (left), and integer indices used in code
(right).
- s~,
At
RHSi=u,,.,+--(Ur-U?),Ax
(18c)
(18d)
(18e)
"
+ u "i.j,,
~
"
"
ur= 1/2(Ui+l,j
u)= 1/2(uij+ui_l,j),
s~ = vAt/Ax 2, for I = I . . . . . IMAX-1.
with
269
(19a)
At
b, = - ~ ul ~ - s~,
(19b)
1
At
d , = 1 + ~ ( U r - - Ut)~X +2S~,
(19c)
ai
p~!
n !"!
I,J --, 1"
10 ~- - Ape,j,
!.! - - *
u ,o
~.)
At
u ~,j + ~
Ap~o,
(24a)
(24b)
u!n)l,j_.,u!,)
___At APio,
- '' - ~'J A x
(24c)
1 At
= ~ u, -~x - sx,
(19d)
!n! -4- A t
V !"!
Api.j,
t,J ~ V 1,) - -
(24d)
RHSi = v ~j,
(19e)
v~")
A t api, j,
" J - ' ---* v !"!
" ' - ' - X-}y
(24e)
--
vAtLyy(U *j)
(20)
(21)
1 (vn+l
n+l
+A-YY" ' j - v / . j _ , ) = 0 .
(22)
Di'j(ll(n))
Ap,,j= 2At(i/Ax2 + i/ky2).
(23)
270
C. M. LEMOS
U1"i1
I U2'j+l
1, a I = 0, RHSj = (Ub)7+ C2
dl = , al -- , RHS1 = (t'b)~'+ 12
Ul'j
I u2'j
-- fl,j
Free-slip conditions may be used to simulate inviscidfluid behavior when the discrete mesh is too coarse to
capture the details of the boundary layer.
When implicit methods are used, it is necessary
to prescribe boundary values for the temporary fields.
If the time-accuracy of the interior scheme is to be
preserved, these boundary values must be prescribed
in such a way that the implicit operators can be
inverted. Therefore, the boundary conditions for
(f,f) and (u*,v*) are
g + l + AtLx (p n + i )
_ A t f ~ + 112 +
Vb = ( I - - A t Q y ) v
0,
~l,j ~ U2,j"
tJb = ( I - A t Q y ) u
(At 2),
~ + 1 + AtL~. ( p "+ 1 )
" + ~ -- p") +
O(At 2),
v * = v ~,+ ~ + A t L y ( p
"+ ~ - p " )
C(At 2),
where Qy is the approximation for the convection~liffusion part of the momentum equations,
involving only y-derivatives. Because p " + l is not
known during the first stage, the approximation
p " +~ ~-p" may be satisfactory, at the cost of some
loss of formal accuracy. For first-order accuracy,
it is enough to set fib=U~,+l/2, 38=Vg+~/2,
U* = U~+1 , and v* = v[',+1 . In the present work, this
simple but satisfactory solution was adopted. More
complicated boundary conditions can be imposed
using the technique described next, with additional
programming effort. Consider the situation when
the velocity is to be prescribed, in the first half-step.
The discretized boundary conditions take the form
/41,j = (/db)~,+ 1 2
(25)
2v
At ~< max{u2 + t~2}'
(26)
At~<min
lul' ]~i"
(27)
271
FDFLO W.INC
PROGRAM DESCRIPTION
MAIN CYCLE
SETUP:
Read input data
Compute model constants
Initialize field uariables
PRINTF:
(r >: T FI, ]
272
C.M. LEMOS
BCEXP
ISTEP:
IVAR:
the index which is constant in the tridiagonal system of equations; this index
is J in the first half-step and I in the
second half-step, and is required only
when the boundary conditions depend
on the position along the boundary.
= 1 in the first half-step; = 2 in the
second half-step.
= 1 for u-velocity; = 2 for v-velocity.
PRINTF
This
subroutine
opens
the
input
file
F D F L O W . D A T , and reads the input parameters
needed for each specific calculation. The preparation
of the F D F L O W . D A T file for a sample calculation
is described in the next section. After the input
IBAR
10
JBAR
1.E-01
DELX
1.E-01
DELY
1.0-02
DELT
O.OE+O0
UI
O.OE+O0
VI
3.00
T~FIN
1.0
PRTDT
1.5
OMG
1.OE-01
NU
O.OE+O0
GX
O.OE+O0
GY
1.0E-03
EPSI
METHOD
TEST PROBLEM
273
u : (t,0)
P
and p fields. Figure 6 shows a graphical representation of the final steady solution. The results are
virtually identical to those reported by Greenspan
and Casulli (1988), the differences being the result of
their use of nonconservative differencing for the
convection terms. This sample test problem took
13sec (including disk I/O) on a 486DX/33MHzbased PC, using the Microsoft F O R T R A N compiler
(version 5.0).
APPLICATIONS
In order to test the accuracy and efficiency of
the computer program, two numerical studies were
performed: the calculation of lid-driven cavity flow
at high Reynolds number, and the calculation of
the flow past a backward-facing step for three
different Reynolds numbers. This last problem will
serve to illustrate how to define internal obstacles and
outflow boundary conditions by simple changes
in the code.
(0,o)
u = (0,o)
Figure 5. Definition sketch for cavity flow pattern.
274
C. M. LEMOS
Table 2. Calculated horizontal velocity for test problem, T = 2.0 sec
I=
J= 12
J= i i
J= I0
J= 9
J= 8
J= 7
J= 6
J= 5
J= 4
J= 3
J= 2
J= I
2.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
1.736
0.264
-0.027
-0.060
-0.052
-0.041
-0.032
-0.024
-0.017
-0.010
-0.002
0.002
3
1.521
0.479
0.053
-0,078
-0.106
-0.101
-0.086
-0.068
-0.050
-0.032
-0.011
0.011
4
1.392
0.608
0.151
-0.058
-0.135
-0.150
-0.137
-0.114
-0.086
-0.056
-0.022
0.022
U(I,J)
5
1.324
0.676
0.222
-0.032
-0.147
-0.181
-0.173
-0.146
-0.113
-0.076
-0.031
0.031
6
1.298
0.702
0.252
-0.020
-0.152
-0.194
-0.188
-0.160
-0.124
-0.083
-0.035
0.035
7
1.309
0.691
0.238
-0.030
-0.154
-0.190
-0.180
-0.151
-0.115
-0.077
-0.032
0.032
8
1.363
0.637
0.177
-0.058
-0.150
-0.166
-0.149
-0.120
-0.089
-0.058
-0.023
0.023
9
1.485
0.515
0.077
-0.084
-0.124
-0.118
-0.097
-0.074
-0.052
-0.032
-0.011
0.011
10
1.711
0.289
-0.016
-0.069
-0.065
-0.050
-0.036
-0.025
-0.017
-0.010
-0.002
0.002
I=
J= 12
J= 11
J= 10
J= 9
J= 8
J= 7
J= 6
J= 5
J= 4
J= 3
J= 2
J= 1
0.000
0.000
-0.264
-0.238
-0.177
-0.125
-0.084
-0.052
-0.028
-0.012
-0.002
0.000
0.000
0.000
0.264
0.238
0.177
0.125
0.084
0.052
0.028
0.012
0.002
0.000
0.000
0.000
0.215
0.295
0.277
0.224
0.163
0.109
0.064
0.031
0.009
0.000
0.000
0.000
0.129
0.226
0.246
0.217
0.168
0.117
0.072
0.036
0.011
0.000
V(I,J)
5
0.000
0.000
0.068
0.139
0.165
0.154
0.123
0.088
0.055
0.028
0.009
0.000
0.000
0.000
0.026
0.056
0.068
0.064
0.050
0.035
0.022
0.011
0.004
0.000
0.000
0.000
-0.011
-0.025
-0.035
-0.038
-0.034
-0.027
-0.018
-0.010
-0.003
0.000
0.000
0.000
-0.054
-0.115
-0.144
-0.140
-0.116
-0.084
-0.054
-0.028
-0.009
0.000
0.000
0.000
-0.122
-0.221
-0.247
-0.222
-0.173
-0.120
-0.074
-0.037
-0.012
0.000
I0
0.000
0.000
-0.226
-0.318
-0.303
-0.244
-0.176
-0.115
-0.067
-0.032
-0.009
0.000
275
I=
J= 12
J= 11
J= 10
J= 9
J= 8
J= 7
J= 6
J= 5
J= 4
J= 3
J= 2
J= 1
0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
0.000
-1.915
-1.064
-0.604
-0.350
-0.206
-0.125
-0.084
-0.070
-0.072
-0.083
0.000
3
0.000
-0.876
-0.740
-0.525
-0.349
-0.227
-0.150
-0.107
-0.087
-0.084
-0.093
0.000
P(I,J)
5
0.000
-0.458
-0.488
-0.404
-0.299
-0.210
-0.146
-0.108
-0.089
-0.086
-0.094
0.000
0.000
-0.272
-0.319
-0.291
-0.231
-0.170
-0.123
-0.094
-0.079
-0.076
-0.082
0.000
6
0.000
-0.162
-0.192
-0.185
-0.153
-0.116
-0.087
-0.069
-0.060
-0.057
-0.060
0.000
0.000
-0.057
-0.065
-0.070
-0.063
-0.052
-0.043
-0.039
-0.037
-0.035
-0.032
0.000
0.000
0.000
0.000
0.093
0.365
0.910
0.098
0.338
0.690
0.069
0.241
0.430
0.040
0.150
0.240
0.018
0.082
0.120
0.002
0.037
0.049
-0.010
0.010
0.011
-0.016 -0.003 -0.005
-0.016 -0.005 -0.006
-0.008
0.004
0.003
0.000
0.000
0.000
= 2 . O0
7
t
1
CYCLE=2OO
,"
1
,-
Ro
10
,"
=I O
VELMX=I.@O
Figure 6. Steady-state velocity field obtained in test problem.
3os OL pue '0g 'gE '01 = 1 aoj '000'01 = o~I ql!A~ molqoad ,~o U /~I!A~,O aoj aOlO0A
~(I!OOI0Apoz!lv, tuao N
L ~ang!::I
SL'=XWq3A
,,,,,,,,,,,,
.....
..-~......
....
,,,,,,,,,,,,,,,
.~
, , , ,
. . . . . .
. . . . . .
,,,,,,,,,,,
0000L =
~'=~
l[tFt~v...~..'~:::::;,
8
~._....
IkE
:::::
,
.. '. : :: : ,: :: ::::sss;.-.-;y,
.
.
: " :
~~.~Z~2
.~,{'{SS~l
~tt~.--"....~
LO'OL =
,,.
,~TT-::!
0
h~--~.~'~YT,;;s .......
::: : .....
~ ....
- ....
~1
~z'=x"]~^
"
:!
I,...--:>.~::_~-'=--'-~
LOOS=37~D
"'""""'"
~ :: - - - : ~ . . . . %~,,,'vvvHz~l
........
~ss~.;;;,,,,,;.~,,,~ ~c_,]
.............
.......
,,
,"z:
--
~i.~
LO " 0 S =
..%//HHZIUII~
"~',',",~,",'-.".\',.'.".~.~HQ~.~.~
cq
l/
/1/111,11~11
Oosg=3qg'kg/
~xxxx~......~.'///l/lll/~l
9Z'=XWq3A
---
tl
~x~xx~xxxx~.......:...~_.:~
0000L =
oa!
000L=37DID
'i~X,<~...~...~7__~.~z,/l//lllliJ/ll
[.~______________i
00"0L =
277
= (0,0}
Ld
C)
Ls
= 10,0}
L d = 12
Hd
',--,
s-I1
Hs
I
Hd = 2
(0,0)
L s = 1.4
H s = 1
Be
:]00
Fie
~]OOO
for I ~< IBAR/5 + ! and J ~< J B A R / 2 + 1. In subroutine BCIMP, a statement was added in the
block ISTEP = I / I V A R = 1 to put R H S X ( I ) = 1.0
for I N D E X > J B A R / 2 +
1, fixing the boundary
condition at the inlet. Also in BCIMP, the homogeneous Neumann conditions for u and v were imposed on the outlet boundary, using the method as
described. In subroutine STEP1, it was necessary
to add the statements D D X ( I ) = 1 . E + 3 0 and
DDY(J) = 1.E + 30 whenever I ~< IBAR/5 + 1 and
J ~< J B A R / 2 + 1. This simple procedure effectively
sets U(I,J) = 0 and V(I,J) = 0 for all cells defining the
step. In subroutine STEP2, a statement was included
in the main loop, to skip all obstacle cells.
Figure 9 shows the computed velocity distributions, each one corresponding to a different
Reynolds number. It is observed that as the Reynolds
Be
~10@OO
..
? i ~ ? ~ i ! i i ] i ! i ] i } ] : : ! ! Z i:i:::: i
...... ! ] ;il
Figure 9. Flow past backward-facing step, for Re = 100 (top), Re = 1000 (middle), and Re = 10.000
(bottom).
278
C.M. LEMOS
279
PARAMETER (IBAR2=IO2,JBAR2:102)
PARAMETER (I0=9)
REAL NU
REAL.8 T
INTEGER.4 CYCLE,PRCOUNT
COMMON UN(IBAR2,JBAR2),VN(IBAR2,JBAR2),U(IBAR2,JBAR2),
& V(IBAR2,JBAR2),P(IBAR2,JBAR2),XFLUX(IBAR2,JBAR2),
YFLUX(IBAR2,JBAR2),IBAR,JBAR,IMAX,JMAX,
&
&
&
&
IM1,JM1,DELX,DELY,RDX,RDY,DELT,UI,VI,T~FIN,TWPRT,
PRTDT,OMG,BETA,T,ITER,CYCLE,NU,GX,GY,EPSI,METHOD,PRCOUNT,
BBX(IBAR2),DDX(IBAR2),AAX(IBAR2),RHSX(IBAR2),
BBY(JBAR2),DDY(JBAR2),AAY(JBAR2),RHSY(JBAR2),SX,SY,
DTDX,DTDY
C
INPUT PARAMETERS (READ FROM FILE " F D F L O ~ . D A T " ) :
IBAR
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
CAGEO 20/3--B
JBAR
DELX
DELY
DELT
UI
VI
TNFIN
PRTDT
OMG
NU
GX
GY
EPSI
METHOD
:
:
:
:
:
:
:
:
:
BETA
:
T
ITER
:
CYCLE :
PRCOUNT:
BBX
DDX
AAX
V
P
UN
VN
XFLUX
YFLUX
IMAX
JMAX
IM1
:
:
:
JM1
RDX
RDY
N+I
N+I
N
N
280
C . M . LEMOS
RBSX
BBY
DDY
AAY
RHSY
DTDX
DTDY
SX
SY
:
:
:
:
:
:
:
:
:
IBAR2
JBAR2
IO
:
:
:
ELIMINATION
ELIMINATION
ELIMINATION
ELIMINATION
ELIMINATION
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
APPENDIX
FDFLOW.FOR
2
Listing
C. . . . . . . . . . . . . . . . . . . . .
== PROGRAM "FDFLOW.FOR" : . . . . . . . . . . . . . . . . . . . . . . . .
C=:=== A FORTRAN p r o g r a m f o r c o m p u t i n g i n c o m p r e s s i b l e
fluid flows
PROGRAM FDFLOW
INCLUDE ~FDFLOW.INC ~
** I N I T I A L I Z E VARIABLES AND PRINT INITIAL DATA
CALL SETUP
CALL PRINTF
C
C
C
C
C
C
CONTINUE
** ADVANCE TIME
CALL ADVANCE
** COMPUTE TEMPORARY VELOCITIES
CALL STEP1
** COMPUTE ADVANCED-TIME VELOCITIES AND PRESSURE
CALL STEP2
** PRINT CYCLE INFORMATION k FIELD VARIABLES
CALL PRINTF
I F ( T . G T . T W F I N ) STOP ~End o f P r o g r a m ~
GOTO 10
END
SUBROUTINE ADVANCE
INCLUDE ~FDFLOW.INC ~
** ADVANCE TIME
DO 10 I = I , I M A X
DO 10 J = I , J M A X
======
10
UN(I,J)=U(I,J)
VN(I,J)=V(I,J)
CONTINUE
T=T+DELT
CYCLE=CYCLE+I
RETURN
END
SUBROUTINE BCEXP
INCLUDE ~FDFLOW.INC ~
** SET BOUNDARY CONDITIONS WHEN VELOCITY IS CALCULATED EXPLICITLY
** BC'S MUST BE CODED BY HAND FOR EACH SPECIFIC PROBLEM
200
C
500
DO 200 J=I,JMAX
U(1,J):O.O
V(1,J)=-V(2,J)
U(IM1,J)=O.O
V(IMAX,J)=-V(IM1,J)
CONTINUE
DO 500 I=I,IMAX
V(I,JM1)=O.O
U(I,JMAX)=2.0-U(I,JM1)
V(I,1)=O.O
U(I,1)=-U(I,2)
CONTINUE
RETURN
END
SUBROUTINE BCIMP(INDEX,ISTEP,IVAR)
INCLUDE ~FDFLOW.INC ~
INTEGER INDEX,ISTEP,IVAR
** SET BOUNDARY CONDITIONS WHEN VELOCITY IS CALCULATED IMPLICITLY
** BC~S MUST BE CODED BY HAND FOR EACH SPECIFIC PROBLEM
INDEX IS J IN THE FIRST HALF-STEP AND I IN THE SECOND HALF-STEP
ISTEP IS 1 IN THE FIRST HALF-STEP AND 2 IN THE SECOND HALF-STEP
IVAR IS 1 FOR U-VELOCITY, AND 2 FOR V-VELOCITY
I F ( I S T E P . E Q . 1 ) THEN
I F ( I V A R . E q . 1 ) THEN
DDX(1)=I.O
AAX(1)=O.O
RHSX(1)=O.O
DDX(IMI)=I.O
BBX(IM1)=O.O
RHSX(IM1)=O.O
ELSEIF (IVAR.EQ.2) THEN
DDX(1):O.5
AAX(1)=0.5
RHSX(1):O.O
DDX(IMAX)=O.5
BBX(IMAX)=0.5
RHSX(IMAX):O.O
ENDIF
ENDIF
I F ( I S T E P . E Q . 2 ) THEN
I F (IVAR.EQ.1) THEN
DDY(1)=0.5
AAY(1)=0.5
RHSY(~)=O.O
DDY(JMAX)=0.5
BBY(JMAX)=0.5
RHSY(JMAX)=I.0
281
282
C.M. LEMOS
ELSEIF ( I V A R . E q . 2 ) THEN
DDY(1)=I.O
AAY(1)=O.O
RHSY(1)=O.O
DDY(JM1)=I.O
BBY(JM1)=O.O
RBSY(JM1)=O.O
ENDIF
ENDIF
RETURN
END
SUBROUTINE PRINTF
INCLUDE 'FDFLOW.INC'
CHARACTER*II FILENAME
** PRINT CYCLE INFORMATION AND FIELD VARIABLES
20
40
41
42
46
47
48
50
WRITE ( * , 5 0 ) ITER,T,CYCLE
IF (CYCLE.LE.O.OR.T+I.E-O6.GE.TWPRT) THEN
FILENAME=' '
FILENAME(I:4)='FLOW'
~RITE(FILENAME(5:7),46) PRCOUNT+IO0
FILENAME(8:II)='.OUT~
OPEN(IO,FILE=FILENAME,STATUS=~UNKNOWN ' )
WRITE ( 1 0 , 4 0 ) ITER
WRITE (I0,41) T
WRITE (I0,42) CYCLE
WRITE(IO,47)
DO 20 I=I,IMAX
DO 20 J=I,JMAX
WRITE(IO,48) I , J , U ( I , J ) , V ( I , J ) , P ( I , J )
CONTINUE
CLOSE(IO)
TWPRT=TWPRT+PRTDT
PRCOUNT=PRCOUNT+I
ENDIF
RETURN
FORMAT(IS,' ITER')
FORMAT(F8.3, ~ T ~)
FORMAT(IS,'
CYCLE')
FBRMAT(I3)
FORMAT(3X,'I',3X,'J',7X,~U',12X,'V~,13X,'P
')
FORMAT(2(IX,13),3(IX,IPE12.5))
FORMAT(IOX,'ITER=',I5,1OX,'TIME=',IPEI2.5,1OX,'CYCLE=',I6)
END
SUBROUTINE SETUP
INCLUDE 'FDFLOW.INC'
** READ INPUT PARAMETERS
OPEN(IO,FILE:'FDFLOW.DAT',STATUS=~OLD ' )
READ ( I 0 , . )
IBAR
READ ( I 0 , . )
JBAR
READ ( I O , . ) DELX
READ ( I O , . ) DELY
READ ( I O , . ) DELT
READ ( I O , . ) UI
READ ( I O , . ) VI
READ ( I 0 , . )
TWFIN
READ ( I O , . ) PRTDT
READ ( I O , . ) OMG
READ ( I 0 , . )
NU
READ ( I O , . ) GX
READ ( I 0 , . )
GY
EPSI
METHOD
10
DO 10 I=2,IM1
DO 10 J=2,JM1
U(I,J)=UI
V(I,J):VI
P(I,J)=O.O
CONTINUE
CALL BCEXP
RETURN
END
SUBROUTINE STEP1
INCLUDE 'FDFLOW.INC ~
** COMPUTES TEMPORARY VELOCITIES USING THE OLD PRESSURE GRADIENT
283
C.M. LEMOS
284
40 CONTINUE
CALL BCEXP
RETURN
C
2000 CONTINUE
C
** IMPLICIT METHOD (METHOD = 2 )
C
C
** STEP 1, EQ. 1
C
C
DO 100 J=2,JM1
DO 110 I=2,1M1-1
UR=O.5*(UN(I+I,J)+UN(I,J))
UL=O.b.(UN(I,J)+UN(I-1,J))
BBX(I)=-DTDX*UL-SX
DDX(1)= I.O+DTDX*(UR-UL)+2.0*SX
AAX(I)= DTDX*UR-SX
RHSX(I)=UN(I,J)+DTDX*(UR**2-UL**2)
110 CONTINUE
CALL B C I M P ( J , I , 1 )
CALL TRIDAG(BBX,DDX,AAX,RHSX,IM1)
DO 120 I = I , I M 1
120 U ( I , J ) = R H S X ( I )
100 CONTINUE
C
C
C
** STEP 1, EQ. 2
DO 200 J=2,JMI-I
DO 210 I=2,IMI
UR=O.5*(UN(I,J+I)+UN(I,J))
UL=O.5.(UN(I-1,J+I)+UN(I-1,J))
BBX(1)=-O.5*DTDX*UL-SX
DDX(I)= I.O+0.5.DTDX.(UR-UL)+2.0.SX
AAX(1)= 0.5.DTDX.UR-SX
RHSX(I)=VN(I,J)
210 CONTINUE
CALL BCIMP(J,1,2)
CALL TRIDAG(BBX,DDX,AAX,RHSX,IMAX)
DO 220 I=I,IMAX
220 V ( I , J ) = R H S X ( I )
200 CONTINUE
C
C
C
DO 230 J=2,JM1
DO 230 I=I,IMAX
VN(I,J)=V(I,J)
230 U N ( I , J ) = U ( I , J )
C
C
C
** STEP 2, EO. 1
DO 300 I=2,1MI-I
DO 310 J=2,JMI
VT=O.5*(VN(I,J)+VN(I+I,J))
VB=O.5*(VN(I,J-I)+VN(I+I,J-1))
BBY(J)=-O.5*VB*DTDY-SY
DDY(J)= I.O+0.5*(VT-VB)*DTDY+2.0*SY
AAY(J)= 0.5*VT*DTDY-SY
RHSY(J)=UN(I,J)-DTDX*(P(I+I,J)-P(I,J))+GX*DELT
310 CONTINUE
CALL BCIMP(I,2,1)
CALL TRIDAG(BBY,DDY,AAY,RHSY,JMAX)
DO 320 J=I,JMAX
320 U ( I , J ) : R H S Y ( J )
300 CONTINUE
C
C
C
** STEP 2,
EQ. 2
DO 400 I=2,IMI
DO 410 J=2,JMI-I
VT=O.5*(VN(I,J)+VN(I,J+I))
VB=O.5*(VN(I,J)+VN(I,J-1))
BBY(J)=-DTDY*VB-SY
BDY(J)= I.O+(VT-VB)*DTDY+2.0*SY
AAY(J)= DTDY.VT-SY
RHSY(J)=VN(I,J)+DTDY.(VT**2-VB**2-P(I,J+I)+P(I,J))+GY.DELT
410 CONTINUE
CALL B C I M P ( I , 2 , 2 )
CALL TRIDAG(BBY,BDY,AAY,RHSY,JM1)
DO 420 J : I , J M 1
420 V ( I , J ) = R H S Y ( J )
400 CONTINUE
RETURN
END
SUBROUTINE STEP2
INCLUDE ~FDFLO~.INC ~
** ITERATIVELY ADJUSTS PRESSURE AND VELOCITIES
10
C
C
C
ITER=O
FLAG:I.0
IF(FLAG.EO.O.O) GOTO 30
ITER=ITER+I
I F ( I T E R . G F . 5 0 0 0 ) STOP ~ P r e s s u r e f a i l e d
FLAG=O.O
t o c o n v e r g e !~
20
C
C
C
30
SUBROUTINE TRIDAG(BB,DD,AA,CC,NN)
DIMENSION A A ( . ) , B B ( . ) , C C ( . ) , D D ( . )
** THIS SUBROUTINE PERFORMS TRIDIAGBNAL ELIMINATION
BB=COEFFICIENT BEHIND DIAGONAL
DD=COEFFICIENT ON DIAGONAL
AA=COEFFICIENT AHEAD OF DIAGONAL
CC:R.H.S. VECTOR; CONTAINS THE SOLUTION ON RETURN
NN=NUMBER OF EQUATIONS
NOTE: DD AND CC ARE OVERWRITTEN BY THE SUBROUTINE
DO 10 I=2,NN
DD(I)=DD(I)-AA(I-1).(BB(I)/DD(I-1))
10
CC(I):CC(I)-CC(I-1)*(BB(I)/nn(I-1))
285
286
C.M. LEMOS
CC(NN)=CC(NN)/DD(NN)
DO 20 I=2,NN
J=NN-I+I
20 CC(J)=(CC(J)-AA(J)*CC(J+I))/DD(J)
RETURN
END
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
APPENDIX 3
FPLOT.FOR Listing
C ........................ PROGRAM "FPLOT.FOR" : . . . . . = = . . . . . . . . . . . . . .
C=== Post-processing program for visualization of the velocity field
PROGRAM FPLflT
INCLUDE 'FDFLOW.INC'
COMMON /WINDOW/ XMIN,YMIN,XMAX,YMAX
CHARACTER*11FILENAME
OPEN (IO,FILE=~FDFLOW.DAT~,STATUS='OLD,)
READ (IO,.) IBAR
READ (IO,.) JBAR
READ (IO,.) DELX
READ (IO,.) DELY
READ ( I 0 , . )
READ ( I O , . )
READ ( I O , . )
READ ( I 0 , . )
READ (IO,.)
READ (IO,.)
READ (I0,.)
READ (I0,.)
READ (IO,.)
READ (I0,*)
CLOSE(IO)
DELT
UI
VI
TWFIN
PRTDT
0MG
NU
GX
GY
EPSI
XMAX=DELX*FLOAT(IBAR)
YMAX=DELY*FLOAT(JBAR)
XMIN=O.O
YMIN=O.O
IMAX=IBAR+2
JMAX=JBAR+2
IMI=IMAX-I
JMI=JMAX-I
PRINT *,~Filename for plot ?~
READ (*,'(A)') FILENAME
OPEN (IO,FILE=FILENAME,STATUS='OLD')
READ (IO,*) ITER
READ (IO,.) T
READ ( I O , . ) CYCLE
READ ( I O , ' ( A ) ' )
DO 10 I=I,IMAX
DO I0 J=I,JMAX
10 READ (IO,*) I I , J J , U ( I , J ) , V ( I , J ) , P ( I , J )
CALL
CALL
CALL
CALL
DRWVEC(XMIN,YMIN,XMIN,YMAX,O)
DRWVEC(XMIN,YMAX,XMAX,YMAX,O)
DRWVEC(XMAX,YMAX,XMAX,YMIN,O)
DRWVEC(XMAX,YMIN,XMIN,YMIN,O)
PLOT(O.OI,O.01,3)
PLOT(O.01,8.5,2)
PLOT(ll.O,8.5,2)
PLOT(11.0,O.01,2)
PLOT(O.01,0.01,2)
SYMBOL(O.15,8.13,0.175,'T
=',0.0,6)
NUMBER(999.0,999.0,O.175,SNGL(T),O.O,2)
SYMBOL(O.15,5.53,0.175,'CYCLE=',O.O,6)
NUMBER(999.0,999.0,O.175,FLOAT(CYCLE),O.O,-1)
SYMBOL(O.15,2.93,0.175,'Re
=',0.0,6)
NUMBER(999.0,999.0,O.175,SNGL(1.OD+O/DBLE(NU))+l.E-3,0.O,-1)
SYMBOL(O.15,0.33,0.175,'VELMK:',O.O,6)
NUMBER(999.,999.0,O.175,VELMK,O.O,2)
SUBROUTINE DRWVEC(XINI,YINI,XEND,YEND,TIP)
COMMON /WINDOW/ XMIN,YMIN,XMAX,YMAX
REAL XINI,YINI,XEND,YEND,XMIN,YMIN,XMAX,YMAX
REAL XP1,YP1,XP2,YP2,XT1,YT1,XT2,YT2
INTEGER TIP
CALL CBNVERT(XINI,YINI,XP1,YP1)
CALL CONVERT(XEND,YEND,XP2,YP2)
CALL PLOT(XPI,YP1,3)
CALL PLOT(XP2,YP2,2)
IF (TIP.Eq.O) RETURN
**
DRAW T I P
OF ARROW I F T I P : I
UE=XP2-XP1
VE=YP2-YP1
XTl=XP2+O.125.(-2.0.UE-VE)
XT2=KP2+O.125*(-2.0.UE+VE)
YTl=YP2+O.125*(-2.0*VE+UE)
YT2=YP2+O.125*(-2.0*VE-UE)
CALL PLOT(XT1,YT1,2)
CALL PLOT(XT2,YT2,2)
CALL PLOT(XP2,YP2,2)
RETURN
END
SUBROUTINE CONVERT(X,Y,XPLOT,YPLOT)
COMMON /WINDOW/ XMIN,YMIN,XMAX,YMAX
REAL X,Y,XMIN,YMIN,XMAX,YMAX,XPLOT,YPLOT
CAGEO 2 0 i 3 ~ ;
287
288
C.M. LEMOS
DX=XMAX-XMIN
DY=YMAX-YMIN
D=AMAXI(DX,DY)
SF=I.O/D
XSHFT=O.5.(1.0-DX.SF)
YSHFT=O.5.(1.0-DY.SF)
XPLOT=((X-XMIN).SF+XSHFT).8.0+2.83
YPLOT=((Y-YMIN).SF+YSHFT).8.0+0.33
RETURN
END
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
APPENDIX
GRFPR1M.FOR Listing
C. . . . .
C. . . . .
SUBROUTINE PLOTS(IDUMMY,IOPORT,MODEL)
************************************************************************
C
C
C
C
C
.
.
*
.
.
************************************************************************
CHARACTER*12 PLTFILE
IDI=IDUMMY
ID2=IOPORT
10
20
30
ID3=MODEL
PRINT * , ~ F i l e n a m e f o r p l o t f i l e
READ ( * , 1 0 ) PLTFILE
OPEN(UNIT=90,FILE=PLTFILE)
CALL COLOR(7,IERR)
FORMAT(A)
FORMAT ( A , 2 F l O . 5 )
FORMAT ( A , F I O . 5 )
RETURN
END
>'
SUBROUTINE PLOT(X,Y,IPEN)
C***********************************************************************
C
C
C
C
C
C
C
IPEN=2
PEN UP
IPEN=3
PEN DOWN
IPEN=999 CLOSE PLOT FILE (END DRAWING)
C
C
NOTE:
....
WITH:
.
*
.
.
.
.
.
*
.
************************************************************************
IF ( I P E N . E O . 9 9 9 ) THEN
CLOSE ( 9 0 )
ENBIF
IF ( I P E N . E Q , 2 ) THEN
WRITE ( 9 0 , 1 0 ) ~PA ' , X , Y
ENDIF
IF ( I P E N . E Q . 3 ) THEN
10
289
WRITE ( 9 0 , 1 0 )
'MA ' , X , Y
ENDIF
FORMAT ( A , 2 F l O . 5 )
RETURN
END
SUBROUTINE SYMBOL(X,Y,HEIGHT,CTEXT,ANGLE,NC)
************************************************************************
C
*
C DRAWS A CHARACTER STRING
.
C
.
C
X,Y
: LOWER LEFT CORNER OF FIRST CHARACTER TO BE DRAWN;
*
C
I F X = 9 9 9 . 0 AND/OR Y = 9 9 9 . 0 , APPEND CTEXT TO THE LAST
*
C
TEXT STRING
.
C HEIGHT
= HEIGHT OF EACH CHARACTER
.
C
I F X = 9 9 9 . 0 AND/OR Y = 9 9 9 . 0 , THE HEIGHT OF THE LAST
*
C
TEXT STRING IS USED
C CTEXT
= TEXT TO BE DRAWN
.
C
ANGLE
= ANGLE ABOUT THE Z - A X I S , IN DEGREES
*
C
I F X = 9 9 9 . 0 AND/OR Y = 9 9 9 . 0 , THE ANGLE OF THE LAST
*
C
TEXT STRING I S USED
.
C
NC
= NUMBER OF CHARACTERS TO BE DRAWN
*
C
.
C
.
C
NOTE:
THIS SUBROUTINE IS NOT ENTIRELY COMPATIBLE WITH THE
*
C ....
PLOT88 LIBRARY
.
C
.
CHARACTER C T E X T * ( * )
CHARACTER*80 STPLflT,STSAVE
SAVE
XPLOT=X
YPLOT=Y
ANGPLOT=ANGLE
HPLOT=HEIGHT
STPLOT:CTEXT(I:NC)
IF (X.EQ.999.0.OR.Y.EQ.999.0)
THEN
XPLOT=XSAVE
YPLOT=YSAVE
ANGPLOT=ANGSAVE
HPLflT=HSAVE
STPLflT=STSAVE(I:LSTRING(STSAVE))//CTEXT(I:NC)
ENDIF
WRITE ( 9 0 , 1 0 )
~PS~,XPLOT,YPLOT,HPLOT,ANGPLOT, ~ "~
&
STPLOT(I:LSTRING(STPLOT)),'"'
XSAVE=XPLOT
YSAVE=YPLOT
HSAVE:HPLOT
10
ANGSAVE=ANGPLOT
STSAVE=STPLOT
FORMAT ( A , 4 F l O . 5 , 3 A )
RETURN
END
Continued overleaf
290
C . M . LEMOS
SUBROUTINE NUMBER(X,Y,HEIGHT,FPN,ANGLE,NDEC)
************************************************************************
C
C
C
C
C
C
C
C
C
C
ANGLE
X,Y
HEIGHT
FPN
C
C
C
NDEC
C
C
C
C
C
NOTE:
....
C
C
*
*
*
*
*
*
*
************************************************************************
CHARACTER RNUMBER*20,FM*20
RNUMBER=~
FM=~
100
110
120
130
140
I F ( N D E C . E Q . - 1 ) THEN
IRNUM = INT(FPN)
WRITE(RNUMBER,IO) IRNUM
ENDIF
I F ( N D E C . G E . O ) THEN
W R I T E ( F M , 2 0 ) NDEC
WRITE(RNUMBER,FM) FPN
ENDIF
DO 100 I = 1 , 2 0
IF(RNUMBER(I:I).NE.'
' ) GOTO 110
CONTINUE
CONTINUE
DO 120 J = I , 2 0
IF(RNUMBER(J:J).Eq.'
' ) GOTO 130
CONTINUE
CONTINUE
NCHAR=J-I
DO 140 NC=I,NCHAR
RNUMBER(NC:NC)=RNUMBER(NC+I-I:NC+I-1)
CONTINUE
RNUMBER(NCHAR+I:20)=~ ,
CALL SYMBOL (X,Y,HEIGHT,RNUMBER,ANGLE,NCHAR)
C
10
20
FORMAT(IIO)
FORMAT('(F15.',I1,')')
RETURN
END
SUBROUTINE FACTOR(FACT)
************************************************************************
C
C APPLIES A SCALE FACTOR
C
************************************************************************
10
W R I T E ( 9 0 , 1 0 ) 'SC
FORMAT ( A , 2 F 1 0 . 5 )
RETURN
END
',FACT,FACT
.
.
.
291
C
C
C
C
C
*
NOTE: T h i s f u n c t i o n was e x t r a c t e d from " P r o g r a m m i n g w i t h FORTRAN 77"*
....
by J . A s h c r o f t , R. H. E ] d r i d g e , H. W. P a u l s o n and G. A. W i l s o n *
S h e r i d a n H o u s e , I n c . , N . Y . , 1981
.
*
************************************************************************
CHARACTER STRING.(*)
DO 10 I = L E N ( S T R I N G ) , I , - 1
I F ( S T R I N G ( I : I ) . N E . ' ' ) THEN
LSTRING=I
RETURN
ENDIF
CONTINUE
LSTRING=O
RETURN
END
10
SUBROUTINE COLOR(IC,IERR)
************************************************************************
C
C
C
C
IERR
IC
C
C
IERR=O
IF(IC.LT.I.OR.IC.GT.15)
THEN
IERR=I
RETURN
10
ENDIF
WRITE ( 9 0 , 1 0 )
FORMAT(A,I2)
RETURN
END
'SP ' ,
IC
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*
*
*
*
*
*