s1merg.f 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. *DECK S1MERG
  2. SUBROUTINE S1MERG (TCOS, I1, M1, I2, M2, I3)
  3. C***BEGIN PROLOGUE S1MERG
  4. C***SUBSIDIARY
  5. C***PURPOSE Merge two strings of ascending real numbers.
  6. C***LIBRARY SLATEC
  7. C***TYPE SINGLE PRECISION (S1MERG-S, D1MERG-D, C1MERG-C, I1MERG-I)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C This subroutine merges two ascending strings of numbers in the
  12. C array TCOS. The first string is of length M1 and starts at
  13. C TCOS(I1+1). The second string is of length M2 and starts at
  14. C TCOS(I2+1). The merged string goes into TCOS(I3+1).
  15. C
  16. C***SEE ALSO GENBUN
  17. C***ROUTINES CALLED SCOPY
  18. C***REVISION HISTORY (YYMMDD)
  19. C 801001 DATE WRITTEN
  20. C 891214 Prologue converted to Version 4.0 format. (BAB)
  21. C 900402 Added TYPE section. (WRB)
  22. C 901120 Modified to use IF-THEN-ELSE. Previous spaghetti code did
  23. C not compile correctly with optimization on the IBM RS6000.
  24. C (RWC)
  25. C 920130 Code name changed from MERGE to S1MERG. (WRB)
  26. C***END PROLOGUE S1MERG
  27. INTEGER I1, I2, I3, M1, M2
  28. REAL TCOS(*)
  29. C
  30. INTEGER J1, J2, J3
  31. C
  32. C***FIRST EXECUTABLE STATEMENT S1MERG
  33. IF (M1.EQ.0 .AND. M2.EQ.0) RETURN
  34. C
  35. IF (M1.EQ.0 .AND. M2.NE.0) THEN
  36. CALL SCOPY (M2, TCOS(I2+1), 1, TCOS(I3+1), 1)
  37. RETURN
  38. ENDIF
  39. C
  40. IF (M1.NE.0 .AND. M2.EQ.0) THEN
  41. CALL SCOPY (M1, TCOS(I1+1), 1, TCOS(I3+1), 1)
  42. RETURN
  43. ENDIF
  44. C
  45. J1 = 1
  46. J2 = 1
  47. J3 = 1
  48. C
  49. 10 IF (TCOS(I1+J1) .LE. TCOS(I2+J2)) THEN
  50. TCOS(I3+J3) = TCOS(I1+J1)
  51. J1 = J1+1
  52. IF (J1 .GT. M1) THEN
  53. CALL SCOPY (M2-J2+1, TCOS(I2+J2), 1, TCOS(I3+J3+1), 1)
  54. RETURN
  55. ENDIF
  56. ELSE
  57. TCOS(I3+J3) = TCOS(I2+J2)
  58. J2 = J2+1
  59. IF (J2 .GT. M2) THEN
  60. CALL SCOPY (M1-J1+1, TCOS(I1+J1), 1, TCOS(I3+J3+1), 1)
  61. RETURN
  62. ENDIF
  63. ENDIF
  64. J3 = J3+1
  65. GO TO 10
  66. END