File: logelm.f

package info (click to toggle)
scilab 2.2-4
  • links: PTS
  • area: non-free
  • in suites: hamm
  • size: 31,472 kB
  • ctags: 21,963
  • sloc: fortran: 110,983; ansic: 89,717; makefile: 3,016; sh: 1,892; csh: 150; cpp: 101
file content (134 lines) | stat: -rw-r--r-- 2,843 bytes parent folder | download
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
      subroutine logelm
c ================================== ( Inria    ) =============
c evaluation des fonctions elementaires sur les booleens
c =============================================================
c
      include '../stack.h'
      double precision tv
c
      integer sadr,iadr
c
      iadr(l)=l+l-1
      sadr(l)=(l/2)+1
c

c     functions/fin
c     1      
c   find
c
c
      lw=lstk(top+1)
c
      goto (10) fin
c
c     find
c
   10 if(rhs.ne.1) then
         call error(39)
         return
      endif
      if(lhs.gt.2) then
         call error(39)
         return
      endif
      il1=iadr(lstk(top))
      if(istk(il1).eq.6) goto 20
      if(istk(il1).ne.4) then
         err=1
         call error(215)
         return
      endif
c
      m1=istk(il1+1)
      n1=istk(il1+2)
      mn1=m1*n1
      il=max(il1+3+mn1,iadr(lstk(top)+mn1*lhs)+8)
      err=sadr(il+mn1)-lstk(bot)
      if(err.gt.0) then
         call error(17)
         return
      endif
      call icopy(mn1,istk(il1+3),1,istk(il),1)
      istk(il1)=1
      l1=sadr(il1+4)
      if(mn1.gt.0) then
         l=l1
         do 11 k=0,mn1-1
            if(istk(il+k).ne.1) goto 11
            stk(l)=float(k+1)
            l=l+1
 11      continue
         nt=l-l1
      else
         nt=0
      endif
      istk(il1+1)=min(1,nt)
      istk(il1+2)=nt
      istk(il1+3)=0
      lstk(top+1)=l1+nt
      if(lhs.eq.1) goto 999
      top=top+1
      il2=iadr(lstk(top))
      istk(il2)=1
      istk(il2+1)=min(1,nt)
      istk(il2+2)=nt
      istk(il2+3)=0
      l2=sadr(il2+4)
      lstk(top+1)=l2+nt
      if(nt.eq.0) goto 999
      do 12 k=0,nt-1
         stk(l2+k)=float(int((stk(l1+k)-1.0d0)/m1)+1)
         stk(l1+k)=stk(l1+k)-(stk(l2+k)-1.0d+0)*m1
 12   continue
      goto 999
c
 20   continue
c     sparse matrix find

      m1=istk(il1+1)
      n1=istk(il1+2)
      nel1=istk(il1+4)
c
      li=sadr(il1+4)
      ilj=iadr(li+nel1)
      lj=sadr(ilj+4)
      lw=max(lw,lj+nel1)
      ilr=iadr(lw)
      lw=sadr(ilr+m1+nel1)
      err=lw-lstk(bot)
      if(err.gt.0) then
         call error(17)
         return
      endif
      call icopy(m1+nel1,istk(il1+5),1,istk(ilr),1)
      call int2db(nel1,istk(ilr+m1),1,stk(lj),1)
      i1=0
      do 30 i=0,m1-1
         if(istk(ilr+i).ne.0) then
            tv=i+1
            call dset(istk(ilr+i),tv,stk(li+i1),1)
            i1=i1+istk(ilr+i)
         endif
 30   continue
      istk(il1)=1
      istk(il1+1)=1
      istk(il1+2)=nel1
      istk(il1+3)=0
      lstk(top+1)=li+nel1
      if(lhs.eq.1) then
         do 31 i=0,nel1-1
            stk(li+i)=stk(li+i)+(stk(lj+i)-1.0d0)*m1
 31      continue
      else
         top=top+1
         istk(ilj)=1
         istk(ilj+1)=1
         istk(ilj+2)=nel1
         istk(ilj+3)=0
         lstk(top+1)=lj+nel1
      endif
      goto 999
         
c
  999 return
      end