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	Program name:
	CHARACTER*9 MYNAME
	PARAMETER (MYNAME='EXAMPLE_2')
C
C	Input data functions:
	INTEGER ASK_I
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 FMSPSH(MYNAME)
	CALL FMSIST ('IPRF',1026)
	CALL FMSIGT ('MEMPTR',IMD_PTR)
	CALL FMSIGT ('MEMPTR',RMD_PTR)
	CALL FMSIGT ('MEMPTR',CMD_PTR)
	N = ASK_I ('Enter the number of equations')
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 FMSPOP(MYNAME)
	CALL FMSEND
	END
C=======================================================================
	SUBROUTINE MATGEN (A, LDA, N, B)
C=======================================================================
	CHARACTER*6 MYNAME
	COMPLEX*16 A(LDA,N), B(N), ZERO, ONE
	PARAMETER  (MYNAME='MATGEN')
	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
	CALL FMSPSH(MYNAME)
	A(1,1) = DCMPLX(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
	CALL FMSPOP(MYNAME)
	RETURN
	END
C=======================================================================
	INTEGER FUNCTION ASK_I(STRING)
C=======================================================================
	CHARACTER* (*) STRING
	WRITE(6,2000) STRING
	READ (5,*) ASK_I
	RETURN
 2000	FORMAT (1X,A,'>')
	END