File: simul.f

package info (click to toggle)
x13as 1.1-B39-2
  • links: PTS, VCS
  • area: non-free
  • in suites: bullseye
  • size: 8,700 kB
  • sloc: fortran: 110,641; makefile: 14
file content (137 lines) | stat: -rw-r--r-- 3,094 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
**==simul.f    processed by SPAG 6.05Fc at 12:31 on 12 Oct 2004
      DOUBLE PRECISION FUNCTION SIMUL(N,A,X,Eps,Indic,Ia)
 
      IMPLICIT NONE
**--SIMUL7
C
C*** Start of declarations rewritten by SPAG
      INCLUDE 'srslen.prm'
C
C Dummy arguments
C
      REAL*8 Eps
      INTEGER Ia,Indic,N
      REAL*8 A(Ia,*),X(N)
C
C Local variables
C
      REAL*8 aijck,deter,pivot,y(PLEN)
      DOUBLE PRECISION DABS,DBLE
      INTEGER i,intch,ip1,irowi,irowj,irowk,iscan,j,jcoli,jcolj,jcolk,
     &        jscan,jtemp,k,km1,imax,nm1,INT
      REAL*8 irow(PLEN),jcol(PLEN),jord(PLEN)

      LOGICAL dpeq
      EXTERNAL dpeq
C
C*** End of declarations rewritten by SPAG
C
c ****  Start of Executable Program                                     
 
      imax=N
      DO i=1,N
       irow(i)=0D0
       jcol(i)=0D0
      END DO
      IF (Indic.GE.0) imax=N+1
      IF (N.LE.396) THEN
 
       deter=1.0D0
       DO k=1,N
        km1=k-1
        pivot=0.0D0
        DO i=1,N
         DO j=1,N
          IF (k.NE.1) THEN
           DO iscan=1,km1
            DO jscan=1,km1
             IF (dpeq(DBLE(i),irow(iscan))) GO TO 10
             IF (dpeq(DBLE(j),jcol(jscan))) GO TO 10
            END DO
           END DO
          END IF
          IF (DABS(A(i,j)).GT.DABS(pivot)) THEN
           pivot=A(i,j)
           irow(k)=DBLE(i)
           jcol(k)=DBLE(j)
          END IF
   10    CONTINUE
         END DO
        END DO
        IF (DABS(pivot).GT.Eps) THEN
 
         irowk=INT(irow(k))
         jcolk=INT(jcol(k))
         deter=deter*pivot
         DO j=1,imax
          A(irowk,j)=A(irowk,j)/pivot
         END DO
         A(irowk,jcolk)=1.0D0/pivot
         DO i=1,N
          aijck=A(i,jcolk)
          IF (i.NE.irowk) THEN
           A(i,jcolk)=-aijck/pivot
           DO j=1,imax
            IF (j.NE.jcolk) A(i,j)=A(i,j)-aijck*A(irowk,j)
           END DO
          END IF
         END DO
        ELSE
         SIMUL=0.0D0
         RETURN
        END IF
       END DO
       DO i=1,N
        irowi=INT(irow(i))
        jcoli=INT(jcol(i))
        jord(irowi)=jcol(i)
        IF (Indic.GE.0) X(jcoli)=A(irowi,imax)
       END DO
       intch=0
       nm1=N-1
       DO i=1,nm1
        ip1=i+1
        DO j=ip1,N
         IF (jord(j).LT.jord(i)) THEN
          jtemp=INT(jord(j))
          jord(j)=jord(i)
          jord(i)=DBLE(jtemp)
          intch=intch+1
         END IF
        END DO
       END DO
       IF (intch/2*2.NE.intch) deter=-deter
       IF (Indic.LE.0) THEN
 
        DO j=1,N
         DO i=1,N
          irowi=INT(irow(i))
          jcoli=INT(jcol(i))
          y(jcoli)=A(irowi,j)
         END DO
         DO i=1,N
          A(i,j)=y(i)
         END DO
        END DO
        DO i=1,N
         DO j=1,N
          irowj=INT(irow(j))
          jcolj=INT(jcol(j))
          y(irowj)=A(i,jcolj)
         END DO
         DO j=1,N
          A(i,j)=y(j)
         END DO
        END DO
        SIMUL=deter
        RETURN
       END IF
      ELSE
       WRITE (6,1010)
 1010  FORMAT ('ON TOO BIG')
       SIMUL=0.0D0
       RETURN
      END IF
      SIMUL=deter
      RETURN
      END