Example 2. FMS Memory Management
This example extends example 1 to include the
FMS memory manager. The storage for A(N,N)
and X(N) are dynamically allocated at run time. This example
is also limited to full matrices which may be stored in
memory. If you specify a matrix size N that is too large,
fatal error FMS$ERR_MEMORY will result. Subroutine MATGEN
from the previous example is used to generate test data.
C E X A M P L E 2
C
C Data type = complex:
PARAMETER (IDTYPE = 2)
C
C Number of RHS vectors:
PARAMETER (NUMRHS = 1)
C
C Number of vectors to reduce during factoring:
PARAMETER (NUMRED = 0)
C
C Skip operations during solving (no):
PARAMETER (ISKIP = 0)
C
C FMS matrix and vector file attributes:
INTEGER LUA(25)
INTEGER LUX(25)
C
C FMS memory management requires the following arrays:
POINTER (CMD_PTR, CMD)
POINTER (RMD_PTR, RMD)
POINTER (IMD_PTR, IMD)
COMPLEX*16 CMD(0:1)
REAL*8 RMD(0:1)
INTEGER IMD(0:1)
C
C Local variables:
INTEGER N, LA, LX
REAL*8 EI, ERROR
C
C (1) Initialize FMS:
CALL FMSINI
CALL FMSIST ('IPRF',1026)
CALL FMSIGT ('MEMPTR',IMD_PTR)
CALL FMSIGT ('MEMPTR',RMD_PTR)
CALL FMSIGT ('MEMPTR',CMD_PTR)
WRITE(6,*) 'Enter the number of equations'
READ (5,*) N
C
C Populate [A] and {X} with test data:
CALL FMSCMG (CMD, LA, N*N)
CALL FMSCMG (CMD, LX, N)
CALL MATGEN (CMD(LA), N, N, CMD(LX))
C
C (2) Open FMS files:
CALL CNDANN (CMD(LA), N, N, LUA)
CALL FMSOV2 (N, IDTYPE, NUMRHS, CMD(LX), N, LUX)
C
C (3) Write data to FMS files:(Not required)
C
C (4) Perform matrix algebra:
CALL CNDF (LUA, LUA, LUX, LUX, NUMRED)
CALL CNDS (LUA, LUX, LUX, NUMRHS, ISKIP)
C (5) Read data from FMS files:(Not required)
C
C Check the answer:
ERROR = 0.0D0
DO 50 I = 1,N
EI = ABS(CMD(LX-1+I) - 1.0D0)
IF(EI .GT. ERROR) ERROR = EI
50 CONTINUE
WRITE(6,*) 'MAXIMUM ERROR =', ERROR
C
C (6) Close FMS files:
CALL FMSCM (LUA)
CALL FMSCV (LUX)
CALL FMSCMR (CMD, LA, N*N)
CALL FMSCMR (CMD, LX, N)
CALL FMSEND
END
SUBROUTINE MATGEN (A, LDA, N, B)
COMPLEX*16 A(LDA,N), B(N), ZERO, ONE
PARAMETER (ZERO=(0.D0,0.D0), ONE=(1.D0,1.D0))
C
C Populate [A] and {B} with test data:
C [A] {X} = {B}
C +- -+ + + + +
C | N -1 -1 -1 -1| | 1 | | 1 |
C |-1 1 0 0 0| | 1 | | 0 |
C |-1 0 1 0 0| | 1 | = | 0 |
C |-1 0 0 1 0| | 1 | | 0 |
C |-1 0 0 0 1| | 1 | | 0 |
C +- -+ + + + +
C
A(1,1) = CMPLX(N,N)
B(1) = ONE
DO 20 I = 2,N
DO 10 J = 2,N
A(I,J) = ZERO
10 CONTINUE
A(1,I) =-ONE
A(I,1) =-ONE
A(I,I) = ONE
B(I) = ZERO
20 CONTINUE
RETURN
END
Copyright © Multipath Corporation