dplpdm.f 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. *DECK DPLPDM
  2. SUBROUTINE DPLPDM (MRELAS, NVARS, LMX, LBM, NREDC, INFO, IOPT,
  3. + IBASIS, IMAT, IBRC, IPR, IWR, IND, IBB, ANORM, EPS, UU, GG,
  4. + AMAT, BASMAT, CSC, WR, SINGLR, REDBAS)
  5. C***BEGIN PROLOGUE DPLPDM
  6. C***SUBSIDIARY
  7. C***PURPOSE Subsidiary to DSPLP
  8. C***LIBRARY SLATEC
  9. C***TYPE DOUBLE PRECISION (SPLPDM-S, DPLPDM-D)
  10. C***AUTHOR (UNKNOWN)
  11. C***DESCRIPTION
  12. C
  13. C THIS SUBPROGRAM IS FROM THE DSPLP( ) PACKAGE. IT PERFORMS THE
  14. C TASK OF DEFINING THE ENTRIES OF THE BASIS MATRIX AND
  15. C DECOMPOSING IT USING THE LA05 PACKAGE.
  16. C IT IS THE MAIN PART OF THE PROCEDURE (DECOMPOSE BASIS MATRIX).
  17. C
  18. C***SEE ALSO DSPLP
  19. C***ROUTINES CALLED DASUM, DPNNZR, LA05AD, XERMSG
  20. C***COMMON BLOCKS LA05DD
  21. C***REVISION HISTORY (YYMMDD)
  22. C 811215 DATE WRITTEN
  23. C 890605 Added DASUM to list of DOUBLE PRECISION variables.
  24. C 890605 Removed unreferenced labels. (WRB)
  25. C 891009 Removed unreferenced variable. (WRB)
  26. C 891214 Prologue converted to Version 4.0 format. (BAB)
  27. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  28. C 900328 Added TYPE section. (WRB)
  29. C 900510 Convert XERRWV calls to XERMSG calls, convert do-it-yourself
  30. C DO loops to DO loops. (RWC)
  31. C***END PROLOGUE DPLPDM
  32. INTEGER IBASIS(*),IMAT(*),IBRC(LBM,2),IPR(*),IWR(*),IND(*),IBB(*)
  33. DOUBLE PRECISION AIJ,AMAT(*),BASMAT(*),CSC(*),WR(*),ANORM,DASUM,
  34. * EPS,GG,ONE,SMALL,UU,ZERO
  35. LOGICAL SINGLR,REDBAS
  36. CHARACTER*16 XERN3
  37. C
  38. C COMMON BLOCK USED BY LA05 () PACKAGE..
  39. COMMON /LA05DD/ SMALL,LP,LENL,LENU,NCP,LROW,LCOL
  40. C
  41. C***FIRST EXECUTABLE STATEMENT DPLPDM
  42. ZERO = 0.D0
  43. ONE = 1.D0
  44. C
  45. C DEFINE BASIS MATRIX BY COLUMNS FOR SPARSE MATRIX EQUATION SOLVER.
  46. C THE LA05AD() SUBPROGRAM REQUIRES THE NONZERO ENTRIES OF THE MATRIX
  47. C TOGETHER WITH THE ROW AND COLUMN INDICES.
  48. C
  49. NZBM = 0
  50. C
  51. C DEFINE DEPENDENT VARIABLE COLUMNS. THESE ARE
  52. C COLS. OF THE IDENTITY MATRIX AND IMPLICITLY GENERATED.
  53. C
  54. DO 20 K = 1,MRELAS
  55. J = IBASIS(K)
  56. IF (J.GT.NVARS) THEN
  57. NZBM = NZBM+1
  58. IF (IND(J).EQ.2) THEN
  59. BASMAT(NZBM) = ONE
  60. ELSE
  61. BASMAT(NZBM) = -ONE
  62. ENDIF
  63. IBRC(NZBM,1) = J-NVARS
  64. IBRC(NZBM,2) = K
  65. ELSE
  66. C
  67. C DEFINE THE INDEP. VARIABLE COLS. THIS REQUIRES RETRIEVING
  68. C THE COLS. FROM THE SPARSE MATRIX DATA STRUCTURE.
  69. C
  70. I = 0
  71. 10 CALL DPNNZR(I,AIJ,IPLACE,AMAT,IMAT,J)
  72. IF (I.GT.0) THEN
  73. NZBM = NZBM+1
  74. BASMAT(NZBM) = AIJ*CSC(J)
  75. IBRC(NZBM,1) = I
  76. IBRC(NZBM,2) = K
  77. GO TO 10
  78. ENDIF
  79. ENDIF
  80. 20 CONTINUE
  81. C
  82. SINGLR = .FALSE.
  83. C
  84. C RECOMPUTE MATRIX NORM USING CRUDE NORM = SUM OF MAGNITUDES.
  85. C
  86. ANORM = DASUM(NZBM,BASMAT,1)
  87. SMALL = EPS*ANORM
  88. C
  89. C GET AN L-U FACTORIZATION OF THE BASIS MATRIX.
  90. C
  91. NREDC = NREDC+1
  92. REDBAS = .TRUE.
  93. CALL LA05AD(BASMAT,IBRC,NZBM,LBM,MRELAS,IPR,IWR,WR,GG,UU)
  94. C
  95. C CHECK RETURN VALUE OF ERROR FLAG, GG.
  96. C
  97. IF (GG.GE.ZERO) RETURN
  98. IF (GG.EQ.(-7.)) THEN
  99. CALL XERMSG ('SLATEC', 'DPLPDM',
  100. * 'IN DSPLP, SHORT ON STORAGE FOR LA05AD. ' //
  101. * 'USE PRGOPT(*) TO GIVE MORE.', 28, IOPT)
  102. INFO = -28
  103. ELSEIF (GG.EQ.(-5.)) THEN
  104. SINGLR = .TRUE.
  105. ELSE
  106. WRITE (XERN3, '(1PE15.6)') GG
  107. CALL XERMSG ('SLATEC', 'DPLPDM',
  108. * 'IN DSPLP, LA05AD RETURNED ERROR FLAG = ' // XERN3,
  109. * 27, IOPT)
  110. INFO = -27
  111. ENDIF
  112. RETURN
  113. END