cmposp.f 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. *DECK CMPOSP
  2. SUBROUTINE CMPOSP (M, N, A, BB, C, Q, IDIMQ, B, B2, B3, W, W2, W3,
  3. + D, TCOS, P)
  4. C***BEGIN PROLOGUE CMPOSP
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to CMGNBN
  7. C***LIBRARY SLATEC
  8. C***TYPE COMPLEX (POISP2-S, CMPOSP-C)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C Subroutine to solve Poisson's equation with periodic boundary
  13. C conditions.
  14. C
  15. C***SEE ALSO CMGNBN
  16. C***ROUTINES CALLED CMPOSD, CMPOSN
  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 CMPOSP
  23. C
  24. COMPLEX A ,BB ,C ,Q ,
  25. 1 B ,B2 ,B3 ,W ,
  26. 2 W2 ,W3 ,D ,TCOS ,
  27. 3 P ,S ,T
  28. DIMENSION A(*) ,BB(*) ,C(*) ,Q(IDIMQ,*) ,
  29. 1 B(*) ,B2(*) ,B3(*) ,W(*) ,
  30. 2 W2(*) ,W3(*) ,D(*) ,TCOS(*) ,
  31. 3 P(*)
  32. C***FIRST EXECUTABLE STATEMENT CMPOSP
  33. MR = M
  34. NR = (N+1)/2
  35. NRM1 = NR-1
  36. IF (2*NR .NE. N) GO TO 107
  37. C
  38. C EVEN NUMBER OF UNKNOWNS
  39. C
  40. DO 102 J=1,NRM1
  41. NRMJ = NR-J
  42. NRPJ = NR+J
  43. DO 101 I=1,MR
  44. S = Q(I,NRMJ)-Q(I,NRPJ)
  45. T = Q(I,NRMJ)+Q(I,NRPJ)
  46. Q(I,NRMJ) = S
  47. Q(I,NRPJ) = T
  48. 101 CONTINUE
  49. 102 CONTINUE
  50. DO 103 I=1,MR
  51. Q(I,NR) = 2.*Q(I,NR)
  52. Q(I,N) = 2.*Q(I,N)
  53. 103 CONTINUE
  54. CALL CMPOSD (MR,NRM1,1,A,BB,C,Q,IDIMQ,B,W,D,TCOS,P)
  55. IPSTOR = REAL(W(1))
  56. CALL CMPOSN (MR,NR+1,1,1,A,BB,C,Q(1,NR),IDIMQ,B,B2,B3,W,W2,W3,D,
  57. 1 TCOS,P)
  58. IPSTOR = MAX(IPSTOR,INT(REAL(W(1))))
  59. DO 105 J=1,NRM1
  60. NRMJ = NR-J
  61. NRPJ = NR+J
  62. DO 104 I=1,MR
  63. S = .5*(Q(I,NRPJ)+Q(I,NRMJ))
  64. T = .5*(Q(I,NRPJ)-Q(I,NRMJ))
  65. Q(I,NRMJ) = S
  66. Q(I,NRPJ) = T
  67. 104 CONTINUE
  68. 105 CONTINUE
  69. DO 106 I=1,MR
  70. Q(I,NR) = .5*Q(I,NR)
  71. Q(I,N) = .5*Q(I,N)
  72. 106 CONTINUE
  73. GO TO 118
  74. 107 CONTINUE
  75. C
  76. C ODD NUMBER OF UNKNOWNS
  77. C
  78. DO 109 J=1,NRM1
  79. NRPJ = N+1-J
  80. DO 108 I=1,MR
  81. S = Q(I,J)-Q(I,NRPJ)
  82. T = Q(I,J)+Q(I,NRPJ)
  83. Q(I,J) = S
  84. Q(I,NRPJ) = T
  85. 108 CONTINUE
  86. 109 CONTINUE
  87. DO 110 I=1,MR
  88. Q(I,NR) = 2.*Q(I,NR)
  89. 110 CONTINUE
  90. LH = NRM1/2
  91. DO 112 J=1,LH
  92. NRMJ = NR-J
  93. DO 111 I=1,MR
  94. S = Q(I,J)
  95. Q(I,J) = Q(I,NRMJ)
  96. Q(I,NRMJ) = S
  97. 111 CONTINUE
  98. 112 CONTINUE
  99. CALL CMPOSD (MR,NRM1,2,A,BB,C,Q,IDIMQ,B,W,D,TCOS,P)
  100. IPSTOR = REAL(W(1))
  101. CALL CMPOSN (MR,NR,2,1,A,BB,C,Q(1,NR),IDIMQ,B,B2,B3,W,W2,W3,D,
  102. 1 TCOS,P)
  103. IPSTOR = MAX(IPSTOR,INT(REAL(W(1))))
  104. DO 114 J=1,NRM1
  105. NRPJ = NR+J
  106. DO 113 I=1,MR
  107. S = .5*(Q(I,NRPJ)+Q(I,J))
  108. T = .5*(Q(I,NRPJ)-Q(I,J))
  109. Q(I,NRPJ) = T
  110. Q(I,J) = S
  111. 113 CONTINUE
  112. 114 CONTINUE
  113. DO 115 I=1,MR
  114. Q(I,NR) = .5*Q(I,NR)
  115. 115 CONTINUE
  116. DO 117 J=1,LH
  117. NRMJ = NR-J
  118. DO 116 I=1,MR
  119. S = Q(I,J)
  120. Q(I,J) = Q(I,NRMJ)
  121. Q(I,NRMJ) = S
  122. 116 CONTINUE
  123. 117 CONTINUE
  124. 118 CONTINUE
  125. C
  126. C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
  127. C
  128. W(1) = CMPLX(REAL(IPSTOR),0.)
  129. RETURN
  130. END