dprwvr.f 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. *DECK DPRWVR
  2. SUBROUTINE DPRWVR (KEY, IPAGE, LPG, SX, IX)
  3. C***BEGIN PROLOGUE DPRWVR
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to DSPLP
  6. C***LIBRARY SLATEC
  7. C***TYPE DOUBLE PRECISION (PRWVIR-S, DPRWVR-D)
  8. C***AUTHOR Hanson, R. J., (SNLA)
  9. C Wisniewski, J. A., (SNLA)
  10. C***DESCRIPTION
  11. C
  12. C DPRWVR LIMITS THE TYPE OF STORAGE TO A SEQUENTIAL SPARSE MATRIX
  13. C STORAGE SCHEME. THE PAGE STORAGE IS ON RANDOM ACCESS DISK.
  14. C DPRWVR IS PART OF THE SPARSE LP PACKAGE, DSPLP.
  15. C
  16. C KEY IS A FLAG WHICH INDICATES WHETHER A READ OR WRITE
  17. C OPERATION IS TO BE PERFORMED. A VALUE OF KEY=1 INDICATES
  18. C A READ. A VALUE OF KEY=2 INDICATES A WRITE.
  19. C IPAGE IS THE PAGE OF MATRIX MN WE ARE ACCESSING.
  20. C LPG IS THE LENGTH OF THE PAGE.
  21. C SX(*),IX(*) IS THE MATRIX DATA.
  22. C
  23. C THIS SUBROUTINE IS A MODIFICATION OF THE SUBROUTINE LRWVIR,
  24. C SANDIA LABS. REPT. SAND78-0785.
  25. C MODIFICATIONS BY K.L. HIEBERT AND R.J. HANSON
  26. C
  27. C***SEE ALSO DSPLP
  28. C***ROUTINES CALLED DREADP, DWRITP, SOPENM
  29. C***REVISION HISTORY (YYMMDD)
  30. C 811215 DATE WRITTEN
  31. C 891009 Removed unreferenced variables. (WRB)
  32. C 891214 Prologue converted to Version 4.0 format. (BAB)
  33. C 900328 Added TYPE section. (WRB)
  34. C 910403 Updated AUTHOR and DESCRIPTION sections. (WRB)
  35. C***END PROLOGUE DPRWVR
  36. DIMENSION IX(*)
  37. DOUBLE PRECISION SX(*),ZERO,ONE
  38. LOGICAL FIRST
  39. SAVE ZERO, ONE
  40. DATA ZERO,ONE/0.D0,1.D0/
  41. C***FIRST EXECUTABLE STATEMENT DPRWVR
  42. C
  43. C COMPUTE STARTING ADDRESS OF PAGE.
  44. C
  45. IPAGEF=SX(3)
  46. ISTART = IX(3) + 5
  47. C
  48. C OPEN RANDOM ACCESS FILE NUMBER IPAGEF, IF FIRST PAGE WRITE.
  49. C
  50. FIRST=SX(4).EQ.ZERO
  51. IF (.NOT.(FIRST)) GO TO 20002
  52. CALL SOPENM(IPAGEF,LPG)
  53. SX(4)=ONE
  54. C
  55. C PERFORM EITHER A READ OR A WRITE.
  56. C
  57. 20002 IADDR = 2*IPAGE - 1
  58. IF (.NOT.(KEY.EQ.1)) GO TO 20005
  59. CALL DREADP(IPAGEF,IX(ISTART),SX(ISTART),LPG,IADDR)
  60. GO TO 20006
  61. 20005 IF (.NOT.(KEY.EQ.2)) GO TO 10001
  62. CALL DWRITP(IPAGEF,IX(ISTART),SX(ISTART),LPG,IADDR)
  63. 10001 CONTINUE
  64. 20006 RETURN
  65. END