Main Page   Class Hierarchy   Data Structures   File List   Data Fields   Globals  

readcols.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 readcols(lunit,nhead,nread,ix,iy,x,y,z,n,nmax,
00021      &                      c1,info,iprompt,*)
00022         save
00023 c
00024 c       Read data from the specified column(s) of a file.  Skip the
00025 c       first nhead lines, and read at most min(nread,nmax) lines.
00026 c
00027         dimension x(nmax),y(nmax),z(nmax)
00028         character*1 c1
00029 c
00030 c       Read data in double precision, to allow offset if necessary.
00031 c
00032         real*8 dummy(1000)
00033 c
00034         character*4000 line
00035         character*40 column(200)
00036 c
00037         common /data offset/ delx,dely,delz,facx,facy,facz
00038 c
00039         common /file input/ inpmode
00040 c
00041         character*1 comment
00042         common /file comment/ icomment,comment
00043 c
00044         data icomment/0/comment/' '/
00045 c
00046         n=0
00047         i1 = min(ix,iy)
00048         i2 = max(ix,iy)
00049 c
00050 c       Skip the header lines.
00051 c
00052         rewind lunit
00053         do 10 i=1,nhead
00054 10      read(lunit,*,err=120,end=120)
00055 c
00056 110     if (n.ge.nmax) then
00057             if (info.eq.1) then
00058                 call devoff
00059                 if (iprompt.eq.1) write(6,101)n
00060 101             format('Warning: maximum # of points (',i6,
00061      &                 ') reached.')
00062             end if
00063             n = n + 1
00064         else
00065             n = n + 1
00066 c
00067 c           Note that the first line is read the hard way to check
00068 c           that the number of columns is OK.
00069 c
00070             if (n.gt.1.and.inpmode.eq.0) then
00071                 if (i2.gt.i1) then
00072                     read(lunit,*,err=120,end=120)(dummy(i),i=1,i2)
00073                     x(n) = facx * (dummy(i1) - delx)
00074                     y(n) = facy * (dummy(i2) - dely)
00075                 else
00076                     read(lunit,*,err=120,end=120)(dummy(i),i=1,i1)
00077                     if (c1.eq.'x') then
00078                         x(n) = facx * (dummy(i1) - delx)
00079                     else if (c1.eq.'y') then
00080                         y(n) = facy * (dummy(i1) - dely)
00081                     else if (c1.eq.'z') then
00082                         z(n) = facz * (dummy(i1) - delz)
00083                     else
00084                         return 1
00085                     end if
00086                 end if
00087             else
00088 c
00089 c               (MUCH) slower, but surer...
00090 c
00091                 read(lunit,'(a)',err=120,end=120)line
00092 c
00093 c               Locate the end of the string ('                    ').
00094 c               This will fail if the intercolumn spacing is too great...
00095 c
00096                 nl = index(line,'                    ') - 1
00097 c
00098                 if (nl.le.0) then
00099                     n = n - 1
00100                     go to 118
00101                 end if
00102 c
00103 c               Check for comments.
00104 c
00105                 if (icomment.ne.0.and.line(1:1).eq.comment) then
00106                     n = n - 1
00107                     go to 118
00108                 end if
00109 c
00110 c               Split line into columns.
00111 c
00112                 call gettokens(line(1:nl),column,nc)
00113                 if (nc.lt.max(i1,i2)) then
00114                     if (iprompt.eq.1) write(6,'(a,i3,a)')
00115      &                      'Data file has only ',nc,' columns'
00116                     return 1
00117                 end if
00118 c
00119                 if (i2.gt.i1) then
00120                     call readdtoken(column(i1),dummy,dummy)
00121                     x(n) = dummy(1)
00122                     call readdtoken(column(i2),dummy,dummy)
00123                     y(n) = dummy(1)
00124                     x(n) = facx * (x(n) - delx)
00125                     y(n) = facy * (y(n) - dely)
00126                 else
00127                     if (c1.eq.'x') then
00128                         call readrtoken(column(i1),x(n),x(n))
00129                         x(n) = facx * (x(n) - delx)
00130                     else if (c1.eq.'y') then
00131                         call readrtoken(column(i1),y(n),y(n))
00132                         y(n) = facy * (y(n) - dely)
00133                     else if (c1.eq.'z') then
00134                         call readrtoken(column(i1),z(n),z(n))
00135                         z(n) = facz * (z(n) - delz)
00136                     else
00137                         return 1
00138                     end if
00139                 end if
00140 c
00141                 if (iprompt.eq.1.and.100*(n/100).eq.n)
00142      &                  write(6,*)n,' lines read...'
00143 c
00144             end if
00145 c
00146 118         if (n.lt.nread) go to 110
00147             n = n + 1
00148 c
00149         end if
00150 c
00151 120     n = n - 1
00152 c
00153         if (info.eq.1) then
00154             call devoff
00155             if (iprompt.eq.1) write(6,125)n
00156 125         format(i6,' points')
00157         end if
00158 c
00159         if (ix.gt.iy.and.n.gt.0) call swap(x,y,n)
00160 c
00161         end

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