poisp2.f 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. *DECK POISP2
  2. SUBROUTINE POISP2 (M, N, A, BB, C, Q, IDIMQ, B, B2, B3, W, W2, W3,
  3. + D, TCOS, P)
  4. C***BEGIN PROLOGUE POISP2
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to GENBUN
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE PRECISION (POISP2-S, CMPOSP-C)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C Subroutine to solve Poisson equation with periodic boundary
  13. C conditions.
  14. C
  15. C***SEE ALSO GENBUN
  16. C***ROUTINES CALLED POISD2, POISN2
  17. C***REVISION HISTORY (YYMMDD)
  18. C 801001 DATE WRITTEN
  19. C 890531 Changed all specific intrinsics to generic. (WRB)
  20. C 891214 Prologue converted to Version 4.0 format. (BAB)
  21. C 900402 Added TYPE section. (WRB)
  22. C***END PROLOGUE POISP2
  23. C
  24. DIMENSION A(*) ,BB(*) ,C(*) ,Q(IDIMQ,*) ,
  25. 1 B(*) ,B2(*) ,B3(*) ,W(*) ,
  26. 2 W2(*) ,W3(*) ,D(*) ,TCOS(*) ,
  27. 3 P(*)
  28. C***FIRST EXECUTABLE STATEMENT POISP2
  29. MR = M
  30. NR = (N+1)/2
  31. NRM1 = NR-1
  32. IF (2*NR .NE. N) GO TO 107
  33. C
  34. C EVEN NUMBER OF UNKNOWNS
  35. C
  36. DO 102 J=1,NRM1
  37. NRMJ = NR-J
  38. NRPJ = NR+J
  39. DO 101 I=1,MR
  40. S = Q(I,NRMJ)-Q(I,NRPJ)
  41. T = Q(I,NRMJ)+Q(I,NRPJ)
  42. Q(I,NRMJ) = S
  43. Q(I,NRPJ) = T
  44. 101 CONTINUE
  45. 102 CONTINUE
  46. DO 103 I=1,MR
  47. Q(I,NR) = 2.*Q(I,NR)
  48. Q(I,N) = 2.*Q(I,N)
  49. 103 CONTINUE
  50. CALL POISD2 (MR,NRM1,1,A,BB,C,Q,IDIMQ,B,W,D,TCOS,P)
  51. IPSTOR = W(1)
  52. CALL POISN2 (MR,NR+1,1,1,A,BB,C,Q(1,NR),IDIMQ,B,B2,B3,W,W2,W3,D,
  53. 1 TCOS,P)
  54. IPSTOR = MAX(IPSTOR,INT(W(1)))
  55. DO 105 J=1,NRM1
  56. NRMJ = NR-J
  57. NRPJ = NR+J
  58. DO 104 I=1,MR
  59. S = .5*(Q(I,NRPJ)+Q(I,NRMJ))
  60. T = .5*(Q(I,NRPJ)-Q(I,NRMJ))
  61. Q(I,NRMJ) = S
  62. Q(I,NRPJ) = T
  63. 104 CONTINUE
  64. 105 CONTINUE
  65. DO 106 I=1,MR
  66. Q(I,NR) = .5*Q(I,NR)
  67. Q(I,N) = .5*Q(I,N)
  68. 106 CONTINUE
  69. GO TO 118
  70. 107 CONTINUE
  71. C
  72. C ODD NUMBER OF UNKNOWNS
  73. C
  74. DO 109 J=1,NRM1
  75. NRPJ = N+1-J
  76. DO 108 I=1,MR
  77. S = Q(I,J)-Q(I,NRPJ)
  78. T = Q(I,J)+Q(I,NRPJ)
  79. Q(I,J) = S
  80. Q(I,NRPJ) = T
  81. 108 CONTINUE
  82. 109 CONTINUE
  83. DO 110 I=1,MR
  84. Q(I,NR) = 2.*Q(I,NR)
  85. 110 CONTINUE
  86. LH = NRM1/2
  87. DO 112 J=1,LH
  88. NRMJ = NR-J
  89. DO 111 I=1,MR
  90. S = Q(I,J)
  91. Q(I,J) = Q(I,NRMJ)
  92. Q(I,NRMJ) = S
  93. 111 CONTINUE
  94. 112 CONTINUE
  95. CALL POISD2 (MR,NRM1,2,A,BB,C,Q,IDIMQ,B,W,D,TCOS,P)
  96. IPSTOR = W(1)
  97. CALL POISN2 (MR,NR,2,1,A,BB,C,Q(1,NR),IDIMQ,B,B2,B3,W,W2,W3,D,
  98. 1 TCOS,P)
  99. IPSTOR = MAX(IPSTOR,INT(W(1)))
  100. DO 114 J=1,NRM1
  101. NRPJ = NR+J
  102. DO 113 I=1,MR
  103. S = .5*(Q(I,NRPJ)+Q(I,J))
  104. T = .5*(Q(I,NRPJ)-Q(I,J))
  105. Q(I,NRPJ) = T
  106. Q(I,J) = S
  107. 113 CONTINUE
  108. 114 CONTINUE
  109. DO 115 I=1,MR
  110. Q(I,NR) = .5*Q(I,NR)
  111. 115 CONTINUE
  112. DO 117 J=1,LH
  113. NRMJ = NR-J
  114. DO 116 I=1,MR
  115. S = Q(I,J)
  116. Q(I,J) = Q(I,NRMJ)
  117. Q(I,NRMJ) = S
  118. 116 CONTINUE
  119. 117 CONTINUE
  120. 118 CONTINUE
  121. C
  122. C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
  123. C
  124. W(1) = IPSTOR
  125. RETURN
  126. END