Main Page   Class Hierarchy   Data Structures   File List   Data Fields   Globals  

varith.f

Go to the documentation of this file.
00001 
00002 c
00003 c       Copyright (c) 1986,1987,1988,1989,1990,1991,1992,1993,
00004 c       by Steve McMillan, Drexel University, Philadelphia, PA.
00005 c
00006 c       All rights reserved.
00007 c
00008 c       Redistribution and use in source and binary forms are permitted
00009 c       provided that the above copyright notice and this paragraph are
00010 c       duplicated in all such forms and that any documentation,
00011 c       advertising materials, and other materials related to such
00012 c       distribution and use acknowledge that the software was developed
00013 c       by the author named above.
00014 c
00015 c       THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
00016 c       IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
00017 c       WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00018 c
00019 
00020         subroutine varith(input,istart,nin,arr,nmax,narr,iprompt,*)
00021         save
00022 c
00023 c       Vector arithmetic.
00024 c
00025         character*(*) input
00026         dimension arr(nmax,3),narr(3)
00027 c
00028         character*1 c2
00029         dimension iarg(3)
00030 c
00031         if (nin.lt.istart) go to 1001
00032         c2 = input(2:2)
00033 c
00034         ibl=1
00035         narg=0
00036 c
00037 c       Decode the argument list
00038 c
00039         do 70 i=istart,nin
00040             if (input(i:i).eq.' '.or.input(i:i).eq.',') then
00041                 ibl=1
00042             else
00043                 if (ibl.eq.1) then
00044                     narg=narg+1
00045                     if (narg.ge.2.and.c2.eq.'c') then
00046                         call readrq(input(i:nin),2,
00047      &                              x1,x2,dum,dum,*69)
00048                         go to 71
00049 c
00050 69                      call readrq(input(i:nin),1,
00051      &                              x1,dum,dum,dum,*1001)
00052                         x2=1.e30
00053                         go to 71
00054 c
00055                     else if (narg.ge.2.and.c2.eq.'o') then
00056                         call readiq(input(i:nin),1,
00057      &                              noff,idum,idum,idum,*1001)
00058                         go to 71
00059 c
00060                     else if (narg.ge.2.and.c2.eq.'!') then
00061                         call readiq(input(i:nin),1,
00062      &                              nskip,idum,idum,idum,*1001)
00063                         if (nskip.lt.0) go to 1001
00064                         go to 71
00065                     else
00066                         call decode(input(i:i),iarg(narg),*1001)
00067                         if (narg.eq.3)go to 71
00068                     end if
00069                     ibl=0
00070                 end if
00071             end if
00072 70      continue
00073 71      continue
00074 c
00075         if (narg.lt.2) then
00076             if (c2.ne.'i'
00077         1           .and.c2.ne.'a'
00078         2           .and.c2.ne.'c'
00079         3           .and.c2.ne.'o'
00080         4           .and.c2.ne.'\\') go to 1001
00081         else if (narg.eq.2) then
00082             iarg(3)=iarg(2)
00083         end if
00084 c
00085         n = narr(iarg(1))
00086 c
00087 c       Apply the appropriate operation:
00088 c
00089         if (c2.eq.'+') then
00090             do 75 i=1,n
00091 75          arr(i,iarg(3))=arr(i,iarg(1)) + arr(i,iarg(2))
00092             narr(iarg(3)) = n
00093         else if (c2.eq.'-') then
00094             do 76 i=1,n
00095 76          arr(i,iarg(3))=arr(i,iarg(1)) - arr(i,iarg(2))
00096             narr(iarg(3)) = n
00097         else if (c2.eq.'*') then
00098             do 77 i=1,n
00099 77          arr(i,iarg(3))=arr(i,iarg(1)) * arr(i,iarg(2))
00100             narr(iarg(3)) = n
00101         else if (c2.eq.'/') then
00102             nerr=0
00103             do 78 i=1,n
00104                 s=arr(i,iarg(2))
00105                 if (s.eq.0.) then
00106                     nerr=nerr+1
00107                 else
00108                     arr(i,iarg(3))=arr(i,iarg(1))/s
00109                 end if
00110 78          continue
00111             narr(iarg(3)) = n
00112             if (nerr.gt.0) then
00113                 call devoff
00114                 if (iprompt.eq.1) write(6,'(i5,'' error(s)'')')nerr
00115             end if
00116         else if (c2.eq.'^') then
00117             nerr=0
00118             do 79 i=1,n
00119                 if (arr(i,iarg(1)).le.0.) then
00120                     nerr=nerr+1
00121                 else
00122                     arr(i,iarg(3))=arr(i,iarg(1))**arr(i,iarg(2))
00123                 end if
00124 79          continue
00125             narr(iarg(3)) = n
00126             if (nerr.gt.0) then
00127                 call devoff
00128                 if (iprompt.eq.1) write(6,'(i5,'' error(s)'')')nerr
00129             end if
00130         else if (c2.eq.'i') then
00131             do 80 i=1,n
00132 80          if (arr(i,iarg(1)).ne.0.) arr(i,iarg(1))=1./arr(i,iarg(1))
00133         else if (c2.eq.'a') then
00134             do 81 i=1,n
00135 81          arr(i,iarg(1))=abs(arr(i,iarg(1)))
00136         else if (c2.eq.'c') then
00137             do 82 i=1,n
00138 82          arr(i,iarg(1))=min(x2,max(x1,arr(i,iarg(1))))
00139         else if (c2.eq.'=') then
00140             do 83 i=1,n
00141 83          arr(i,iarg(2))=arr(i,iarg(1))
00142             narr(iarg(2)) = n
00143         else if (c2.eq.'o') then
00144             if (noff.gt.0) then
00145                 if (narr(iarg(1))+noff.gt.nmax) then
00146                     if (iprompt.eq.1) write(6,*)'Array overflow'
00147                     go to 1001
00148                 else
00149                     do 84 i=narr(iarg(1)),1,-1
00150 84                  arr(i+noff,iarg(1)) = arr(i,iarg(1))
00151                     do 85 i=1,noff
00152 85                  arr(i,iarg(1)) = 0.
00153                 end if
00154             else if (noff.lt.0) then
00155                 do 86 i=1-noff,narr(iarg(1))
00156 86              arr(i+noff,iarg(1)) = arr(i,iarg(1))
00157             end if
00158             narr(iarg(1)) = narr(iarg(1)) + noff
00159         else if (c2.eq.'\\') then
00160             do 87 i=1,n/2
00161                 temp = arr(i,iarg(1))
00162                 arr(i,iarg(1)) = arr(n+1-i,iarg(1))
00163                 arr(n+1-i,iarg(1)) = temp
00164 87          continue
00165         else if (c2.eq.'>') then
00166             do 88 i=1,n
00167 88          arr(i,iarg(3))=max(arr(i,iarg(1)), arr(i,iarg(2)))
00168             narr(iarg(3)) = n
00169         else if (c2.eq.'<') then
00170             do 89 i=1,n
00171 89          arr(i,iarg(3))=max(arr(i,iarg(1)), arr(i,iarg(2)))
00172             narr(iarg(3)) = n
00173         else if (c2.eq.'!') then
00174             if (nskip.gt.0) then
00175                 n1 = 0
00176                 do 90 i=1,n,nskip+1
00177                     n1 = n1 + 1
00178                     arr(n1,iarg(1)) = arr(i,iarg(1))
00179 90              continue
00180                 narr(iarg(1)) = n1
00181             end if
00182         else
00183             go to 1001
00184         end if
00185 c
00186         return
00187 1001    return 1
00188 c
00189         end
00190 
00191 
00192         subroutine negate(n,a)
00193         save
00194 c
00195 c       Replace array a by -a.
00196 c
00197         dimension a(1)
00198 c
00199         do 10 i=1,n
00200 10      a(i) = -a(i)
00201 c
00202         end

Generated at Sun Feb 24 09:57:20 2002 for STARLAB by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001