Go To Top Go Up Go Back Go Forward

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

Go To Top Go Up Go Back Go Forward
Copyright © Multipath Corporation