Computational routine
eng
readau
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "../machine.h"
extern int C2F(cvstr) __PARAMS((integer *,integer *,char *,integer *,unsigned long int));
extern void sciprint __PARAMS((char *fmt,...));
extern void mget2 __PARAMS((FILE *fa, integer swap, double *res, integer n, char *type, integer *ierr));
void
readau(flag,nevprt,t,xd,x,nx,z,nz,tvec,ntvec,rpar,nrpar,
ipar,nipar,inptr,insz,nin,outptr,outsz,nout)
/*
ipar[1] = lfil : file name length
ipar[2:4] = fmt : numbers type ascii code
ipar[5] = void
ipar[6] = n : buffer length in number of records
ipar[7] = maxvoie : record size
ipar[8] = swap
ipar[9] = first : first record to read
ipar[10:9+lfil] = character codes for file name
*/
integer *flag,*nevprt,*nx,*nz,*ntvec,*nrpar,ipar[],*nipar;
integer insz[],*nin,outsz[],*nout;
double x[],xd[],z[],tvec[],rpar[];
double *inptr[],*outptr[],*t;
{
char str[100],type[4];
int job = 1,three=3;
FILE *fd;
int n, k, kmax, /*no, lfil,*/ m, i, irep,/* nm,*/ ierr;
double *buffer,*record;
long offset;
double y;
/* div_t divt;*/int quot, rem;
double SCALE=0.000030517578125;
/* int ETAB[8]={0, 132, 396, 924, 1980, 4092, 8316, 16764}; */
int ETAB[8];
int mu;
int sig;
int e;
int f;
/* double ff;*/
ETAB[0]=0; ETAB[1]=132; ETAB[2]= 396; ETAB[3]=924; ETAB[4]=1980;
ETAB[5]=4092; ETAB[6]=8316; ETAB[7]=16764;
--ipar;
--z;
fd=(FILE *)(long)z[3];
buffer = (z+4);
/*
k : record counter within the buffer
kmax : number of records in the buffer
*/
if (*flag==1) {
n = ipar[6];
k = (int)z[1];
/* copy current record to output */
record=buffer+(k-1)*ipar[7];
for (i=0;i<*nout;i++)
{
mu=(int) record[i];
mu=255-mu;
if(mu>127)
sig=1;
else
sig=0;
/* comment out for SUNOS SS 8/10/99
divt=div(mu,16);
e=divt.quot-8*sig+1;
f=divt.rem;
*/
quot=mu/16;rem=mu-16*quot;
e=quot-8*sig+1;
f=rem;
y=ldexp((double)(f),(e+2));
/* ff=(double)(e+2);
y=((double) f) * pow(two, ff); */
e=ETAB[e-1];
y=SCALE*(1-2*sig)*(e+y);
*outptr[i]=y;
}
if (*nevprt>0) {
/* discrete state */
kmax =(int) z[2];
if (k>=kmax&&kmax==n) {
/* read a new buffer */
m=ipar[6]*ipar[7];
F2C(cvstr)(&three,&(ipar[2]),type,&job,(unsigned long)strlen(type));
for (i=2;i>=0;i--)
if (type[i]!=' ') { type[i+1]='\0';break;}
ierr=0;
mget2(fd,ipar[8],buffer,m,type,&ierr);
if (ierr>0) {
sciprint("Read error!\n");
fclose(fd);
z[3] = 0.0;
*flag = -1;
return;
}
else if (ierr<0) { /* EOF reached */
kmax=-(ierr+1)/ipar[7];
}
else
kmax=ipar[6];
z[1] = 1.0;
z[2] = kmax;
}
else if (k<kmax)
z[1] = z[1]+1.0;
}
}
else if (*flag==4) {
F2C(cvstr)(&(ipar[1]),&(ipar[10]),str,&job,(unsigned long)strlen(str));
str[ipar[1]] = '\0';
fd = fopen(str,"rb");
if (!fd ) {
sciprint("Could not open the file!\n");
*flag = -1;
return;
}
z[3]=(long)fd;
/* skip first records */
if (ipar[9]>1) {
F2C(cvstr)(&three,&(ipar[2]),type,&job,(unsigned long)strlen(type));
for (i=2;i>=0;i--)
if (type[i]!=' ') { type[i+1]='\0';break;}
offset=(ipar[9]-1)*ipar[7]*sizeof(char);
irep = fseek(fd,offset,0) ;
if ( irep != 0 )
{
sciprint("Read error\r\n");
*flag = -1;
fclose(fd);
z[3] = 0.0;
return;
}
}
/* read first buffer */
m=ipar[6]*ipar[7];
F2C(cvstr)(&three,&(ipar[2]),type,&job,(unsigned long)strlen(type));
for (i=2;i>=0;i--)
if (type[i]!=' ') { type[i+1]='\0';break;}
mget2(fd,ipar[8],buffer,m,type,&ierr);
if (ierr>0) {
sciprint("Read error!\n");
*flag = -1;
fclose(fd);
z[3] = 0.0;
return;
}
else if (ierr<0) { /* EOF reached */
kmax=-(ierr+1)/ipar[7];
}
else
kmax=ipar[6];
z[1] = 1.0;
z[2] = kmax;
}
else if (*flag==5) {
if(z[3]==0) return;
fclose(fd);
z[3] = 0.0;
}
return;
}