5
!CALL echo_f90(N, niters, check)
9
SUBROUTINE echo_f90(N, niters, check)
10
INTEGER, INTENT( IN ) :: N, niters
11
REAL, INTENT( OUT ) :: check
13
REAL, DIMENSION (N,N) :: P1, P2, P3, c
16
CALL echo_f90_setupInitialConditions(c, P1, P2, P3, N)
17
CALL checkArray_f90(P2, N)
18
CALL checkArray_f90(c, N)
21
P3(2:N-1,2:N-1) = (2-4*c(2:N-1,2:N-1)) * P2(2:N-1,2:N-1) &
22
+ c(2:N-1,2:N-1)*(P2(1:N-2,2:N-1) + P2(3:N,2:N-1) &
23
+ P2(2:N-1,1:N-2) + P2(2:N-1,3:N)) - P1(2:N-1,2:N-1)
37
SUBROUTINE echo_f90_setupInitialConditions(c, P1, P2, P3, N)
38
INTEGER, INTENT( IN ) :: N
39
REAL, DIMENSION (N,N) :: P1(N,N), P2(N,N), P3(N,N), c(N,N)
41
INTEGER blockLeft, blockRight, blockTop, blockBottom
42
INTEGER channelLeft, channelRight, channel1Height, channel2Height
47
! Set the velocity field
50
! Solid block with which the pulse collides
52
blockRight = 2 * N / 5.0
54
blockBottom = 2 * N / 3.0
55
c(blockTop:blockBottom, blockLeft:blockRight) = 0.5
57
! Channel directing the pulse leftwards
58
channelLeft = 4 * N / 5.0
60
channel1Height = 3 * N / 8.0
61
channel2Height = 5 * N / 8.0
63
c(channel1Height,channelLeft:channelRight) = 0.0;
64
c(channel2Height,channelLeft:channelRight) = 0.0;
66
! Initial pressure distribution: a gaussian pulse inside the channel
69
s2 = 64.0 * 9.0 / ((N / 2.0) ** 2)
73
P2(i,j) = exp(-((i-cr)**2 + (j-cc)**2) * s2)
85
SUBROUTINE checkArray_f90(A, N)
87
REAL, DIMENSION(N,N) :: A
94
check = check + (i*n+j)*A(i,j)
98
PRINT *, 'Array check: ', check