Computational routine
eng

##
readf

### File content

          subroutine readf(flag,nevprt,t,xd,x,nx,z,nz,tvec,ntvec,
         &     rpar,nrpar,ipar,nipar,u,nu,y,ny)
    c     Copyright INRIA

    c     Scicos block simulator
    c     write read from a binary or formatted file
          include '../stack.h'
    c     ipar(1) = lfil : file name length
    c     ipar(2) = lfmt : format length (0) if binary file
    c     ipar(3) = ievt  : 1 if each data have a an associated time
    c     ipar(4) = N : buffer length
    c     ipar(5:4+lfil) = character codes for file name
    c     ipar(5+lfil:4+lfil+lfmt) = character codes for format if any
    c     ipar(5+lfil+lfmt:5+lfil+lfmt+ny+ievt) = reading mask

    c
          double precision t,xd(*),x(*),z(*),tvec(*),rpar(*),u(*),y(*)
          integer flag,nevprt,nx,nz,ntvec,nrpar,ipar(*)
          integer nipar,nu,ny

    c
    c
          integer n
          integer mode(2)
    c
          if(flag.eq.1) then
    c     discrete state
             n=ipar(4)
             k=int(z(1))
             ievt=ipar(3)
             kmax=int(z(2))
             lunit=int(z(3))
             if(k+1.gt.kmax.and.kmax.eq.n) then
    c     output
                call dcopy(ny,z(3+n*ievt+k),n,y,1)
    c     .     read a new buffer
                no=(nz-3)/N
                call bfrdr(lunit,ipar,z(4),no,kmax,ierr)
                if(ierr.ne.0) goto 110
                z(1)=1.0d0
                z(2)=kmax
             elseif(k.lt.kmax) then
    c     output
                call dcopy(ny,z(3+n*ievt+k),n,y,1)
                z(1)=z(1)+1.0d0
             elseif(k+1.gt.kmax) then
                call dcopy(ny,z(3+n*ievt+kmax),n,y,1)
             endif
    c
          elseif(flag.eq.3) then
             n=ipar(4)
             k=int(z(1))
             kmax=int(z(2))
             if(k.gt.kmax.and.kmax.lt.n) then
                tvec(1)=t-1.0d0
             else
                tvec(1)=z(3+k)
             endif
          elseif(flag.eq.4) then
    c     file opening
             lfil=ipar(1)
             ievt=ipar(3)
             N=ipar(4)
             call cvstr(lfil,ipar(5),buf,1)
             lfmt=ipar(2)
             lunit=0
             if(lfmt.gt.0) then
                mode(1)=001
                mode(2)=0
                call clunit(lunit,buf(1:lfil),mode)
                if(err.gt.0) goto 100
             else
                mode(1)=101
                mode(2)=0
                call clunit(lunit,buf(1:lfil),mode)
                if(err.gt.0) goto 100
             endif
             z(3)=lunit
    c     buffer initialisation
             no=(nz-3)/N
             call bfrdr(lunit,ipar,z(4),no,kmax,ierr)
             if(ierr.ne.0) goto 110
             z(1)=1.0d0
             z(2)=kmax
          elseif(flag.eq.5) then
             lfil=ipar(1)
             N=ipar(4)
             K=int(z(1))
             lunit=int(z(3))
             if(lunit.eq.0) then
                return
             endif
             call clunit(-lunit,buf(1:lfil),mode)
             if(err.gt.0) goto 100
             z(3)=0.0d0
          endif
          return
     100  continue
          err=0
          lfil=ipar(1)
          call basout(io,wte,'File '//buf(1:lfil)//' Cannot be opened')
          flag=-1
          return
     110  continue
          lfil=ipar(1)
          call cvstr(lfil,ipar(5),buf,1)
          call clunit(-lunit,buf(1:lfil),mode)
          call basout(io,wte,'Read error on file '//buf(1:lfil))
          flag=-1
          return
          end

          subroutine bfrdr(lunit,ipar,z,no,kmax,ierr)
    c     buffered and masked read
          include '../stack.h'
          integer lunit,ipar(*),ierr
          double precision z(*)
          double precision tmp(100)
    c
          ievt=ipar(3)
          N=ipar(4)
    c      no=(nz-3)/N
    c     maximum number of value to read
          imask=5+ipar(1)+ipar(2)
          if(ievt.eq.0) imask=imask+1
          mm=0
          do 10 i=0,no-1
             mm=max(mm,ipar(imask+i))
     10   continue
    c
          lfmt=ipar(2)
          kmax=0
          if(lfmt.eq.0) then
    c     unformatted read
             do 12 i=1,N
                read(lunit,err=100,end=20) (tmp(j),j=1,mm)
                do 11 j=0,no-1
                   z(j*N+i)=tmp(ipar(imask+j))
     11         continue
                kmax=kmax+1
     12      continue
          else
    c     formatted read
             call cvstr(ipar(2),ipar(5+ipar(1)),buf,1)
             do 14 i=1,N
                read(lunit,buf(1:lfmt),err=100,end=20) (tmp(j),j=1,mm)
                do 13 j=0,no-1
                   z(j*N+i)=tmp(ipar(imask+j))
     13         continue
                kmax=kmax+1
     14      continue
          endif
     20   continue
          ierr=0
          return
     100  ierr=1
          return
          end