/************* wave.c: Basic Waveguide Code *****************/ int _stklen=100000; #include #include /* #include */ #include #include #define PREMUL 32768 /* Fixed exponent */ #define MAXN 8192 /* Max # nodes */ #ifndef PI #define PI 3.1415926535 #endif int notcl = 0, nosound = 0; /* to prevent (time expensive) output */ int e[MAXN], v[MAXN]; /* displacement and velocity arrays */ int u1 =1024, u2 =1024; /* combined values of (c/m)*PREMUL*dt */ int n; /* number of nodes */ int steps; /* number of (full wave) iter. steps */ int fd; /* file descriptor for sound file */ int binoutnode; /* node to output in sound file */ FILE *fp; int el[MAXN], ew[512], flag; /* * this example uses DPMI to initialize Mode 13h video mode and * draws three lines on the screen in different colors */ #include #include #define PIXEL(x,y) (videobase + (x) + (y) *320) /* this will point to the text area of video memory */ char * videobase; void GetVidBase(void) { ULONG base; SELECTOR temp; /* get the data segment selector */ asm mov [temp],ds /* now get its base address */ dpmi_get_sel_base(&base,temp); /* video base is address zero + 0xa0000 for VGA graphics area */ videobase = (char *)(-base + 0xa0000); /* notice we do NOT change the DS selector limit. Our segments have max * possible length so you can wrap around. */ } void ModeSet(int mode) { DPMI_REGS regs; regs.b.ah = 0x0; regs.b.al = mode; regs.h.flags = 0x72; regs.h.ss = 0; regs.h.sp = 0; dpmi_simulate_real_interrupt(0x10,®s); } init(n) int n; { int i; double fl, h; for (i=0; i 0) { t = e[i]/PREMUL; cp = (char *) &t; /* write(fd,cp,1); write(fd,cp+1,1); */ } return 0; } int propagate(n) /* Compute new velocity and */ int n; /* displacements once for all nodes. */ { /* (more optimization possible here) */ register int i; for (i=0; i 1.0) { fl=sqrt(sqrt(fl)); flag=1; /* printf("******"); */ } else flag = 0; fl =fl * (80*PREMUL ); fl = fl * 1.0; it = (int) fl; e[n-4] = it; /* e[1] *= 9; e[1] /= 10; e[n-2] *= 9; e[n-2] /= 10; */ return 0; } void output(t,n) int t,n; { int i; outputtcl(n); return; printf("t=%3d|",t); for (i=0; i 0) close(fd); */ return; } init_vid() { int i; /* get a base pointer to video mem */ GetVidBase(); /* 320x200x16 graphics mode */ ModeSet(0x13); for (i=0; i< MAXN; i++) el[i]=0; for (i=0; i< 256; i++) ew[i]=0; /* for (i=0; i< 8*256; i++) *(videobase+i*128)=(i); for (i=0; i< 8*256; i++) *(videobase+1024+i+16)=1<<((i/8) % 8); for (i=0; i< 32; i++) *(videobase+18000-4096+i/2+300)=(1<<(i%8)); key_wait(); exit(0); */ } key_wait() { /* wait for a key to be hit */ while (!kbhit()); getch(); /* text mode */ ModeSet(3); } void process_args(argc,argv) int argc; char *argv[]; { int i; if ((argc < 3) || ( ((argc-3)%2) != 0 )) { printf("Usage %s <#nodes> <#steps> [