main.c0000644000175000017500000010700311636447633012052 0ustar dumzdejdumzdej#include "main.h" #include "aniparse.h" #include "adj2.h" #include "storage.h" #include "load_eqn.h" #include "ggets.h" #include "many_pops.h" #include "read_dir.h" #include "comline.h" #include "simplenet.h" #include "dae_fun.h" #include "auto_x11.h" #include "auto_nox.h" #include "extra.h" #include "menudrive.h" #include "init_conds.h" #include "graphics.h" #include "integrate.h" #include "numerics.h" #include "form_ode.h" #include "pop_list.h" #include "arrayplot.h" #include "menu.h" #include "userbut.h" #include "color.h" #include "eig_list.h" #include "txtread.h" #include "edit_rhs.h" #include "axes2.h" #include "do_fit.h" #include "graf_par.h" #include "auto_x11.h" #include "nullcline.h" #include "lunch-new.h" #include "calc.h" #include /* Copyright (C) 2002-2011 Bard Ermentrout & Daniel Dougherty This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. The author can be contacted at bard@pitt.edu */ #include #include #include #include #include /* #include */ #include #include "pp.bitmap" #include /* #include */ #include "help_defs.h" #include "browse.h" #include "struct.h" #include #define FIX_SIZE 3 #define FIX_MIN_SIZE 2 #define FIX_MAX_SIZE 1 #define lowbit(x) ((x) & (~(x) + 1)) #define TOPBUTTONCOLOR 27 #include #define BITMAPDEPTH 1 #define TOO_SMALL 0 #define BIG_ENOUGH 1 #include "myfonts.h" #define cstringmaj MYSTR1 #define cstringmin MYSTR2 #ifdef NOERRNO int errno; #endif int allwinvis=0; int use_intern_sets=1; int use_ani_file=0; char anifile[256]; extern int ani_grab_flag; float xppvermaj,xppvermin; extern char this_file[100]; extern int METHOD,storind; extern int (*rhs)(); extern XFontStruct *symfonts[5],*romfonts[5]; extern int avsymfonts[5],avromfonts[5]; extern int RunImmediately; int Xup,TipsFlag=1; Atom deleteWindowAtom=0; int XPPBatch=0,batch_range=0; char batchout[256]; char UserOUTFILE[256]; int my_rhs(); int DisplayHeight,DisplayWidth; int TrueColorFlag; char big_font_name[100],small_font_name[100]; int PaperWhite=-1; extern int DF_FLAG; char mycommand[100]; Window TopButton[6]; Window init_win(); Window make_fancy_window(); /* Window win; */ Window draw_win; Window make_input_strip(); Window main_win; Window command_pop,info_pop; GC gc, gc_graph,small_gc, font_gc; extern int help_menu,current_pop; unsigned int Black,White; char UserBlack[8]; char UserWhite[8]; char UserMainWinColor[8]; char UserDrawWinColor[8]; char UserBGBitmap[100]; int UserGradients=-1; int UserMinWidth=0,UserMinHeight=0; unsigned int MyBackColor,MyForeColor,MyMainWinColor,MyDrawWinColor; unsigned int GrFore,GrBack; int SCALEX,SCALEY; extern int COLOR; Display *display; int screen; extern int periodic; int DCURYb,DCURXb,CURY_OFFb; int DCURYs,DCURXs,CURY_OFFs; int DCURY,DCURX,CURY_OFF; FILE *logfile; int XPPVERBOSE=1; int OVERRIDE_QUIET=0; int OVERRIDE_LOGFILE=0; extern BROWSER my_browser; int tfBell; OptionsSet notAlreadySet; XFontStruct *big_font,*small_font; int popped=0; void do_main(argc,argv) char **argv; int argc; { /* Moved to init_X() */ /* char *icon_name="xpp"; */ char myfile[256]; /* char *win_name; */ char pptitle[80]; /*Track which options have not been set already*/ notAlreadySet.BIG_FONT_NAME=1; notAlreadySet.SMALL_FONT_NAME=1; notAlreadySet.BACKGROUND=1; notAlreadySet.IXPLT=1; notAlreadySet.IYPLT=1; notAlreadySet.IZPLT=1; notAlreadySet.AXES=1; notAlreadySet.NMESH=1; notAlreadySet.METHOD=1; notAlreadySet.TIMEPLOT=1; notAlreadySet.MAXSTOR=1; notAlreadySet.TEND=1; notAlreadySet.DT=1; notAlreadySet.T0=1; notAlreadySet.TRANS=1; notAlreadySet.BOUND=1; notAlreadySet.TOLER=1; notAlreadySet.DELAY=1; notAlreadySet.XLO=1; notAlreadySet.XHI=1; notAlreadySet.YLO=1; notAlreadySet.YHI=1; notAlreadySet.UserBlack=1; notAlreadySet.UserWhite=1; notAlreadySet.UserMainWinColor=1; notAlreadySet.UserDrawWinColor=1; notAlreadySet.UserGradients=1; notAlreadySet.UserBGBitmap=1; notAlreadySet.UserMinWidth=1; notAlreadySet.UserMinHeight=1; notAlreadySet.YNullColor=1; notAlreadySet.XNullColor=1; notAlreadySet.StableManifoldColor=1; notAlreadySet.UnstableManifoldColor=1; notAlreadySet.START_LINE_TYPE=1; notAlreadySet.RandSeed=1; notAlreadySet.PaperWhite=1; notAlreadySet.COLORMAP=1; notAlreadySet.NPLOT=1; notAlreadySet.DLL_LIB=1; notAlreadySet.DLL_FUN=1; notAlreadySet.XP=1; notAlreadySet.YP=1; notAlreadySet.ZP=1; notAlreadySet.NOUT=1; notAlreadySet.VMAXPTS=1; notAlreadySet.TOR_PER=1; notAlreadySet.JAC_EPS=1; notAlreadySet.NEWT_TOL=1; notAlreadySet.NEWT_ITER=1; notAlreadySet.FOLD=1; notAlreadySet.DTMIN=1; notAlreadySet.DTMAX=1; notAlreadySet.ATOL=1; notAlreadySet.TOL=1; notAlreadySet.BANDUP=1; notAlreadySet.BANDLO=1; notAlreadySet.PHI=1; notAlreadySet.THETA=1; notAlreadySet.XMIN=1; notAlreadySet.XMAX=1; notAlreadySet.YMIN=1; notAlreadySet.YMAX=1; notAlreadySet.ZMIN=1; notAlreadySet.ZMAX=1; notAlreadySet.POIVAR=1; notAlreadySet.OUTPUT=1; notAlreadySet.POISGN=1; notAlreadySet.POISTOP=1; notAlreadySet.STOCH=1; notAlreadySet.POIPLN=1; notAlreadySet.POIMAP=1; notAlreadySet.RANGEOVER=1; notAlreadySet.RANGESTEP=1; notAlreadySet.RANGELOW=1; notAlreadySet.RANGEHIGH=1; notAlreadySet.RANGERESET=1; notAlreadySet.RANGEOLDIC=1; notAlreadySet.RANGE=1; notAlreadySet.NTST=1; notAlreadySet.NMAX=1; notAlreadySet.NPR=1; notAlreadySet.NCOL=1; notAlreadySet.DSMIN=1; notAlreadySet.DSMAX=1; notAlreadySet.DS=1; notAlreadySet.PARMAX=1; notAlreadySet.NORMMIN=1; notAlreadySet.NORMMAX=1; notAlreadySet.EPSL=1; notAlreadySet.EPSU=1; notAlreadySet.EPSS=1; notAlreadySet.RUNNOW=1; notAlreadySet.SEC=1; notAlreadySet.UEC=1; notAlreadySet.SPC=1; notAlreadySet.UPC=1; notAlreadySet.AUTOEVAL=1; notAlreadySet.AUTOXMAX=1; notAlreadySet.AUTOYMAX=1; notAlreadySet.AUTOXMIN=1; notAlreadySet.AUTOYMIN=1; notAlreadySet.AUTOVAR=1; notAlreadySet.PS_FONT=1; notAlreadySet.PS_LW=1; notAlreadySet.PS_FSIZE=1; notAlreadySet.PS_COLOR=1; notAlreadySet.FOREVER=1; notAlreadySet.BVP_TOL=1; notAlreadySet.BVP_EPS=1; notAlreadySet.BVP_MAXIT=1; notAlreadySet.BVP_FLAG=1; notAlreadySet.SOS=1; notAlreadySet.FFT=1; notAlreadySet.HIST=1; notAlreadySet.PSFlag=1; notAlreadySet.ATOLER=1; notAlreadySet.MaxEulIter=1; notAlreadySet.EulTol=1; notAlreadySet.EVEC_ITER=1; notAlreadySet.EVEC_ERR=1; notAlreadySet.NULL_ERR=1; notAlreadySet.NEWT_ERR=1; notAlreadySet.NULL_HERE=1; unsigned int min_wid=450,min_hgt=360; /* unsigned int x=0,y=0; */ /* sprintf(myfile,"lecar.ode"); */ get_directory(myfile); SCALEX=640; SCALEY=480; Xup=0; sprintf(batchout,"output.dat"); /*Read visualization environement variables here since some may be overridden by command line */ logfile=stdout; check_for_quiet(argc, argv); /*do_vis_env();*/ /* Old code did it this way... do_vis_env(); do_comline(argc, argv); if(!XPPBatch) { init_X(); } load_eqn(); */ do_comline(argc, argv); /*We need to init_X here if there is no file on command line so that a file browser can be opened. */ if(!XPPBatch) { /*Swap out the current options for a temporary place holder */ OptionsSet *tempNS = (OptionsSet*)malloc(sizeof(OptionsSet)); *tempNS = notAlreadySet; /*Initialize what's needed to open a browser based on the current options. */ do_vis_env(); set_all_vals(); init_X(); /* XSynchronize(display,1); */ /* Now swap back the options for proper precedence ordering of options. */ notAlreadySet = *tempNS; free(tempNS); } load_eqn(); OptionsSet *tempNS = (OptionsSet*)malloc(sizeof(OptionsSet)); *tempNS = notAlreadySet; set_internopts(tempNS); free(tempNS); init_alloc_info(); do_vis_env(); set_all_vals(); if(!XPPBatch) { init_X(); } init_alloc_info(); set_init_guess(); update_all_ffts(); #ifdef AUTO init_auto_win(); #endif /* if(make_kernels()==0){ plintf("Illegal kernel -- aborting \n"); exit(0); } */ if(disc(this_file))METHOD=0; xppvermaj=(float)cstringmaj; xppvermin=(float)cstringmin; if(strlen(this_file)<60) sprintf(pptitle,"XPP Ver %g.%g >> %s",xppvermaj,xppvermin,this_file); else sprintf(pptitle,"XPP Version %g.%g",xppvermaj,xppvermin); /* win_name=pptitle; */ do_meth(); set_delay(); rhs=my_rhs; init_fit_info(); strip_saveqn(); create_plot_list(); auto_load_dll(); if(XPPBatch){ init_browser(); init_all_graph(); if_needed_load_set(); if_needed_load_par(); if_needed_load_ic(); if_needed_select_sets(); batch_integrate(); exit(0); } gtitle_text(pptitle, main_win); Xup=1; /* Moved to init_X() main_win=init_win(4,icon_name,win_name, x,y,min_wid,min_hgt,argc,argv); win=main_win; FixWindowSize(main_win,SCALEX,SCALEY,FIX_MIN_SIZE); periodic=1; if(DefaultDepth(display,screen)>=8)COLOR=1; else COLOR=0; // if(DefaultDepth(display,screen)==4){ // map16(); // COLOR=1; // } XSelectInput(display,win,ExposureMask|KeyPressMask|ButtonPressMask| StructureNotifyMask|ButtonReleaseMask|ButtonMotionMask); load_fonts(); DCURXb=XTextWidth(big_font,"W",1); DCURYb=big_font->ascent+big_font->descent; CURY_OFFb=big_font->ascent+1; DCURXs=XTextWidth(small_font,"W",1); DCURYs=small_font->ascent+small_font->descent; CURY_OFFs=small_font->ascent+1; Black=BlackPixel(display,screen); White=WhitePixel(display,screen); // Switch for reversed video MyForeColor=GrFore=Black; MyBackColor=GrBack=White; // This is reversed //MyForeColor=White; //MyBackColor=Black; if(PaperWhite==0){ GrFore=White; GrBack=Black; } getGC(&gc); getGC(&gc_graph); getGC(&small_gc); getGC(&font_gc); if(COLOR)MakeColormap(); set_big_font(); // set_small_font(); XSetFont(display,small_gc,small_font->fid); // file_selector("Test",myfile,"*.ode"); end move to init_X() */ XMapWindow(display,main_win); make_pops(); make_top_buttons(); initialize_box(); init_browser(); if(allwinvis==1){ make_new_ic_box(); make_new_bc_box(); make_new_delay_box(); make_new_param_box(); make_new_browser(); create_eq_list(); } /* create_eq_list(); */ /* make_my_aplot("z"); */ Xup=1; ani_zero(); make_scrbox_lists(); /* This is for testing widgets --- */ /* MAIN LOOP */ test_color_info(); if_needed_load_set(); if_needed_load_par(); if_needed_load_ic(); if(use_ani_file) { new_vcr(); get_ani_file(anifile); } do_events(min_wid,min_hgt); } void check_for_quiet(argc,argv) char **argv; int argc; { /*First scan, check for any QUIET option set...*/ int i = 0; /*Allow for multiple calls to the QUIET and LOGFILE options on the command line. The last setting is the one that will stick. Settings of logfile and quiet in the xpprc file will be ignored if they are set on the command line. */ int quiet_specified_once=0; int logfile_specified_once=0; for(i=1;i 0) { min_wid = UserMinWidth; SCALEX = min_wid; } if (UserMinHeight> 0) { min_hgt = UserMinHeight; SCALEY = min_hgt; } if (PaperWhite == 0) { GrFore = White; GrBack = Black; } main_win = init_win (4, icon_name, win_name, x, y, min_wid, min_hgt, 0, NULL); /*Set up foreground and background colors*/ Black = BlackPixel (display, screen); White = WhitePixel (display, screen); if (strlen(UserBlack) != 0) { XColor user_col; XParseColor(display, DefaultColormap(display,screen), UserBlack, &user_col); XAllocColor(display, DefaultColormap(display,screen), &user_col); MyForeColor = GrFore = user_col.pixel; Black = MyForeColor; } if (strlen(UserWhite) != 0) { XColor user_col; XParseColor(display, DefaultColormap(display,screen), UserWhite, &user_col); XAllocColor(display, DefaultColormap(display,screen), &user_col); MyBackColor = GrBack = user_col.pixel; White = MyBackColor; } /* Switch for reversed video */ MyForeColor = GrFore = Black; MyBackColor = GrBack = White; /* This is reversed MyForeColor=White; MyBackColor=Black; */ if (PaperWhite == 1)/*Respect the swapping implied by the -white option.*/ { char swapcol[8]; strcpy(swapcol,UserWhite); strcpy(UserWhite,UserBlack); strcpy(UserBlack,swapcol); MyForeColor = GrFore = White; MyBackColor = GrBack = Black; } if (strlen(UserMainWinColor) != 0) { XColor main_win_col; XParseColor(display, DefaultColormap(display,screen), UserMainWinColor, &main_win_col); XAllocColor(display, DefaultColormap(display,screen), &main_win_col); MyMainWinColor = main_win_col.pixel; } else { MyMainWinColor = MyBackColor; } XSetWindowBorder(display,main_win,MyForeColor); XSetWindowBackground(display,main_win,MyMainWinColor); if (strlen(UserDrawWinColor) != 0) { XColor draw_win_col; XParseColor(display, DefaultColormap(display,screen), UserDrawWinColor, &draw_win_col); XAllocColor(display, DefaultColormap(display,screen), &draw_win_col); MyDrawWinColor = draw_win_col.pixel; } else { MyDrawWinColor = MyBackColor; } /* win = main_win; */ FixWindowSize (main_win, SCALEX, SCALEY, FIX_MIN_SIZE); periodic = 1; if (DefaultDepth (display, screen) >= 8) { COLOR = 1; } else { COLOR = 0; } /* if(DefaultDepth(display,screen)==4){ map16(); COLOR=1; } */ XSelectInput (display, main_win, ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask | ButtonReleaseMask | ButtonMotionMask); load_fonts(); /*BETTER SUPPORT FOR VARIABLE WIDTH FONTS Use a statistical average to get average spacing. Some fonts don't or are not able to report this accurately so this is reliable way to get the information. If person only has variable width font on their system they can get by. The average spacing will be too small for some short strings having capital letters (for example "GO"). Thus, we divide by the string length of our test string minus 2 for a little more wiggle room. */ /* DCURXb = XTextWidth (big_font, "#", 1); */ DCURXb = XTextWidth(big_font,teststr,strlen(teststr))/(strlen(teststr)-2); DCURYb = big_font->ascent + big_font->descent; CURY_OFFb = big_font->ascent - 1; /* DCURXs = XTextWidth (small_font, "#", 1); */ DCURXs = XTextWidth (small_font,teststr,strlen(teststr))/(strlen(teststr)-2); DCURYs = small_font->ascent + small_font->descent; CURY_OFFs = small_font->ascent - 1; getGC (&gc); getGC (&gc_graph); getGC (&small_gc); getGC (&font_gc); if (strlen(UserBGBitmap) != 0) /*User supplied */ { /*Pixmap pmap=XCreatePixmapFromBitmapData(display,main_win,lines_bits,lines_width,lines_height,MyForeColor,MyBackColor,DefaultDepth(display, DefaultScreen(display))); */ unsigned int width_return,height_return; int x_hot,y_hot; unsigned char* pixdata; int success = XReadBitmapFileData(UserBGBitmap,&width_return, &height_return,&pixdata,&x_hot,&y_hot); if (success != BitmapSuccess) { if (success == BitmapOpenFailed) { plintf("Problem reading bitmap file %s -> BitmapOpenFailed\n",UserBGBitmap); } else if (success == BitmapFileInvalid) { plintf("Problem reading bitmap file %s -> BitmapFileInvalid\n",UserBGBitmap); } else if (success == BitmapNoMemory) { plintf("Problem reading bitmap file %s -> BitmapNoMemory\n",UserBGBitmap); } } else { Pixmap pmap=XCreatePixmapFromBitmapData(display,main_win,(char *)pixdata,width_return,height_return,MyForeColor,MyMainWinColor,DefaultDepth(display, DefaultScreen(display))); XSetWindowBackgroundPixmap(display,main_win,pmap); XFreePixmap(display,pmap); XFree(pixdata); } } if (COLOR) MakeColormap (); set_big_font (); /* set_small_font(); */ XSetFont (display, small_gc, small_font->fid); /*make_pops();*/ /* If the user didn't specify specifically heights and widths we try to set the initial size to fit everything nicely especially if they are using wacky fonts... */ if (UserMinWidth <= 0) { SCALEX = 10+36*2*DCURXs + 32*DCURXs; } if (UserMinHeight <= 0) { SCALEY = 27*DCURYb+4*DCURYs; } XResizeWindow(display,main_win,SCALEX,SCALEY); /*FixWindowSize (main_win, SCALEX, SCALEY, FIX_MIN_SIZE); */ } void set_big_font() { DCURX=DCURXb; DCURY=DCURYb; CURY_OFF=CURY_OFFb; XSetFont(display,gc,big_font->fid); } void set_small_font() { DCURX=DCURXs; DCURY=DCURYs; CURY_OFF=CURY_OFFs; XSetFont(display,gc,small_font->fid); } void xpp_events(XEvent report,int min_wid,int min_hgt) { /*int window_size,com; */ int com; char ch; int used=0; /* put_command("Command:"); */ do_array_plot_events(report); txt_view_events(report); do_ani_events(report); top_button_events(report); switch(report.type){ /* case ClientMessage: if(report.xclient.data.l[0]==deleteWindowAtom){ break; } break; */ case Expose: case MapNotify: if(report.xany.window==command_pop)put_command("Command:"); do_expose(report); break; case ConfigureNotify: resize_par_box(report.xany.window); resize_my_browser(report.xany.window); resize_eq_list(report.xany.window); resize_auto_window(report); if(report.xconfigure.window==main_win){ SCALEX=report.xconfigure.width; SCALEY=report.xconfigure.height; if((SCALEXfid); XUnloadFont(display,small_font->fid); for(i=0;i<5;i++){ if(avsymfonts[i])XUnloadFont(display,symfonts[i]->fid); if(avromfonts[i])XUnloadFont(display,romfonts[i]->fid); } XFreeGC(display,gc); XCloseDisplay(display); exit(1); } void clr_scrn() { blank_screen(draw_win); restore_off(); do_axes(); } void redraw_all() { redraw_dfield(); restore(0,my_browser.maxrow); draw_label(draw_win); draw_freeze(draw_win); restore_on(); } void commander(ch) char ch; { switch(help_menu) { case MAIN_HELP: { switch(ch) { case 'i':flash(0); /* initial data */ ini_data_menu(); flash(0); break; case 'c':flash(1); /* continue */ cont_integ(); flash(1); break; case 'n':flash(2); /*nullclines */ /* test_color_info(); */ new_clines(); flash(2); break; case 'd':flash(3); /*dir fields */ direct_field(); flash(3); break; case 'w':flash(4); /* window */ window_zoom(); flash(4); break; case 'a':flash(5); /*phase-space */ do_torus(); flash(5); break; case 'k':flash(6); /*kinescope */ do_movie(); flash(6); break; case 'g' :flash(7); flash(7); add_a_curve(); break; case 'u':flash(8); flash(8); help_num(); break; case 'f':flash(9); /* files */ flash(9); help_file(); break; case 'p':flash(10); /*parameters */ /* change_par(-1); */ new_param(); flash(10); break; case 'e':flash(11); /*erase */ clear_screens(); flash(11); break; case 'h': case 'm': do_windows(); /*half windows */ flash(12); break; case 't':flash(13); /*text */ do_gr_objs(); flash(13); break; case 's':flash(14); /*sing pts */ find_equilibrium(); flash(14); break; case 'v':flash(15); /*view_axes */ change_view(); flash(15); break; case 'b': find_bvp(); break; case 'x':flash(16); /*x vs t */ x_vs_t(); flash(16); break; case 'r':flash(17); /*restore*/ redraw_them_all(); flash(17); break; case '3': get_3d_par(); break; case 'y': /* test_test(); */ break; } /* End main switch */ } /* MAIN HELP ENDS */ break; case NUM_HELP:{ get_num_par(ch); } /* end num case */ break; case FILE_HELP: { switch(ch){ case 't': do_transpose(); break; case 'g': get_intern_set(); break; case 'i': TipsFlag=1-TipsFlag; break; case 'p': flash(0); /* file stuff */ /* do_info(stdout); */ make_txtview(); flash(0); break; case 'w': flash(1); /* write set */ do_lunch(0); flash(1); break; case 's': flash(2); /* make eqn */ file_inf(); flash(2); break; case 'a': flash(3); /* AUTO !! */ #ifdef AUTO do_auto_win(); #endif flash(3); break; case 'c': flash(4); /* calculator */ q_calc(); flash(4); break; case 'r': flash(5); /* read set */ do_lunch(1); flash(5); break; case 'e': flash(6); /* script */ edit_menu(); /* Insert generic code here ... */ flash(6); break; case 'b': tfBell=1-tfBell; break; case 'h': /* c_hints(); */ xpp_hlp(); /* make_key_stroke(); */ break; case 'q': flash(7); if(yes_no_box())bye_bye(); /* if(are_you_sure())bye_bye(); */ /* quit */ flash(7); break; /* CLONE ! */ case 'l': clone_ode(); break; case 'x': edit_xpprc(); break; } /* end file switch */ help(); } /* end file case */ break; } /* end help_menu switch */ /* redraw_menu(); */ } /* Window make_unmapped_window(root,x,y,width,height,bw) Window root; int x,y,width,height,bw; { Window win; win=XCreateSimpleWindow(display,root,x,y,width,height, bw,MyForeColor,MyBackColor); XSelectInput(display,win,ExposureMask|KeyPressMask|ButtonPressMask| StructureNotifyMask|ButtonReleaseMask|ButtonMotionMask); return(win); } */ Window init_win(bw,icon_name,win_name, x,y,min_wid,min_hgt,argc,argv) int argc; int x,y; char **argv; unsigned int min_wid,min_hgt,bw; char *icon_name,*win_name; { /* XSetWindowAttributes xswa; XWindowAttributes xwa; */ Window wine; int count; unsigned dp_h,dp_w; Pixmap icon_map; XIconSize *size_list; XSizeHints size_hints; char *display_name=NULL; if((display=XOpenDisplay(display_name))==NULL){ plintf(" Failed to open X-Display \n"); exit(-1); } /* Remove after debugging is done */ /* XSynchronize(display,1); */ screen=DefaultScreen(display); if (!deleteWindowAtom) { deleteWindowAtom = XInternAtom(display,"WM_DELETE_WINDOW", 0); } dp_w=DisplayWidth(display,screen); dp_h=DisplayHeight(display,screen); DisplayWidth=dp_w; DisplayHeight=dp_h; if(SCALEX>dp_w)SCALEX=dp_w; if(SCALEY>dp_h)SCALEY=dp_h; wine=XCreateSimpleWindow(display,RootWindow(display,screen), x,y,SCALEX,SCALEY,bw,MyForeColor, MyBackColor); /* xswa.override_redirect=1; XChangeWindowAttributes(display,wine,CWOverrideRedirect,&xswa); */ XGetIconSizes(display,RootWindow(display,screen),&size_list,&count); icon_map=XCreateBitmapFromData(display,wine, (char*)pp_bits,pp_width,pp_height); #ifdef X11R3 size_hints.flags=PPosition|PSize|PMinsize; size_hints.x=x; size_hints.y=y; size_hints.width=width; size_hints.height=height; size_hints.min_width=min_wid; size_hints.min_height=min_hgt; #else size_hints.flags=PPosition|PSize|PMinSize; size_hints.min_width=min_wid; size_hints.min_height=min_hgt; #endif #ifdef X11R3 XSetStandardProperties(display,wine,win_name, icon_name,icon_map,argv, argc,&size_hints); #else { XWMHints wm_hints; XClassHint class_hints; XTextProperty winname,iconname; if(XStringListToTextProperty(&icon_name,1,&iconname)==0) { plintf("X error: failure for iconname\n"); exit(-1); } if(XStringListToTextProperty(&win_name,1,&winname)==0) { plintf("X error: failure for winname\n"); exit(-1); } wm_hints.initial_state=NormalState; wm_hints.input=True; wm_hints.icon_pixmap=icon_map; wm_hints.flags=StateHint|IconPixmapHint|InputHint; class_hints.res_name="base"; class_hints.res_class=win_name; XSetWMProperties(display,wine,&winname,&iconname,argv,argc,&size_hints,&wm_hints,&class_hints); XSetWMProtocols(display, wine, &deleteWindowAtom, 1); } #endif return(wine); } void top_button_draw(Window w) { if(w==TopButton[0]) XDrawString(display,w,small_gc,5,CURY_OFFs,"ICs ",5); if(w==TopButton[1]) XDrawString(display,w,small_gc,5,CURY_OFFs,"BCs ",5); if(w==TopButton[2]) XDrawString(display,w,small_gc,5,CURY_OFFs,"Delay",5); if(w==TopButton[3]) XDrawString(display,w,small_gc,5,CURY_OFFs,"Param",5); if(w==TopButton[4]) XDrawString(display,w,small_gc,5,CURY_OFFs,"Eqns ",5); if(w==TopButton[5]) XDrawString(display,w,small_gc,5,CURY_OFFs,"Data ",5); } void top_button_cross(Window w,int b) { int i; for(i=0;i<6;i++) if(w==TopButton[i]){ XSetWindowBorderWidth(display,w,b); return; } } void top_button_press(Window w) { if(w==TopButton[0]){ make_new_ic_box(); } if(w==TopButton[1]){ make_new_bc_box(); } if(w==TopButton[2]){ make_new_delay_box(); } if(w==TopButton[3]){ make_new_param_box(); } if(w==TopButton[4]){ create_eq_list(); } if(w==TopButton[5]){ make_new_browser(); } } void top_button_events(XEvent report) { switch(report.type){ case Expose: case MapNotify: top_button_draw(report.xany.window); break; case EnterNotify: top_button_cross(report.xcrossing.window,2); break; case LeaveNotify: top_button_cross(report.xcrossing.window,1); break; case ButtonPress: top_button_press(report.xbutton.window); break; } user_button_events(report); } void make_top_buttons() { int x1=2,x2=6*DCURXs+5,dx=DCURXs; TopButton[0]=make_fancy_window(main_win,x1,1,x2,DCURYs,1,ColorMap(20),ColorMap(TOPBUTTONCOLOR)); x1=x1+x2+dx; TopButton[1]=make_fancy_window(main_win,x1,1,x2,DCURYs,1,ColorMap(20),ColorMap(TOPBUTTONCOLOR)); x1=x1+x2+dx; TopButton[2]=make_fancy_window(main_win,x1,1,x2,DCURYs,1,ColorMap(20),ColorMap(TOPBUTTONCOLOR)); x1=x1+x2+dx; TopButton[3]=make_fancy_window(main_win,x1,1,x2,DCURYs,1,ColorMap(20),ColorMap(TOPBUTTONCOLOR)); x1=x1+x2+dx; TopButton[4]=make_fancy_window(main_win,x1,1,x2,DCURYs,1,ColorMap(20),ColorMap(TOPBUTTONCOLOR)); x1=x1+x2+dx; TopButton[5]=make_fancy_window(main_win,x1,1,x2,DCURYs,1,ColorMap(20),ColorMap(TOPBUTTONCOLOR)); x1=x1+x2+dx; create_user_buttons(x1,1,main_win); } void getGC(gc) GC *gc; { unsigned int valuemask=0; XGCValues values; /* unsigned int lw=6; int ls=LineOnOffDash; int cs=CapRound; int js=JoinRound; int dash_off=0; static char dash[]={12,24}; int ll=2; */ *gc=XCreateGC(display,main_win,valuemask,&values); XSetForeground(display,*gc,MyForeColor); /* XSetLineAttributes(display,*gc,lw,ls,cs,js); XSetDashes(display,*gc,dash_off,dash,ll); */ } void load_fonts() { int i; /*printf("\n\nFONTS %s %s \n",big_font_name,small_font_name); */ if((big_font=XLoadQueryFont(display,big_font_name))==NULL) { plintf("X Error: Failed to load big font: %s\n",big_font_name); exit(-1); } if((small_font=XLoadQueryFont(display,small_font_name))==NULL) { plintf("X Error: Failed to load small font: %s\n",small_font_name); exit(-1); } for(i=0;i<5;i++){ if((symfonts[i]=XLoadQueryFont(display,symbolfonts[i]))==NULL){ if(i==0||i==1) symfonts[i]=small_font; else symfonts[i]=big_font; avsymfonts[i]=1; } else{ avsymfonts[i]=1; plintf(" sym %d loaded ..",i); } if((romfonts[i]=XLoadQueryFont(display,timesfonts[i]))==NULL){ if(i==0||i==1) romfonts[i]=small_font; else romfonts[i]=big_font; avromfonts[i]=1; } else{ avromfonts[i]=1; plintf( " times %d loaded ..",i); } } plintf("\n"); } void make_pops() { int x,y; unsigned int h,w,bw,d; Window wn; /*Cursor cursor;*/ XGetGeometry(display,main_win,&wn,&x,&y,&w,&h,&bw,&d); /* menu_pop=XCreateSimpleWindow(display,main_win, 0,DCURY+6,16*DCURX,22*DCURY,2,MyForeColor, MyBackColor); */ create_the_menus(main_win); command_pop=XCreateSimpleWindow(display,main_win,0,DCURYs+4,w-2,DCURY+4,2, MyForeColor, MyBackColor); info_pop=XCreateSimpleWindow(display,main_win,0,h-DCURY-4,w-2,DCURY,2, MyForeColor, MyBackColor); /*cursor=XCreateFontCursor(display,XC_hand2);*/ XCreateFontCursor(display,XC_hand2); /* XDefineCursor(display,menu_pop,cursor); */ /* XSelectInput(display,menu_pop,KeyPressMask|ButtonPressMask|ExposureMask); */ XSelectInput(display,command_pop,KeyPressMask|ButtonPressMask|ExposureMask); XSelectInput(display,info_pop,ExposureMask); XMapWindow(display,info_pop); XMapWindow(display,command_pop); /* XMapWindow(display,menu_pop); */ init_grafs(16*DCURX+6,DCURYs+DCURYb+6,w-16-16*DCURX,h-6*DCURY-16); create_par_sliders(main_win,0,h-5*DCURY+8); get_draw_area(); } void FixWindowSize(w,width,height,flag) Window w; int width,height,flag; { XSizeHints size_hints; switch(flag){ case FIX_SIZE: size_hints.flags=PSize|PMinSize|PMaxSize; size_hints.width=width; size_hints.min_width=width; size_hints.max_width=width; size_hints.height=height; size_hints.min_height=height; size_hints.max_height=height; break; case FIX_MIN_SIZE: size_hints.flags=PMinSize; size_hints.min_width=width; size_hints.min_height=height; break; case FIX_MAX_SIZE: size_hints.flags=PMaxSize; size_hints.max_width=width; size_hints.max_height=height; break; } XSetWMProperties(display,w,NULL,NULL,NULL,0,&size_hints,NULL,NULL); } int getxcolors(win_info, colors) XWindowAttributes *win_info; XColor **colors; { int i, ncolors; *colors = (XColor *) NULL; TrueColorFlag=0; if (win_info->visual->class == TrueColor) { TrueColorFlag=1; plintf("TrueColor visual: no colormap needed\n"); return 0; } else if (!win_info->colormap) { plintf("no colormap associated with window\n"); return 0; } ncolors = win_info->visual->map_entries; plintf("%d entries in colormap\n", ncolors); *colors = (XColor *) malloc (sizeof(XColor) * ncolors); if (win_info->visual->class == DirectColor) { int red, green, blue, red1, green1, blue1; plintf("DirectColor visual\n"); red = green = blue = 0; red1 = lowbit(win_info->visual->red_mask); green1 = lowbit(win_info->visual->green_mask); blue1 = lowbit(win_info->visual->blue_mask); for (i=0; i win_info->visual->red_mask) red = 0; green += green1; if (green > win_info->visual->green_mask) green = 0; blue += blue1; if (blue > win_info->visual->blue_mask) blue = 0; } } else { for (i=0; icolormap, *colors, ncolors); return(ncolors); } void test_color_info() { XColor *colors; XWindowAttributes xwa; /*int n; */ TrueColorFlag=0; XGetWindowAttributes(display,main_win, &xwa); /*n=getxcolors(&xwa,&colors); */ getxcolors(&xwa,&colors); if (colors) free((char *) colors); } /* this is stuff for ndrand48(), nsrand48() uncomment if you dont have it RAND_MAX is either 2^16-1 or 2^32-1 it is usually in stdlib.h #ifdef NORAND48 double ndrand48() { return (double)rand()/(double)RAND_MAX; } nsrand48(seed) int seed; { srand(seed); } #endif */ ggets.c0000644000175000017500000003003311633745276012236 0ustar dumzdejdumzdej#include "ggets.h" #include #include #include #include #include #include #include #include #include #include "struct.h" #include "newhome.h" #include "mykeydef.h" #include #include "graphics.h" #include "axes2.h" #include "many_pops.h" #include "menudrive.h" #include "pop_list.h" #include "calc.h" #define ESCAPE 27 char *info_message; extern int XPPBatch; /* do_calc(); new_float(); new_int(); */ double atof(); extern int SCALEX,SCALEY; int MSStyle=0; extern int Xup; extern int tfBell; int done=0; extern Display *display; extern int screen; int CURS_X,CURS_Y; extern int DCURY,DCURX,CURY_OFF; extern Window win,command_pop,info_pop,draw_win,main_win; extern GC gc,gc_graph; extern unsigned int MyBackColor,MyForeColor; int xor_flag; extern FILE *logfile; extern int XPPVERBOSE; void ping() { if(tfBell&&!XPPBatch) { /* XkbBell allows window managers to react to bell events using possibly user-specified accessiblity options (e.g. visual bell) */ XkbBell(display,command_pop,100,(Atom)NULL); } /* Call to XBell seems to be ignored by many window managers where XkbBell is not. if(tfBell&&!XPPBatch) XBell(display,100); */ } void reset_graphics() { blank_screen(draw_win); do_axes(); hi_lite(draw_win); } void blank_screen(w) Window w; { CURS_X=0; CURS_Y=0; xor_flag=0; XClearWindow(display,w); } void set_fore() { XSetForeground(display,gc,MyForeColor); } void set_back() { XSetForeground(display,gc,MyBackColor); } void showchar(ch,col,row,or) int col,row; Window or; char ch; { char bob[2]; bob[0]=ch; chk_xor(); XDrawString(display,or,gc,col,row+CURY_OFF,bob,1); } void chk_xor() { if(xor_flag==1) XSetFunction(display,gc,GXxor); else XSetFunction(display,gc,GXcopy); } void set_gcurs( y, x) int y,x; { CURS_X=x; CURS_Y=y; } void clr_command() { blank_screen(command_pop); } void draw_info_pop(win) Window win; { if(win==info_pop) { XClearWindow(display,info_pop); BaseCol(); XDrawString(display,info_pop,gc,5,CURY_OFF,info_message, strlen(info_message)); } } void bottom_msg(line,msg) int line; char *msg; { XClearWindow(display,info_pop); BaseCol(); strcpy(info_message,msg); XDrawString(display,info_pop,gc,5,CURY_OFF,msg,strlen(msg)); } /* clr_menbar() { blank_screen(menu_pop); } */ void gputs(string,win) char *string; Window win; { int xloc=CURS_X*DCURX,yloc=CURS_Y*DCURY; Ftext( xloc, yloc, string,win ); CURS_X+=strlen(string); } void err_msg(string) char *string; { if(Xup) respond_box("OK",string); else {plintf("%s\n",string);} } int plintf(char *fmt,...) { int nchar=0; va_list arglist; if (!XPPVERBOSE) return(nchar);/*Don't print at all!*/ if (logfile == NULL) { printf("The log file is NULL!\n"); logfile = stdout; } va_start(arglist,fmt); nchar=vfprintf(logfile,fmt,arglist); va_end(arglist); /*Makes sense to flush to the output file to prevent loss of log info if program crashes. Then maybe user can figure out what happened and when.*/ fflush(logfile); return(nchar); } int show_position(ev,com) XEvent ev; int *com; { /*int i,j; Window w; */ /*w=ev.xbutton.window;*/ /* XSetInputFocus(display,w,RevertToParent,CurrentTime); */ /*i=ev.xbutton.x; j=ev.xbutton.y; */ /* if(w==menu_pop) { *com=(j-DCURY-2)/DCURY; return(1); } */ check_draw_button(ev); return(0); } void gpos_prn(string,row,col) int row,col; char *string; { clr_command(); Ftext(0,row*DCURY,string,command_pop); CURS_X=strlen(string); } void put_command(string) char *string; { clr_command(); Ftext(0,0,string,command_pop); CURS_X=strlen(string); } int get_key_press(ev) XEvent *ev; { int maxlen=64; char buf[65]; XComposeStatus comp; KeySym ks; XLookupString((XKeyEvent *)ev,buf,maxlen,&ks,&comp); /*printf(" ks=%d buf[0]=%d char=%c \n",ks,(int)buf[0],buf[0]); */ /* plintf("h=%d e=%d ks=%d \n",XK_Home,XK_End,ks); */ if(ks==XK_Escape)return(ESC); if((ks==XK_Return)||(ks==XK_KP_Enter)|| (ks==XK_Linefeed))return(FINE); else if (((ks>=XK_KP_Space)&&(ks<=XK_KP_9)) || ((ks>=XK_space)&&(ks<=XK_asciitilde))) return((int)buf[0]); /* else if ((ks>=XK_Shift_L)&&(ks<=XK_Hyper_R)) return(0); else if ((ks>=XK_F1)&&(ks<=XK_F35)) return(0); */ else if (ks==XK_BackSpace) return(BKSP); else if (ks==XK_Delete) return(DEL); else if (ks==XK_Tab) return(TAB); else if (ks==XK_Home)return(HOME); else if (ks==XK_End)return(END); else if (ks==XK_Left)return(LEFT); else if (ks==XK_Right)return(RIGHT); else if (ks==XK_Up)return(UP); else if (ks==XK_Down)return(DOWN); else if (ks==XK_PgUp)return(PGUP); else if (ks==XK_PgDn)return(PGDN); else { return(BADKEY); } } void cput_text() { char string[256],new[256]; int x,y,size=2,font=0; Window temp; temp=main_win; strcpy(string,""); if(new_string("Text: ",string)==0)return; if(string[0]=='%'){ fillintext(&string[1],new); strcpy(string,new); } /* this makes it permanent */ new_int("Size 0-4 :",&size); /* new_int("Font 0-times/1-symbol :",&font); */ if(size>4)size=4; if(size<0)size=0; message_box(&temp,0,SCALEY-5*DCURY,"Place text with mouse"); if(GetMouseXY(&x,&y)){ GrCol(); /* fancy_put_text_x11(x,y,string,size,font); */ fillintext(string,new); special_put_text_x11(x,y,new,size); add_label(string,x,y,size,font); BaseCol(); } XDestroyWindow(display,temp); } /* are_you_sure() { char ch; gpos_prn("Are you sure? (Y/N)",0,0); ping(); ch = (char)getchi(); if(ch=='y'||ch=='Y')return(1); return(0); } */ int get_mouse_xy(x,y,w) Window w; int *x,*y; { int no_but=1; char ch; XEvent ev; *x=0; *y=0; while(no_but) { XNextEvent(display,&ev); switch(ev.type) { case Expose: do_expose(ev); break; case KeyPress: ch=get_key_press(&ev); if(ch==ESCAPE) return 0; if(ch==FINE)return -2; if(ch==TAB)return -3; break; case ButtonPress: if(ev.xbutton.window!=w)return(0); no_but=0; *x=ev.xbutton.x; *y=ev.xbutton.y; return(1); } } return(0); } void Ftext(x,y,string,o) int x,y; Window o; char *string; { chk_xor(); XDrawString(display,o,gc,x,y+CURY_OFF,string,strlen(string)); } void bar(x,y,x2,y2,w) int x,y,x2,y2; Window w; { XFillRectangle(display,w,gc,x,y,x2-x,y2-y); } void rectangle(x,y,x2,y2,w) int x,y,x2,y2; Window w; { XDrawRectangle(display,w,gc,x,y,x2-x,y2-y); } /* getuch() { int ch; ch=getchi(); if(ch>64&&ch<96)ch+=32; return(ch); } */ void setfillstyle(type,color) int type,color; { if(type>-1)XSetFillStyle(display,gc,FillSolid); if(color>0)XSetForeground(display,gc,MyForeColor); else XSetForeground(display,gc,MyBackColor); } void circle( x,y,radius,w) int x,y,radius; Window w; { XDrawArc(display,w,gc,x-radius,y-radius,2*radius,2*radius,0,360*64); } void xline(x0,y0,x1,y1,w) int x0,y0,x1,y1; Window w; { XDrawLine(display,w,gc_graph, x0,y0,x1,y1); } int new_float(name,value) char *name; double *value; { int done; int flag; double newz; char tvalue[200]; sprintf(tvalue,"%.16g",*value); done=new_string(name,tvalue); if(done==0||strlen(tvalue)==0)return -1; if(tvalue[0]=='%') { flag=do_calc(&tvalue[1],&newz); if(flag!=-1)*value=newz; return(0); } *value=atof(tvalue); return(0); } /* do_calc(s,v) char *s; double *v; { return(1); } */ int new_int(name,value) char *name; int *value; { char svalue[200]; sprintf(svalue,"%d",*value); if(new_string(name,svalue)==0||strlen(svalue)==0)return(-1); *value=atoi(svalue); return(0); } void display_command(name,value,pos,col) char *name,*value; int pos,col; { int l=strlen(name); int m=strlen(value); set_fore(); bar(0,0,l*DCURX,DCURY+4,command_pop); set_back(); XDrawString(display,command_pop,gc,0,CURY_OFF,name,l); set_fore(); if(m>0){ XDrawString(display,command_pop,gc,l*DCURX,CURY_OFF,value,m); /* showchar('_',DCURX*(l+m),0,command_pop); */ put_cursor_at(command_pop,DCURX*l,pos); } } void clr_line_at(w,col0,pos,n) Window w; int col0,pos,n; { XClearArea(display,w,col0+pos*DCURX,0,(n+2)*DCURX,2*DCURY,False); } void put_cursor_at(w,col0,pos) Window w; int pos,col0; { int x1=col0+pos*DCURX; int x2=x1+1; int y1=DCURY-2,y2=2; /* XDrawString(display,w,gc,col0+pos*DCURX-1,DCURY,"^",1);*/ XDrawLine(display,w,gc,x1,y1,x1,y2); XDrawLine(display,w,gc,x2,y1,x2,y2); } void put_string_at(w,col,s,off) Window w; char *s; int off,col; { int l=strlen(s)-off; XDrawString(display,w,gc,col,CURY_OFF,s+off,l); } void movmem(s1,s2,len) char *s1,*s2; int len; { int i; for(i=len-1;i>=0;i--) s1[i]=s2[i]; } void memmov(s1,s2,len) char *s1,*s2; int len; { int i; for(i=0;i0){ *pos=*pos-1; *col-=DCURX;} else ping(); break; case RIGHT: if(*pos0){ memmov(&value[*pos-1],&value[*pos],strlen(value)-*pos+1); *pos=*pos-1; *col-=DCURX; } else ping(); break; case TAB: if(MSStyle==0) *done=2; else *done=1; return; default: if( (ch>=' ') && (ch <= '~')){ movmem(&value[*pos+1],&value[*pos],strlen(value)-*pos+1); value[*pos]=ch; *pos=*pos+1; *col+=DCURX; } break; } /* end key cases */ /* Now redraw everything !! */ clr_line_at(w,col0,0,strlen(value)); put_string_at(w,col0,value,0); put_cursor_at(w,col0,*pos); /* plintf(" on ret %d %d %d %s %d\n",*pos,*col,ch,value,col0);*/ XFlush(display); } void do_backspace(pos,value,col,w) int *pos,*col; char *value; Window w; { char oldch; *pos=*pos-1; oldch=value[*pos]; value[*pos]='\0'; if(*col<(SCALEX-DCURX)) set_back(); showchar('_',*col,0,w); *col=*col-DCURX; showchar(oldch,*col,0,w); set_fore(); showchar('_',*col,0,w); } void edit_command_string(ev,name,value,done,pos,col) XEvent ev; char *name,*value; int *done,*pos,*col; { char ch; switch(ev.type){ case ConfigureNotify: case Expose: case MapNotify: do_expose(ev); if(ev.xexpose.window==command_pop) display_command(name,value,*pos,0); break; case ButtonPress: if(ev.xbutton.window==command_pop) XSetInputFocus(display,command_pop, RevertToParent,CurrentTime); break; case KeyPress: ch=get_key_press(&ev); edit_window(command_pop,pos,value,col,done,ch); } /* end event cases */ } int new_string(name,value) char *name; char *value; { char old_value[80]; int done=0; int pos=strlen(value); int col=(pos+strlen(name))*DCURX; XEvent ev; strcpy(old_value,value); clr_command(); display_command(name,value,pos,0); while(done==0){ XNextEvent(display,&ev); edit_command_string(ev,name,value,&done,&pos,&col); } clr_command(); if(done==1||done==2)return(done); strcpy(value,old_value); return(0); } menu.c0000644000175000017500000001030111633745700012055 0ustar dumzdejdumzdej#include "menus.h" #include "menu.h" #include "main.h" #include #include #include #include #include #include #include #include #include "ggets.h" #include "many_pops.h" #include "pop_list.h" int help_menu; MENUDEF my_menus[3]; extern Display *display; extern int tfBell,TipsFlag; extern int DCURY,DCURX,CURY_OFF,DCURYs,DCURYb; extern GC gc; Window make_unmapped_window(); void flash(num) int num; { } void add_menu(base,j,n,names,key,hint) Window base; char **names,*key,**hint; int j,n; { Window w; int i; Cursor cursor; cursor=XCreateFontCursor(display,XC_hand2); w=make_plain_unmapped_window(base,0,DCURYs+DCURYb+10,16*DCURX,21*(DCURY+2)-3,1); my_menus[j].base=w; XDefineCursor(display,w,cursor); my_menus[j].names=names; my_menus[j].n=n; my_menus[j].hints=hint; strcpy(my_menus[j].key,key); my_menus[j].title=make_unmapped_window(w,0,0,16*DCURX,DCURY,1); for(i=0;i #include #include #include #include #include #define RUBBOX 0 #define RUBLINE 1 #include "rubber.h" #include "ggets.h" #include "many_pops.h" extern Window draw_win; extern Display *display; extern int screen; extern int xor_flag,xorfix; extern GC gc,gc_graph; extern unsigned int MyBackColor,MyForeColor,MyMainWinColor,MyDrawWinColor,GrFore,GrBack; int rubber(x1,y1,x2,y2,w,f) int *x1,*y1,*x2,*y2,f; Window w; { XEvent ev; int there=0; int error=0; int dragx=0,dragy=0; int oldx=0,oldy=0; int state=0; xor_flag=1; XFlush(display); chk_xor(); if(xorfix) { XSetForeground(display,gc,MyDrawWinColor); XSetBackground(display,gc,MyForeColor); /*XSetForeground(display,gc,GrFore);*/ } XSelectInput(display,w, KeyPressMask|ButtonPressMask|ButtonReleaseMask| PointerMotionMask|ButtonMotionMask|ExposureMask); while(!there) { XNextEvent(display,&ev); switch(ev.type){ case Expose: do_expose(ev); xor_flag=1; chk_xor(); if(xorfix) { XSetForeground(display,gc,MyDrawWinColor); XSetBackground(display,gc,MyForeColor); /*XSetForeground(display,gc,GrFore);*/ } break; case KeyPress: if(state>0)break; /* too late Bozo */ there=1; error=1; break; case ButtonPress: if(state>0)break; state=1; dragx=ev.xkey.x; dragy=ev.xkey.y; oldx=dragx; oldy=dragy; rbox(dragx,dragy,oldx,oldy,w,f); break; case MotionNotify: if(state==0)break; rbox(dragx,dragy,oldx,oldy,w,f); oldx=ev.xmotion.x; oldy=ev.xmotion.y; rbox(dragx,dragy,oldx,oldy,w,f); break; case ButtonRelease: if(state==0)break; there=1; rbox(dragx,dragy,oldx,oldy,w,f); break; } } xor_flag=0; chk_xor(); if(xorfix) { /*XSetForeground(display,gc,GrBack); */ XSetForeground(display,gc,MyForeColor); XSetBackground(display,gc,MyDrawWinColor); } if(!error){ *x1=dragx; *y1=dragy; *x2=oldx; *y2=oldy; } XSelectInput(display,w,KeyPressMask|ButtonPressMask|ExposureMask| ButtonReleaseMask|ButtonMotionMask); if(error)return(0); return(1); } void rbox(i1,j1,i2,j2,w,f) int i1,j1,i2,j2,f; Window w; { int x1=i1,x2=i2,y1=j1,y2=j2; if(f==RUBLINE){ XDrawLine(display,w,gc,i1,j1,i2,j2); return; } if(x1>x2){x2=i1;x1=i2;} if(y1>y2){y1=j2;y2=j1;} rectangle(x1,y1,x2,y2,w); } derived.c0000644000175000017500000000354511610403677012546 0ustar dumzdejdumzdej#include "derived.h" #include #include #include #include "ggets.h" #include "parserslow.h" #include "calc.h" /* Derived parameter stuff !! */ #define MAXDERIVED 200 extern double constants[]; extern int NCON; double evaluate(); typedef struct { int index,*form; char *rhs; double value; } DERIVED; DERIVED derived[MAXDERIVED]; int nderived=0; /* clean up derived stuff */ void free_derived() { int i; for(i=0;i=MAXDERIVED){ plintf(" Too many derived constants! \n"); return(1); } i0=nderived; derived[i0].rhs=(char *)malloc(n); /* save the right hand side */ strcpy(derived[i0].rhs,rhs); /* this is the constant to which it addresses */ derived[i0].index=NCON; /* add the name to the recognized symbols */ plintf(" derived constant[%d] is %s = %s\n",NCON,name,rhs); nderived++; return(add_con(name,0.0)); } init_condold.c0000644000175000017500000006143111610403677013567 0ustar dumzdejdumzdej#include /* This makes a big box with windows that have the names of the variables and their current initial data It works with the main program by interfacing with the command window and getting values. If you click on an IC, the IC is selected to the command window as an editable object */ #include #include #include #include #include #include "xpplim.h" #include "ic.bitmap" #include "param.bitmap" #include "delay.bitmap" #include "bc.bitmap" #include "shoot.h" #include "mykeydef.h" #define MAX_LEN_SBOX 25 extern Display *display; extern int screen; extern GC gc, small_gc; extern Window main_win; extern int DCURX,DCURXs,DCURY,DCURYs,CURY_OFFs,CURY_OFF; extern int NDELAYS; extern int noicon; #define PARAMBOX 1 #define ICBOX 2 #define DELAYBOX 3 #define BCBOX 4 #define BOXEVENT (ButtonPressMask |\ KeyPressMask |\ ExposureMask |\ StructureNotifyMask |\ LeaveWindowMask |\ EnterWindowMask) #define BOXDONE -2 #define EDIT_NEXT 1 #define EDIT_ESC 2 #define EDIT_DONE 3 extern int NUPAR,NODE,NEQ,NMarkov; extern char upar_names[200][11],uvar_names[MAXODE][12]; extern char delay_string[MAXODE][80]; extern double default_val[200]; extern double last_ic[MAXODE]; typedef struct { int use,type; int n; Window base; Window cancel,ok,def,go; Window *w; Window *we; char **value; int mc,*off,*pos; } BoxList; typedef struct { int use,pos,l; char parname[20]; double lo,hi,val; int hgt; Window left,right,top,main,slide; } PAR_SLIDER; PAR_SLIDER my_par_slide[3]; extern BC_STRUCT my_bc[MAXODE]; Window make_window(); BoxList *HotBox; int HotBoxItem=-1; BoxList ICBox; BoxList ParamBox; BoxList DelayBox; BoxList BCBox; int BoxMode; double atof(); extern char this_file[100]; typedef struct { int pos,n,n0,npos; int ihot,twid; int max; char **v; Window side,up,down,text; } SCROLL_LIST; #define SB_DIM 5 #define SB_SPC 2 /* scroll-list gadget */ create_scroll_list(Window base,int x,int y,int width, int height,SCROLL_LIST *sl) { int tst=(DCURYs+3)+2*(SB_DIM+SB_SPC); if(heightn=0; sl->n0=0; sl->pos=0; sl->v=NULL; sl->twid=width; sl->text=make_window(base,x,y,width,height,1); sl->up=make_window(base,x+width+SB_SPC,y,SB_DIM,SB_DIM,1); sl->side=make_window(base,x+width+SB_SPC,y+SB_DIM+SB_SPC, SB_DIM,height-2*(SB_DIM+SB_SPC),1); sl->down=make_window(base,x+width+SB_SPC,y+height-2*SB_DIM-SB_SPC, SB_DIM,SB_DIM,1); sl->npos=height-2*(SB_DIM+SB_SPC); sl->max=height/(DCURYs+3); } free_scroll_list(SCROLL_LIST *sl) { int n=sl->n; int i; for(i=0;iv[i]); free(sl->v); sl->v=NULL; sl->n=0; } add_scroll_item(char *v,SCROLL_LIST *sl) { int n=sl->n; int m=strlen(v); sl->v=(char **)realloc((void *)sl->v,(n+1)*sizeof(char *)); sl->v[n]=(char *)malloc((m+1)); strcpy(sl->v[n],v); sl->n=n+1; } expose_scroll_list(Window w,SCROLL_LIST sl) { int i; if(w==sl.up){ XClearWindow(display,w); XDrawLine(display,w,small_gc,0,SB_DIM,SB_DIM/2,0); XDrawLine(display,w,small_gc,SB_DIM,SB_DIM,SB_DIM/2,0); return 1; } if(w==sl.down){ XClearWindow(display,w); XDrawLine(display,w,small_gc,0,0,SB_DIM/2,SB_DIM); XDrawLine(display,w,small_gc,SB_DIM,0,SB_DIM/2,SB_DIM); return 1; } if(w==sl.side){ XClearWindow(display,w); for(i=0;i<4;i++) XDrawLine(display,w,small_gc,0,sl.npos+i,SB_DIM,sl.npos+i); return 1; } if(w==sl.text){ redraw_scroll_list(sl); return 1; } } redraw_scroll_list(SCROLL_LIST sl) { int i,n=sl.n,j; int y; if(n==0)return; /* nothing there */ XClearWindow(display,sl.text); for(i=0;i\n\n extern double constants[]; \n"); plintf("main(argc,argv)\n char **argv; \n int argc;\n{\n do_main(argc,argv);\n }\n"); plintf("/* defines for %s */ \n",this_file); for(i=0;itop)return; strcpy(values[0],p->parname); sprintf(values[1],"%.16g",p->val); sprintf(values[2],"%.16g",p->lo); sprintf(values[3],"%.16g",p->hi); status=do_string_box(4,4,1,"Set Sliders",n,values,35); if(status==0)return; if(strlen(values[0])==0){ /* empty string cancels */ p->use=0; return; } status=find_user_name(PARAMBOX,values[0]); if(status==-1){ err_msg("Not a parameter !"); return; } lo=atof(values[2]); hi=atof(values[3]); val=atof(values[1]); if(valhi||hi<=lo){ err_msg(" low <= value <= high "); return; } p->val=val; p->hi=hi; p->lo=lo; strcpy(p->parname,values[0]); set_val(p->parname,val); redraw_params(); p->use=1; set_slide_pos(p); redraw_slide(p); } reset_sliders() { int i,j; double val; PAR_SLIDER *p; for(i=0;i<3;i++){ p=&my_par_slide[i]; if(p->use){ get_val(p->parname,&val); p->val=val; set_slide_pos(p); expose_slider(p->slide,p); expose_slider(p->top,p); } } } redraw_slide(p) PAR_SLIDER *p; { expose_slider(p->slide,p); expose_slider(p->top,p); expose_slider(p->left,p); expose_slider(p->right,p); } set_slide_pos(p) PAR_SLIDER *p; { double pos; int ip; pos=2. + (p->l-4)*(p->val-p->lo)/(p->hi-p->lo); ip=(int)pos; if(ip<2)ip=2; if(ip>(p->l-2))ip=p->l-2; p->pos=ip; } slide_release(w) Window w; { int i; for(i=0;i<3;i++) do_slide_release(w,&my_par_slide[i]); } do_slide_release(w,p) PAR_SLIDER *p; { if(p->use==0)return; if(p->slide==w){ set_val(p->parname,p->val); redraw_params(); } } slider_motion(ev) XEvent ev; { int x,i; Window w; w=ev.xmotion.window; x=ev.xmotion.x; for(i=0;i<3;i++) do_slide_motion(w,x,&my_par_slide[i]); } do_slide_motion(w,x,p) PAR_SLIDER *p; Window w; int x; { if(w==p->slide){ p->pos=x; if(x<2) p->pos=2; if(x>(p->l-2)) p->pos=p->l-2; expose_slider(p->slide,p); if(p->use){ p->val=p->lo+ (p->hi-p->lo)*(double)(p->pos-2)/(double)(p->l-4); expose_slider(p->top,p); } } } enter_slides(w,val) Window w; int val; { int i; for(i=0;i<3;i++) enter_slider(w,&my_par_slide[i],val); } enter_slider(w,p,val) Window w; int val; PAR_SLIDER *p; { if(w==p->top) XSetWindowBorderWidth(display,w,val+1); } expose_slides(w) Window w; { int i; for(i=0;i<3;i++) expose_slider(w,&my_par_slide[i]); } expose_slider(w,p) PAR_SLIDER *p; Window w; { int x,len=12*DCURXs; char top[256]; if(w==p->slide){draw_slider(w,p->pos,p->hgt,p->l);return;} if(p->use){ if(w==p->left){ sprintf(top,"%.16g",p->lo); x=1; XClearWindow(display,w); XDrawString(display,w,small_gc,x,CURY_OFFs,top,strlen(top)); return; } if(w==p->right){ sprintf(top,"%.16g",p->hi); x=1; if(strlen(top)<12) x=len-DCURXs*strlen(top)-1; XClearWindow(display,w); XDrawString(display,w,small_gc,x,CURY_OFFs,top,strlen(top)); return; } if(w==p->top){ sprintf(top,"%s=%.16g",p->parname,p->val); XClearWindow(display,w); XDrawString(display,w,small_gc,2,CURY_OFFs,top,strlen(top)); } } else { if(w==p->top){ sprintf(top,"Parameter?"); x=1; XClearWindow(display,w); XDrawString(display,w,small_gc,x,CURY_OFFs,top,strlen(top)); } } } draw_slider(w,x,hgt,l) int x,hgt,l; Window w; { int x0=x-2,i; if(x0<0)x0=0; if(x0>(l-4))x0=l-4; XClearWindow(display,w); for(i=0;i<4;i++) XDrawLine(display,w,small_gc,x0+i,0,x0+i,hgt); } make_par_slider(base,x,y,width,index) Window base; int x,y,width,index; { int mainhgt=3*(DCURYs+2); int mainwid=32*DCURXs; int xs; Window w; if(mainwid<(width+4))mainwid=width+4; w=make_window(base,x,y,mainwid,mainhgt,1); my_par_slide[index].main=w; xs=(mainwid-width-4)/2; my_par_slide[index].slide=make_window(w,xs,DCURYs+5,width+4,DCURYs-4,1); my_par_slide[index].top=make_window(w,2,2,mainwid-6,DCURYs,1); my_par_slide[index].left=make_window(w,2,2*DCURYs+3,12*DCURXs,DCURYs,0); my_par_slide[index].right=make_window(w,mainwid-12*DCURXs-4,2*DCURYs+3, 12*DCURXs,DCURYs,0); my_par_slide[index].lo=0.0; my_par_slide[index].hi=1.0; my_par_slide[index].val=0.5; my_par_slide[index].use=0; my_par_slide[index].l=width+4; my_par_slide[index].pos=(width+4)/2; my_par_slide[index].parname[0]=0; my_par_slide[index].hgt=DCURYs-4; } /* The rest of the code is good | V */ initialize_box() { make_box_list(&ICBox,"Initial Data","ICs",NODE+NMarkov,ICBOX,1); if(NUPAR>0) make_box_list(&ParamBox,"Parameters","Par",NUPAR,PARAMBOX,1); else ParamBox.use=0; if(NDELAYS>0) make_box_list(&DelayBox,"Delay ICs","Delay", NODE,DELAYBOX,1); else DelayBox.use=0; make_box_list(&BCBox,"Boundary Conds","BCs",NODE,BCBOX,1); make_icon(ic_bits,ic_width,ic_height,ICBox.base); if(ParamBox.use) make_icon(param_bits,param_width,param_height,ParamBox.base); if(DelayBox.use) make_icon(delay_bits,delay_width,delay_height,DelayBox.base); make_icon(bc_bits,bc_width,bc_height,BCBox.base); /* Iconify them !! */ if(noicon==0){ XIconifyWindow(display,ICBox.base,screen); if(DelayBox.use) XIconifyWindow(display,DelayBox.base,screen); if(ParamBox.use) XIconifyWindow(display,ParamBox.base,screen); XIconifyWindow(display,BCBox.base,screen); } } make_box_list(b,wname,iname,n,type,use) BoxList *b; char *wname,*iname; int n,type,use; { int nrow,ncol; int x,y; int xb1,xb2,xb3,xb4; int i1,i2,i,wid1,wid2; int width,height,wid,hgt; int widmin; char sss[256]; double dtemp,z; Window base,w; XTextProperty winname,iconame; XSizeHints size_hints; /* This attempts to make a nicer box size... */ dtemp=(double)n; dtemp=sqrt(dtemp); /* approximate square */ i1=(int)dtemp; /* truncate the value */ if(i1>6)i1=6; /* maximum columns */ i2=n/i1; if(i2*i1use=use; b->mc=9; b->type=type; b->n=n; b->value=(char **)malloc(n*sizeof(char*)); b->pos=(int *)malloc(n*sizeof(int)); b->off=(int *)malloc(n*sizeof(int)); for(i=0;ivalue[i]=(char *)malloc(256); switch(type){ case PARAMBOX: get_val(upar_names[i],&z); sprintf(sss,"%.16g",z); set_edit_params(b,i,sss); break; case ICBOX: sprintf(sss,"%.16g",last_ic[i]); set_edit_params(b,i,sss); break; case BCBOX: set_edit_params(b,i,my_bc[i].string); break; case DELAYBOX: set_edit_params(b,i,delay_string[i]); break; } } base=make_plain_window(RootWindow(display,screen),0,0,width,height,4); b->base=base; XStringListToTextProperty(&wname,1,&winname); XStringListToTextProperty(&iname,1,&iconame); size_hints.flags=PPosition|PSize|PMinSize|PMaxSize; size_hints.x=0; size_hints.y=0; size_hints.width=width; size_hints.height=height; size_hints.min_width=width; size_hints.min_height=height; size_hints.max_width=width; size_hints.max_height=height; XSetWMProperties(display,base,&winname,&iconame,NULL,0,&size_hints,NULL,NULL); b->w = (Window *)malloc(n*sizeof(Window)); b->we = (Window *)malloc(n*sizeof(Window)); xb1=(width-19*DCURXs)/2; xb2=xb1+4*DCURXs; xb3=xb2+9*DCURXs; xb4=xb3+8*DCURXs; b->ok=make_window(base,xb1,5,2*DCURXs,DCURYs,1); b->def=make_window(base,xb2,5,7*DCURXs,DCURYs,1); b->cancel=make_window(base,xb3,5,6*DCURXs,DCURYs,1); b->go=make_window(base,xb4,5,2*DCURXs,DCURYs,1); for(i=0;iw[i]=make_window(base,x,y,wid1,hgt,0); b->we[i]=make_window(base,x+wid1+2,y,wid2,hgt,1); XSelectInput(display,b->w[i],BOXEVENT); } } /* this is added to take care of making sure exposure of the boxes is easily taken care of */ do_box_expose(w) Window w; { int i; if(ICBox.use)display_box(ICBox,w); if(BCBox.use)display_box(BCBox,w); if(ParamBox.use)display_box(ParamBox,w); if(DelayBox.use)display_box(DelayBox,w); } /* do_box_events(ev,index) int *index; XEvent ev; { if(ICBox.use)box_list_events(ICBox,ev,index); if(BCBox.use)box_list_events(BCBox,ev,index); if(ParamBox.use)box_list_events(ParamBox,ev,index); if(DelayBox.use)box_list_events(DelayBox,ev,index); } */ justify_string(w1,s1) Window w1; char *s1; { int n1=strlen(s1)*DCURXs,nt=10*DCURXs; int i=0; if(n1> case ConfigureNotify: case Expose: case MapNotify: display_box(b,ev.xany.window); break; << */ /* case ButtonPress: do_select(b,ev.xbutton.window,index); break; case EnterNotify: box_enter(b,ev.xcrossing.window,2); break; case LeaveNotify: box_enter(b,ev.xcrossing.window,1); break; } } */ do_box_button(b,w) BoxList *b; Window w; { int i,n=b->n; if(w==b->ok||w==b->go) load_entire_box(b); if(w==b->go) run_now(); if(w==b->def&&b->type==PARAMBOX) set_default_params(); for(i=0;iwe[i]){ XSetInputFocus(display,w,RevertToParent,CurrentTime); check_box_cursor(); HotBoxItem=i; HotBox=b; draw_editable(w,b->value[i],b->off[i],b->pos[i],b->mc); } } } box_buttons(w) Window w; { if(ICBox.use)do_box_button(&ICBox,w); if(BCBox.use)do_box_button(&BCBox,w); if(DelayBox.use)do_box_button(&DelayBox,w); if(ParamBox.use)do_box_button(&ParamBox,w); } box_keypress(ev,used) XEvent ev; int *used; { if(ICBox.use){do_box_key(&ICBox,ev,used);if(*used)return;} if(BCBox.use){do_box_key(&BCBox,ev,used);if(*used)return;} if(DelayBox.use){do_box_key(&DelayBox,ev,used);if(*used)return;} if(ParamBox.use){do_box_key(&ParamBox,ev,used);if(*used)return;} } do_box_key(b,ev,used) int *used; BoxList *b; XEvent ev; { Window w=ev.xkey.window; char ch; Window focus; int rev,n=b->n,i,j,flag; *used=0; for(i=0;iwe[i]==w){ XGetInputFocus(display,&focus,&rev); if(w==focus){ *used=1; ch=get_key_press(&ev); flag=edit_bitem(b,i,ch); if(flag==EDIT_NEXT&&n>1){ j=i+1; if(j==n)j=0; XSetInputFocus(display,b->we[j],RevertToParent,CurrentTime); set_value_from_box(b,i); HotBoxItem=j; draw_editable(b->we[j],b->value[j],b->off[j],b->pos[j],b->mc); if(b->type==PARAMBOX)reset_sliders(); } if(flag==EDIT_DONE){ HotBoxItem=-1; XSetInputFocus(display,main_win,RevertToParent,CurrentTime); load_entire_box(b); } if(flag==EDIT_ESC){ HotBoxItem=-1; XSetInputFocus(display,main_win,RevertToParent,CurrentTime); } } } } } man_ic() { int done,index=0; double z; char name[256],value[256],junk[256]; while(1){ sprintf(name,"%s :",uvar_names[index]); z=last_ic[index]; done=new_float(name,&z); if(done==0){ last_ic[index]=z; sprintf(junk,"%.16g",z); set_edit_params(&ICBox,index,junk); draw_one_box(ICBox,index); index++; if(index>=NODE+NMarkov)return; } if(done==-1)return; } } new_parameter() { int done,index; double z; char name[256],value[256],junk[256]; while(1){ name[0]=0; done=new_string("Parameter:",name); if(strlen(name)==0||done==0)return; if(strncasecmp(name,"DEFAULT",7 )==0) set_default_params(); else { index=find_user_name(PARAMBOX,name); if(index>=0){ get_val(upar_names[index],&z); sprintf(value,"%s :",name); done=new_float(value,&z); if(done==0){ set_val(upar_names[index],z); sprintf(junk,"%.16g",z); set_edit_params(&ParamBox,index,junk); draw_one_box(ParamBox,index); reset_sliders(); } if(done==-1)return; } } } } set_default_params() { int i; char junk[256]; for(i=0;imc)l=mc; XClearWindow(display,win); XDrawString(display,win,small_gc,0,CURY_OFF,string+off,l); XGetInputFocus(display,&focus,&rev); if(focus==win){ cp=DCURXs*(cursor-off); /* must be fixed */ put_edit_cursor(win,cp); } } put_edit_cursor(w,pos) Window w; int pos; { int x1=pos; int x2=x1+1; XDrawLine(display,w,small_gc,x1,1,x1,DCURYs-1); XDrawLine(display,w,small_gc,x2,1,x2,DCURYs-1); } edit_bitem(b,i,ch) int i; BoxList *b; char ch; { Window win=b->we[i]; char *string=b->value[i]; int off=b->off[i]; int pos=b->pos[i]; int mc=b->mc; int l=strlen(string),wpos=pos-off; switch(ch){ case LEFT: if(pos>0){ pos--; wpos--; if(wpos<0){ off=off-4; if(off<0)off=0; wpos=pos-off; } } else ping(); break; case RIGHT: if(posmc){ off=off+4; if(off+mc>l) off=l-mc; wpos=pos-off; } } else ping(); break; case HOME: pos=0; wpos=0; break; case END: pos=l; wpos=mc; break; case BADKEY: case DOWN: case UP: case PGUP: case PGDN: return 0; /* junk key */ case ESC: return EDIT_ESC; case FINE: return EDIT_NEXT; case BKSP: if(pos0){ memmov(&string[pos-1],&string[pos],l-pos+1); pos--; wpos--; if(wpos<0){ off=off-4; if(off<0)off=0; wpos=pos-off; } l--; } else ping(); break; case TAB: return EDIT_DONE; default: if( (ch>=' ') && (ch <= '~')){ if(strlen(string)>=256) ping(); else { movmem(&string[pos+1],&string[pos],l-pos+1); string[pos]=ch; pos=pos+1; wpos++; l++; if(wpos>mc){ off=off+4; if(off+mc>l) off=l-mc; wpos=pos-off; } } } break; } /* all done lets save everything */ off=pos-wpos; b->off[i]=off; b->pos[i]=pos; draw_editable(win,string,off,pos,mc); return 0; } add_edit_float(b,i,z) double z; int i; BoxList *b; { char junk[256]; sprintf(junk,"%.16g",z); add_editval(b,i,junk); } set_edit_params(b,i,string) BoxList *b; int i; char *string; { int l=strlen(string); strcpy(b->value[i],string); b->off[i]=0; if(l>b->mc) b->pos[i]=b->mc; else b->pos[i]=l; } add_editval(b,i,string) BoxList *b; int i; char *string; { set_edit_params(b,i,string); draw_editable(b->we[i],string,b->off[i],b->pos[i],b->mc); } check_box_cursor() { if(HotBoxItem<0)return; draw_editable(HotBox->we[HotBoxItem],HotBox->value[HotBoxItem], HotBox->off[HotBoxItem],HotBox->pos[HotBoxItem], HotBox->mc); HotBoxItem=-1; } prt_focus() { Window focus; int rev; XGetInputFocus(display,&focus,&rev); plintf(" focus=%d\n",focus); } to_float(s,z) char *s; double *z; { int flag; *z=0.0; if(s[0]=='%') { flag=do_calc(&s[1],z); if(flag==-1)return -1; return 0; } *z=atof(s); } set_value_from_box(b,i) BoxList *b; int i; { char *s; double z; s=b->value[i]; switch(b->type){ case ICBOX: if(to_float(s,&z)==-1)return; last_ic[i]=z; add_edit_float(b,i,z); break; case PARAMBOX: if(to_float(s,&z)==-1)return; set_val(upar_names[i],z); add_edit_float(b,i,z); break; case BCBOX: strcpy(my_bc[i].string,s); add_editval(b,i,s); break; case DELAYBOX: strcpy(delay_string[i],s); add_editval(b,i,s); break; } } load_entire_box(b) BoxList *b; { int i,n=b->n; for(i=0;itype==PARAMBOX){ re_evaluate_kernels(); redo_all_fun_tables(); reset_sliders(); } } many_pops.c0000644000175000017500000006440211633745627013141 0ustar dumzdejdumzdej #include "many_pops.h" #include "menudrive.h" #include "pop_list.h" #include "graphics.h" #include #include #include #include #include #include #include "help_defs.h" #include "graph.bitmap" #include "struct.h" #include "browse.h" #include "init_conds.h" #include "main.h" #include "aniparse.h" #include "load_eqn.h" #include "rubber.h" #include "ggets.h" #include "axes2.h" #include "txtread.h" #include "menu.h" #include "color.h" #include "nullcline.h" #include "my_ps.h" #include "graf_par.h" #include "numerics.h" #include "auto_x11.h" #include "integrate.h" #include "arrayplot.h" #include "eig_list.h" #define MAX_LEN_SBOX 25 #define MAXLAB 50 #define MAXGROB 400 #define POINTER 0 #define ARROW 1 #define MARKER 2 /* markers start at 2 there are several of them */ #define WDMARK .001 #define HTMARK .0016 double atof(); typedef struct { float xs,ys,xe,ye; double size; short use; Window w; int type, color; } GROB; typedef struct { int type,color; int number,start,skip; double size; } MARKINFO; MARKINFO markinfo={2,0,1,0,1,1.0}; extern char *info_message; extern BROWSER my_browser; extern Atom deleteWindowAtom; LABEL lb[MAXLAB]; GROB grob[MAXGROB]; GRAPH graph[MAXPOP]; CURVE frz[MAXFRZ]; NCLINE nclines[MAXNCLINE]; GRAPH *MyGraph; extern int help_menu,screen; extern int SCALEY,CURY_OFF,CURY_OFFs,DCURYs,DCURXs,DCURYb; int SimulPlotFlag=0; extern int storind; extern int PSFlag; extern char *text_hint[]; extern char *edit_hint[]; extern char *no_hint[]; extern Display *display; extern Window main_win,draw_win,command_pop,info_pop; int current_pop; extern unsigned int MyBackColor,MyForeColor,MyMainWinColor,MyDrawWinColor,GrFore,GrBack; extern GC gc, gc_graph,small_gc; extern int COLOR,color_min; extern int xor_flag,DCURX,DCURY; int num_pops; int MINI_H=240; int MINI_W=320; int ActiveWinList[MAXPOP]; double signum(); Window make_window(); #define MAX_INTERN_SET 100 typedef struct { char *name; char *does; unsigned int use; } INTERN_SET; #define MAX_TAB 50 typedef struct { double xlo,xhi,dx; double *y,*x; int n,flag,interp,autoeval; int xyvals; /* flag=0 if virgin array, flag=1 if already allocated; flag=2 for function interp=0 for normal interpolation, interp=1 for 'step' interp=2 for cubic spline table and finally, xyvals=1 if both x and y vals are needed (xyvals=0 is faster lookup )*/ char filename[128],name[12]; }TABULAR; extern TABULAR my_table[MAX_TAB]; extern int NTable; extern INTERN_SET intern_set[MAX_INTERN_SET]; extern int Nintern_set; int select_table() { int i,j; Window temp=main_win; char *n[MAX_TAB],key[MAX_TAB],ch; for(i=0;i=NTable){ err_msg("Not a valid table"); return -1; } return j; } void get_intern_set() { char *n[MAX_INTERN_SET],key[MAX_INTERN_SET],ch; int i,j; int count=Nintern_set; Window temp=main_win; if(count==0)return; for(i=0;i=Nintern_set){ err_msg("Not a valid set"); return; } /* plintf(" Got set %d \n",j); */ get_graph(); extract_internset(j); chk_delay(); redraw_params(); redraw_ics(); reset_graph(); } void make_icon(icon,wid,hgt,w) char *icon; Window w; int wid,hgt; { Pixmap icon_map; XWMHints wm_hints; icon_map=XCreateBitmapFromData(display,w,icon,wid,hgt); wm_hints.initial_state=NormalState; wm_hints.input=True; wm_hints.icon_pixmap=icon_map; wm_hints.flags=StateHint|IconPixmapHint|InputHint; XClassHint class_hints; class_hints.res_name=""; class_hints.res_class=""; XSetWMProperties(display,w,NULL,NULL,NULL,0,NULL,&wm_hints,&class_hints); } void title_text(string) char *string; { gtitle_text(string,draw_win); } void gtitle_text(string,win) Window win; char *string; { XTextProperty wname,iname; GrCol(); if(win!=graph[0].w){ XStringListToTextProperty(&string,1,&wname); XStringListToTextProperty(&string,1,&iname); XSetWMProperties(display,win,&wname,&iname,NULL,0,NULL,NULL,NULL); } else { int len=strlen(string); int x,y; unsigned int w,h,bw,de; int xs,ys=2; Window root; XGetGeometry(display,win,&root,&x,&y,&w,&h,&bw,&de); xs=(w-len*DCURX)/2; if(xs<0)xs=0; Ftext(xs,ys,string,win); set_color(0); xline(0,18,w,18,win); } BaseCol(); } void restore_off() { MyGraph->Restore=0; /* MyGraph->Nullrestore=0; */ } void restore_on() { MyGraph->Restore=1; /* MyGraph->Nullrestore=1; */ } void add_label(s,x,y,size,font) char *s; int x,y,size,font; { int i; float xp,yp; scale_to_real(x,y,&xp,&yp); for(i=0;ixhi-MyGraph->xlo)*WDMARK*size; float dy=(MyGraph->yhi-MyGraph->ylo)*HTMARK*size; while(1) { offset=48*type+3*ind; pen=sym_dir[offset]; if(pen==3)break; x2=dx*sym_dir[offset+1]+x1; y2=dy*sym_dir[offset+2]+y1; if(pen==1)line_abs(x1,y1,x2,y2); x1=x2; y1=y2; ind++; } } void draw_grob(i) int i; { float xs=grob[i].xs,ys=grob[i].ys,xe=grob[i].xe,ye=grob[i].ye; set_linestyle(grob[i].color); if(grob[i].type==POINTER) line_abs(xs,ys,xe,ye); if(grob[i].type==ARROW||grob[i].type==POINTER) arrow_head(xs,ys,xe,ye,grob[i].size); if(grob[i].type>=MARKER) draw_marker(xs,ys,grob[i].size,grob[i].type-2); } void arrow_head(xs,ys,xe,ye,size) float xs,ys,xe,ye; double size; { float l=xe-xs,h=ye-ys; float ar=(MyGraph->xhi-MyGraph->xlo)/(MyGraph->yhi-MyGraph->ylo); float x0=xs+size*l,y0=ys+size*h; /* float tot=(float)sqrt((double)(l*l+h*h)); */ float xp=x0+.5*size*h*ar,yp=y0-.5*size*l/ar; float xm=x0-.5*size*h*ar,ym=y0+.5*size*l/ar; line_abs(xs,ys,xp,yp); line_abs(xs,ys,xm,ym); } void destroy_grob(w) Window w; { int i; for(i=0;ixv[0],MyGraph->yv[0],MyGraph->zv[0], markinfo.start+i*markinfo.skip); if(MyGraph->ThreeDFlag==0){ xs=x; ys=y; } else{ threed_proj(x,y,z,&xs,&ys); } add_grob(xs,ys,xe,ye,markinfo.size,markinfo.type,markinfo.color); } redraw_all(); } void add_markers_old() { double size=1; int i; int color=0; int nm=1,nskip=1,nstart=0; float xe=0.0,ye=0.0,xs,ys,x,y,z; int type=MARKER; if(select_marker_type(&type)==0)return; if(new_float("Size: ",&size))return; if(new_int("Color: ",&color))return; if(new_int("Number of markers: ",&nm))return; if(new_int("Starting at: ", &nstart))return; if(new_int("Skip between: ", &nskip))return; for(i=0;ixv[0],MyGraph->yv[0],MyGraph->zv[0], nstart+i*nskip); if(MyGraph->ThreeDFlag==0){ xs=x; ys=y; } else{ threed_proj(x,y,z,&xs,&ys); } add_grob(xs,ys,xe,ye,size,type,color); } redraw_all(); } void add_pntarr(type) int type; { double size=.1; int i1,j1,i2,j2,color=0; float xe,ye,xs,ys; /*Window temp;*/ int flag; /*temp=main_win;*/ if(new_float("Size: ",&size))return; if(new_int("Color: ",&color))return; /* message_box(&temp,0,SCALEY-5*DCURY,"Choose start/end"); */ MessageBox("Choose start/end"); flag=rubber(&i1,&j1,&i2,&j2,draw_win,1); /* XDestroyWindow(display,temp); */ KillMessageBox(); XFlush(display); if(flag){ scale_to_real(i1,j1,&xs,&ys); scale_to_real(i2,j2,&xe,&ye); if(i1==i2&&j1==j2)return; add_grob(xs,ys,xe,ye,size,type,color); redraw_all(); } } void edit_object_com(int com) { char ans,str[80]; int i,j,ilab=-1,flag,type; float x,y; float dist=1e20,dd; MessageBox("Choose Object"); flag=GetMouseXY(&i,&j); KillMessageBox(); XFlush(display); if(flag){ scale_to_real(i,j,&x,&y); /* now search all labels to find the best */ type=0; /* label = 0, arrows, etc =1 */ for(i=0;i=0&&type==0){ switch(com){ case 0: sprintf(str,"Move %s ?", lb[ilab].s); ans=(char)TwoChoice("Yes","No",str,"yn"); if(ans=='y'){ MessageBox("Click on new position"); flag=GetMouseXY(&i,&j); KillMessageBox(); XFlush(display); if(flag){ scale_to_real(i,j,&x,&y); lb[ilab].x=x; lb[ilab].y=y; clr_scrn(); redraw_all(); } } break; case 1 : sprintf(str,"Change %s ?", lb[ilab].s); ans=(char)TwoChoice("Yes","No",str,"yn"); if(ans=='y'){ new_string("Text: ",lb[ilab].s); new_int("Size 0-4 :",&lb[ilab].size); /* new_int("Font 0-times/1-symbol :",&lb[ilab].font); */ if(lb[ilab].size>4)lb[ilab].size=4; if(lb[ilab].size<0)lb[ilab].size=0; clr_scrn(); redraw_all(); } break; case 2: sprintf(str,"Delete %s ?", lb[ilab].s); ans=(char)TwoChoice("Yes","No",str,"yn"); if(ans=='y'){ lb[ilab].w=0; lb[ilab].use=0; clr_scrn(); redraw_all(); } break; } } if(ilab>=0&&type==1){ switch(com){ case 0: sprintf(str,"Move graphic at (%f,%f)", grob[ilab].xs,grob[ilab].ys); ans=(char)TwoChoice("Yes","No",str,"yn"); if(ans=='y'){ MessageBox("Reposition"); flag=GetMouseXY(&i,&j); KillMessageBox(); XFlush(display); if(flag){ scale_to_real(i,j,&x,&y); grob[ilab].xe=grob[ilab].xe-grob[ilab].xs+x; grob[ilab].ye=grob[ilab].ye-grob[ilab].ys+y; grob[ilab].xs=x; grob[ilab].ys=y; clr_scrn(); redraw_all(); } } break; case 1: sprintf(str,"Change graphic at (%f,%f)", grob[ilab].xs,grob[ilab].ys); ans=(char)TwoChoice("Yes","No",str,"yn"); if(ans=='y'){ if(grob[ilab].type>=MARKER) select_marker_type(&grob[ilab].type); new_float("Size ",&grob[ilab].size); new_int("Color :", &grob[ilab].color); clr_scrn(); redraw_all(); } break; case 2: sprintf(str,"Delete graphic at (%f,%f)", grob[ilab].xs,grob[ilab].ys); ans=(char)TwoChoice("Yes","No",str,"yn"); if(ans=='y'){ grob[ilab].w=0; grob[ilab].use=0; clr_scrn(); redraw_all(); } break; } } } } void do_gr_objs_com(int com) { switch(com){ case 0: cput_text(); break; case 1: add_pntarr(ARROW); break; case 2: add_pntarr(POINTER); break; case 3: add_marker(); break; case 6: add_markers(); break; /*case 4: edit_object(); break; */ case 5: destroy_label(draw_win); destroy_grob(draw_win); clr_scrn(); redraw_all(); break; } } void do_windows_com(int c) { int i,np=0; switch(c){ case 0: create_a_pop(); break; case 1: if(yes_no_box())kill_all_pops(); break; case 3: XLowerWindow(display,draw_win); break; case 2: destroy_a_pop(); break; case 5: set_restore(0); break; case 4: set_restore(1); break; case 6: SimulPlotFlag=1-SimulPlotFlag; break; /* default: create_a_pop(); break; */ } for(i=0;i=MAXPOP)return; select_window(graph[0].w); graph[i].Use=0; destroy_label(graph[i].w); destroy_grob(graph[i].w); XDestroySubwindows(display,graph[i].w); XDestroyWindow(display,graph[i].w); num_pops--; } void init_grafs(x,y,w,h) int x,y,w,h; { int i; GrCol(); for(i=0;iNullrestore){restore_nullclines();ps_stroke();} ps_last_pt_off(); redraw_dfield(); ps_do_color(0); draw_label(draw_win); draw_freeze(draw_win); ps_end(); } int rotate3dcheck(ev) XEvent ev; { Window w=ev.xbutton.window; XEvent z; int xini,yini,dx,dy; double theta,phi; if(w==draw_win&&MyGraph->ThreeDFlag){ xini=ev.xbutton.x; yini=ev.xbutton.y; phi=MyGraph->Phi; theta=MyGraph->Theta; while(1){ XNextEvent(display,&z); if(z.type==ButtonRelease){ do_axes(); redraw_all(); hi_lite(draw_win); return 1; } if(z.type==MotionNotify){ dx=z.xmotion.x-xini; dy=z.xmotion.y-yini; MyGraph->Phi=phi-(double)dy; MyGraph->Theta=theta-(double)dx; redraw_cube_pt(MyGraph->Theta,MyGraph->Phi); } } } return 0; } void do_motion_events(ev) XEvent ev; { int i=ev.xmotion.x; int j=ev.xmotion.y; float x,y; char buf[256]; slider_motion(ev); #ifdef AUTO auto_motion(ev); #endif if(ev.xmotion.window==draw_win){ scale_to_real(i,j,&x,&y); sprintf(buf,"x=%f y=%f ",x,y); canvas_xy(buf); } } void do_expose(ev) XEvent ev; { int i; int cp=current_pop; Window temp; temp=draw_win; top_button_draw(ev.xany.window); expose_aplot(ev.xany.window); redraw_txtview(ev.xany.window); ani_expose(ev.xany.window); expose_my_browser(ev); /* draw_info_pop(ev.xany.window); */ RedrawMessageBox(ev.xany.window); draw_eq_list(ev.xany.window); draw_eq_box(ev.xany.window); do_box_expose(ev.xany.window); expose_slides(ev.xany.window); menu_expose(ev.xany.window); #ifdef AUTO display_auto(ev.xany.window); #endif /* if(ev.xexpose.window==menu_pop){ draw_help(); return; } */ GrCol(); for(i=0;i=MAXPOP) { /*respond_box(main_win,0,0,"Okay","Too many windows!");*/ respond_box("Okay","Too many windows!"); return; } index=i; graph[index].w=XCreateSimpleWindow(display,RootWindow(display,screen),0,0,MINI_W,MINI_H,2,GrFore,GrBack); graph[index].w_info=make_window(graph[index].w,10,0,40*DCURXs,DCURYs,0); XSetWindowBackground(display,graph[i].w,MyDrawWinColor); copy_graph(index,current_pop); graph[index].Width=MINI_W; graph[index].Height=MINI_H; graph[index].x0=0; graph[index].y0=0; num_pops++; make_icon((char*)graph_bits,graph_width,graph_height,graph[index].w); XSelectInput(display,graph[index].w,KeyPressMask|ButtonPressMask |ExposureMask|ButtonReleaseMask|ButtonMotionMask); XMapWindow(display,graph[index].w); XRaiseWindow(display,graph[index].w); XSetWMProtocols(display, graph[index].w, &deleteWindowAtom, 1); select_window(graph[index].w); /* select_window(graph[0].w); select_window(graph[index].w); */ XRaiseWindow(display,graph[0].w); /* XDestroyWindow(display,temp); */ } void GrCol() { XSetForeground(display,gc,GrFore); XSetBackground(display,gc,GrBack); } void BaseCol() { XSetForeground(display,gc,MyForeColor); XSetBackground(display,gc,MyBackColor); } void SmallGr() { XSetForeground(display,small_gc,GrFore); XSetBackground(display,small_gc,GrBack); } void SmallBase() { XSetForeground(display,small_gc,MyForeColor); XSetBackground(display,small_gc,MyBackColor); } void change_plot_vars(int k) { int i,ip; int np; for(i=0;ik) graph[i].xv[ip]=graph[i].xv[ip]-1; if(graph[i].yv[ip]>k) graph[i].yv[ip]=graph[i].yv[ip]-1; if(graph[i].zv[ip]>k) graph[i].zv[ip]=graph[i].zv[ip]-1; } } } } int check_active_plot(int k) { int i,ip; int np; for(i=0;iw; get_draw_area(); } void select_window(w) Window w; { int i; if(w==draw_win)return; GrCol(); if(w==graph[0].w)current_pop=0; else{ for(i=1;iw_info); strcpy(MyGraph->gr_info,buf); if(MyGraph->w_info==info_pop){ BaseCol(); XDrawString(display,MyGraph->w_info,gc,5,CURY_OFF,buf,strlen(buf)); } else{ SmallBase(); XDrawString(display,MyGraph->w_info,small_gc,0,CURY_OFFs,buf,strlen(buf)); /* SmallGr(); */ } } void check_draw_button(ev) XEvent ev; { int k; char buf[256]; int button; int i,j; float x,y; int flag=0; Window w; button=ev.xbutton.button; w=ev.xbutton.window; i=ev.xbutton.x; j=ev.xbutton.y; if(button==1){ /* select window */ for(k=1;kexist==1){ sb->exist=0; XDestroySubwindows(display,sb->base); XDestroyWindow(display,sb->base); } } void create_scroll_box(Window root,int x0,int y0,int nent, int nw,char **list,SCROLLBOX *sb) { int slen=0; int i,hgt,wid; int ww,len; int hw=DCURYs+4; for(i=0;ibase=(Window)make_plain_window(root,x0,y0,wid,hgt,2); sb->w=(Window *)malloc(nw*sizeof(Window)); for(i=0;iw[i]=make_window(sb->base,1,hw/2+i*hw,ww,DCURYs,0); sb->i0=0; sb->nw=nw; sb->nent=nent; sb->list=list; if(sb->nwnent) sb->slide=make_window(sb->base,ww+DCURXs/2+2,2,ww+DCURXs/2+6,2+len,1); sb->len=len-4; sb->exist=1; } void expose_scroll_box(Window w,SCROLLBOX sb) { int i; /*int flag=-1;*/ for(i=0;inw>=sb->nent)return 0; if(w==sb->slide){ len=sb->len; if(x<2)x=2; if(x>(len+2))x=len+2; pos=((x-2)*(sb->nent-sb->nw))/len; if(pos<0)pos=0; if(pos>(sb->nent-sb->nw))pos=sb->nent-sb->nw; sb->i0=pos; redraw_scroll_box(*sb); } return 1; } int select_scroll_item(Window w,SCROLLBOX sb) { int i; int item=-1; for(i=0;ihot; int id=sb->hh[ihot]; int xx; int maxhgt=sb->hgt; int maxw; if(id<0)return; /* shouldnt happen */ maxw=maxhgt/hw-1; if(maxw>scrbox_list[id].n)maxw=scrbox_list[id].n; xx=get_x_coord_win(sb->win[ihot]); create_scroll_box(sb->base,xx,3, scrbox_list[id].n,maxw,scrbox_list[id].list, scrb); } int do_string_box(n,row,col,title,names,values,maxchar) int n,row,col,maxchar; char **names,values[][MAX_LEN_SBOX],*title; { STRING_BOX sb; int i,status; int colm,pos; SCROLLBOX scrb; scrb.exist=0; for(i=0;i0){ XDrawString(display,w,gc,l*DCURX,CURY_OFF,value,m); } /* if(flag) showchar('_',DCURX*(l+m),0,w); */ if(flag) put_cursor_at(w,DCURX*l,pos); } void reset_hot(inew,sb) int inew; STRING_BOX *sb; { int i=sb->hot; sb->hot=inew; XClearWindow(display, sb->win[inew]); do_hilite_text(sb->name[inew],sb->value[inew],1,sb->win[inew], strlen(sb->value[inew]),0); XClearWindow(display, sb->win[i]); do_hilite_text(sb->name[i],sb->value[i],0,sb->win[i], strlen(sb->value[i]),0); } void new_editable(sb,inew,pos,col,done,w) int inew; STRING_BOX *sb; int *pos,*col,*done; Window *w; { reset_hot(inew,sb); *pos=strlen(sb->value[inew]); *col=(*pos+strlen(sb->name[inew]))*DCURX; *done=0; *w=sb->win[inew]; } void set_sbox_item(STRING_BOX *sb,int item) { int i=sb->hot; int id=sb->hh[i]; if(id<0)return; strcpy(sb->value[i],scrbox_list[id].list[item]); /* plintf("setting %d to be %d in list %d \n", i,item, sb->hh[i]); */ } int s_box_event_loop(sb,pos,col,scrb) STRING_BOX *sb; SCROLLBOX *scrb; int *col,*pos; { XEvent ev; int status=-1,inew; int nn=sb->n; int done=0,i,j; int item; char ch; int ihot=sb->hot; Window wt; Window w=sb->win[ihot]; /* active window */ char *s; s=sb->value[ihot]; XNextEvent(display,&ev); switch(ev.type){ case ConfigureNotify: case Expose: case MapNotify: do_expose(ev); /* menus and graphs etc */ expose_sbox(*sb,ev.xany.window,*pos,*col); if(scrb->exist)expose_scroll_box(ev.xany.window,*scrb); break; case MotionNotify: if(scrb->exist) scroll_box_motion(ev,scrb); break; case ButtonPress: if(scrb->exist){ item=select_scroll_item(ev.xbutton.window,*scrb); if(item>=0){ set_sbox_item(sb,item); new_editable(sb,sb->hot,pos,col,&done,&w); destroy_scroll_box(scrb); } } if(ev.xbutton.window==sb->ok){ destroy_scroll_box(scrb); status=DONE_ALL; break; } if(ev.xbutton.window==sb->cancel){ status=FORGET_ALL; break; destroy_scroll_box(scrb); } for(i=0;iwin[i]){ XSetInputFocus(display,sb->win[i], RevertToParent,CurrentTime); if(i!=sb->hot){ destroy_scroll_box(scrb); new_editable(sb,i,pos,col,&done,&w); } else{ /* i==sb->hot */ if(ev.xbutton.xhot; if(sb->hh[j]>=0) { scroll_popup(sb,scrb); } } } break; } } break; case EnterNotify: wt=ev.xcrossing.window; if(scrb->exist)crossing_scroll_box(wt,1,*scrb); if(wt==sb->ok||wt==sb->cancel) XSetWindowBorderWidth(display,wt,2); break; case LeaveNotify: wt=ev.xcrossing.window; if(scrb->exist)crossing_scroll_box(wt,0,*scrb); if(wt==sb->ok||wt==sb->cancel) XSetWindowBorderWidth(display,wt,1); break; case KeyPress: ch=get_key_press(&ev); edit_window(w,pos,s,col,&done,ch); if(done!=0){ if(done==DONE_ALL){status=DONE_ALL;break;} inew=(sb->hot+1)%nn; new_editable(sb,inew,pos,col,&done,&w); } break; } return(status); } void make_sbox_windows(sb,row,col,title,maxchar) int row,col,maxchar; char *title; STRING_BOX *sb; { int width,height; int i; int xpos,ypos,n=sb->n; int xstart,ystart; XTextProperty winname; XSizeHints size_hints; Window base; width=(maxchar+4)*col*DCURX; height=(row+4)*(DCURY+16); base=make_plain_window(DefaultRootWindow(display),0,0,width,height,4); XStringListToTextProperty(&title,1,&winname); size_hints.flags=PPosition|PSize|PMinSize|PMaxSize; size_hints.x=0; size_hints.y=0; size_hints.width=width; size_hints.height=height; size_hints.min_width=width; size_hints.min_height=height; size_hints.max_width=width; size_hints.max_height=height; XClassHint class_hints; class_hints.res_name=""; class_hints.res_class=""; make_icon((char*)info_bits,info_width,info_height,base); XSetWMProperties(display,base,&winname,NULL,NULL,0,&size_hints,NULL,&class_hints); sb->base=base; sb->hgt=height; sb->wid=width; ystart=DCURY; xstart=DCURX; for(i=0;iwin[i]=make_window(base,xpos,ypos,maxchar*DCURX,DCURY,1); } ypos=height-2*DCURY; xpos=(width-16*DCURX)/2; (sb->ok)=make_window(base,xpos,ypos,8*DCURX,DCURY,1); (sb->cancel)=make_window(base,xpos+8*DCURX+4,ypos,8*DCURX,DCURY,1); XRaiseWindow(display,base); } /* This is the previous make_fancy_window which we override to get consistent use of colors for a themed look. Window make_fancy_window(root,x,y,width,height,bw,fc,bc) Window root; int x,y,width,height,bw; { Window win; win=XCreateSimpleWindow(display,root,x,y,width,height, bw,fc,bc); XSelectInput(display,win,ExposureMask|KeyPressMask|ButtonPressMask| StructureNotifyMask|ButtonReleaseMask|ButtonMotionMask| LeaveWindowMask|EnterWindowMask); XMapWindow(display,win); return(win); } */ Window make_fancy_window(root,x,y,width,height,bw,fc,bc) Window root; int x,y,width,height,bw,fc,bc; { Window win; win=XCreateSimpleWindow(display,root,x,y,width,height, bw,MyForeColor,MyBackColor); if (UserGradients == 1) { Pixmap pmap = XCreatePixmap(display,root,width,height,DefaultDepth(display, DefaultScreen(display))); int xx, yy; double cosine; /*double l2rads;*/ xx= 0; XColor bcolour, col2, diffcol; Colormap cmap = DefaultColormap(display, DefaultScreen(display)); XParseColor(display, cmap,UserWhite, &bcolour); XParseColor(display, cmap,UserBlack, &diffcol); /*l2rads = 3.1415926535897932384/(1.0*height); */ /*win=XCreateSimpleWindow(display,root,x,y,width,height, bw,diffcol.pixel,bcolour.pixel); */ for(yy = 0; yy < height; yy += 1) { if (yy<1.0) { col2.red = 65535; col2.green = 65355; col2.blue = 65355; } else { if (yy<(height/2.0)) { cosine = 1.0; } else if ((height-yy)<=1.0) { cosine = 0.1; } else { cosine = 0.93; } col2.red = bcolour.red * cosine; col2.green = bcolour.green * cosine; col2.blue = bcolour.blue * cosine; } XAllocColor(display, cmap, &col2); XSetForeground(display, gc, col2.pixel); for (xx = 1; xx < width-1; xx += 1) { XDrawPoint(display, pmap, gc, xx, yy); } /*Now do xx=0 and xx=width-1*/ xx = 0; col2.red = 65535; col2.green = 65355; col2.blue = 65355; XAllocColor(display, cmap, &col2); XSetForeground(display, gc, col2.pixel); XDrawPoint(display, pmap, gc, xx, yy); xx = width-1; cosine = 0.1; col2.red = bcolour.red * cosine; col2.green = bcolour.green * cosine; col2.blue = bcolour.blue * cosine; XAllocColor(display, cmap, &col2); XSetForeground(display, gc, col2.pixel); XDrawPoint(display, pmap, gc, xx, yy); } XSetWindowBackgroundPixmap(display,win,pmap); XFreePixmap(display,pmap); } XSelectInput(display,win,ExposureMask|KeyPressMask|ButtonPressMask| StructureNotifyMask|ButtonReleaseMask|ButtonMotionMask| LeaveWindowMask|EnterWindowMask); XMapWindow(display,win); return(win); } Window make_unmapped_window(root,x,y,width,height,bw) Window root; int x,y,width,height,bw; { Window win; win=XCreateSimpleWindow(display,root,x,y,width,height, bw,MyForeColor,MyBackColor); /*Gradient stuff*/ if (UserGradients == 1) { Pixmap pmap = XCreatePixmap(display,root,width,height,DefaultDepth(display, DefaultScreen(display))); int xx, yy; double cosine; /*double l2rads; */ xx= 0; XColor bcolour, col2, diffcol; Colormap cmap = DefaultColormap(display, DefaultScreen(display)); XParseColor(display, cmap,UserWhite, &bcolour); XParseColor(display, cmap,UserBlack, &diffcol); /*l2rads = 3.1415926535897932384/(1.0*height);*/ /* win=XCreateSimpleWindow(display,root,x,y,width,height, bw,diffcol.pixel,bcolour.pixel); */ for(yy = 0; yy < height; yy += 1) { if (yy<1.0) { col2.red = 65535; col2.green = 65355; col2.blue = 65355; } else { if (yy<(height/2.0)) { cosine = 1.0; } else if ((height-yy)<=1.0) { cosine = 0.1; } else { cosine = 0.93; } col2.red = bcolour.red * cosine; col2.green = bcolour.green * cosine; col2.blue = bcolour.blue * cosine; } XAllocColor(display, cmap, &col2); XSetForeground(display, gc, col2.pixel); for (xx = 1; xx < width-1; xx += 1) { XDrawPoint(display, pmap, gc, xx, yy); } /*Now do xx=0 and xx=width-1*/ xx = 0; col2.red = 65535; col2.green = 65355; col2.blue = 65355; XAllocColor(display, cmap, &col2); XSetForeground(display, gc, col2.pixel); XDrawPoint(display, pmap, gc, xx, yy); xx = width-1; cosine = 0.1; col2.red = bcolour.red * cosine; col2.green = bcolour.green * cosine; col2.blue = bcolour.blue * cosine; XAllocColor(display, cmap, &col2); XSetForeground(display, gc, col2.pixel); XDrawPoint(display, pmap, gc, xx, yy); } XSetWindowBackgroundPixmap(display,win,pmap); XFreePixmap(display,pmap); } XSelectInput(display,win,ExposureMask|KeyPressMask|ButtonPressMask| StructureNotifyMask|ButtonReleaseMask|ButtonMotionMask| LeaveWindowMask|EnterWindowMask); return(win); } Window make_plain_unmapped_window(root,x,y,width,height,bw) Window root; int x,y,width,height,bw; { Window win; win=XCreateSimpleWindow(display,root,x,y,width,height, bw,MyForeColor,MyBackColor); XSelectInput(display,win,ExposureMask|KeyPressMask|ButtonPressMask| StructureNotifyMask|ButtonReleaseMask|ButtonMotionMask| LeaveWindowMask|EnterWindowMask); return(win); } Window make_window(root,x,y,width,height,bw) Window root; int x,y,width,height,bw; { Window win; win=make_unmapped_window(root,x,y,width,height,bw); if(root==RootWindow(display,screen)) XSetWMProtocols(display, win, &deleteWindowAtom, 1); XMapWindow(display,win); return(win); } Window make_plain_window(root,x,y,width,height,bw) Window root; int x,y,width,height,bw; { Window win; win=make_plain_unmapped_window(root,x,y,width,height,bw); if(root==RootWindow(display,screen)) XSetWMProtocols(display, win, &deleteWindowAtom, 1); XMapWindow(display,win); return(win); } void expose_resp_box(button,message,wb,wm,w) Window w,wb,wm; char *button,*message; { if(w==wb)Ftext(0,0,button,wb); if(w==wm)Ftext(0,0,message,wm); } void respond_box(button,message) char *button,*message; { int l1=strlen(message); int l2=strlen(button); int width; int height; int done=0; XEvent ev; Window wmain,wb,wm; width=l1; if(l1-1&&com=0)value=key[def]; XDestroyWindow(display,w); *root=w; return(value); } draw_pop_list(w,title,list,n,max,def) Window w; char **list,*title; int n,max; int def; { int i,xi,yi; xi=2*DCURX; yi=4; set_fore(); bar(0,0,max,(DCURY+7),w); set_back(); Ftext(xi,yi,title,w); set_fore(); yi+=(DCURY+8); for(i=0;i #include #include #include #include #include #include "struct.h" #include "color.h" #include "graf_par.h" #include "calc.h" #define MAXPERPLOT 10 #define MAXPLOTS 20 #define DEGTORAD .0174532 #define EP1 1.000001 #define TAXIS 2 #define max(a,b) ((a>b) ? a : b) #define min(a,b) ((a0&&w>0)D_FLAG=1; else D_FLAG=0; MyGraph->Width=w; MyGraph->Height=h; MyGraph->x0=DLeft; MyGraph->y0=DTop; set_normal_scale(); } void change_current_linestyle(new,old) int new,*old; { *old=MyGraph->color[0]; MyGraph->color[0]=new; } void set_normal_scale() { XMin=MyGraph->xlo; YMin=MyGraph->ylo; XMax=MyGraph->xhi; YMax=MyGraph->yhi; } void point(x,y) int x,y; { if(PSFlag)ps_point(x,y); else point_x11(x,y); } void line(x1,y1,x2,y2) int x1,y1,x2,y2; { /* plintf("l %d %d %d %d \n",x1,y1,x2,y2); */ if(PSFlag)ps_line(x1,y1,x2,y2); else line_x11(x1,y1,x2,y2); } /* draw a little filled circle */ void bead(x1,y1) int x1,y1; { if(PSFlag)ps_bead(x1,y1); else bead_x11(x1,y1); } void frect(x1,y1,w,h) int x1,y1,w,h; { if(PSFlag)ps_frect(x1,y1,w,h); else rect_x11(x1,y1,w,h); } void put_text(x,y,str) int x,y; char *str; { if(PSFlag)ps_text(x,y,str); else put_text_x11(x,y,str); } void init_x11() { get_draw_area(); } void init_ps() { if(!PS_Port){ XDMax=7200; YDMax=5040; VTic=63; HTic=63; VChar=140; HChar=84; DLeft=12*HChar; DRight=XDMax-3*HChar-HTic; DTop=YDMax-1-VChar*7/2; DBottom=VChar*5/2+1; } else { YDMax=7200; XDMax=5040; VTic=63; HTic=63; VChar=140; HChar=84; DLeft=12*HChar; DRight=XDMax-3*HChar-HTic; DTop=YDMax-1-VChar*7/2; DBottom=VChar*5/2+1; } } void point_x11(xp,yp) int xp,yp; { int r=PointRadius; int r2 = (int) (r / 1.41421356 + 0.5); int wh = 2 * r2; if(PointRadius==0) XDrawPoint(display,draw_win,gc_graph,xp,yp); else XFillArc(display,draw_win,gc_graph,xp-r2,yp-r2,wh, wh, 0, 360*64); } void set_linestyle(ls) int ls; { if(PSFlag)ps_linetype(ls); else set_line_style_x11(ls); } void set_line_style_x11(ls) int ls; { /*int width=0;*/ int type=0; if(ls==-2){ /* Border */ set_color(0); XSetLineAttributes(display,gc_graph,2,LineSolid,CapButt,JoinBevel); return; } /*width=0; */ if(ls==-1){ set_color(0); XSetDashes(display,gc_graph,0,dashes[1],strlen(dashes[1])); XSetLineAttributes(display,gc_graph,0,LineOnOffDash,CapButt,JoinBevel); return; } if(!COLOR){ /* Mono */ ls=(ls%8)+2; if(ls==2) type=LineSolid; else{ type=LineOnOffDash; XSetDashes(display,gc_graph,0,dashes[ls],strlen(dashes[ls])); } set_color(0); XSetLineAttributes(display,gc_graph,0,type,CapButt,JoinBevel); return; } /* color system */ ls=ls%11; XSetLineAttributes(display,gc_graph,0,LineSolid,CapButt,JoinBevel); set_color(colorline[ls]); } void bead_x11(x,y) int x,y; { XFillArc(display,draw_win,gc_graph,x-2,y-2,4,4,0,360*64); } void rect_x11(x,y,w,h) int x,y,w,h; { XFillRectangle(display,draw_win,gc_graph,x,y,w,h); } void line_x11(xp1,yp1,xp2,yp2) int xp1,yp1,xp2,yp2; { XDrawLine(display,draw_win,gc_graph,xp1,yp1,xp2,yp2); } void put_text_x11(x,y,str) int x,y; char *str; { int sw=strlen(str)*DCURXs; switch(TextJustify){ case 0: sw=0; break; case 1: sw=-sw/2; break; case 2: sw=-sw; break; } XSetForeground(display,small_gc,GrFore); XDrawString(display,draw_win,small_gc,x+sw,y+DCURYs/3,str,strlen(str)); XSetForeground(display,small_gc,GrBack); } void special_put_text_x11(x,y,str,size) int x,y,size; char *str; { int i=0,j=0; int cx=x,cy=y; int cf=0,cs; int n=strlen(str),dx=0; char tmp[256],c; int sub,sup; cs=size; if(avromfonts[size]==1){ sup=romfonts[size]->ascent; sub=sup/2; } else { sup=small_font->ascent; sub=sup/2; } while(i0) cs=size-1; } if(c=='S'){ if(size>0) cs=size-1; cy=cy-sup; } if(c=='1'){ cf=1; } i++; } else { tmp[j]=c; j++; i++; } } tmp[j]=0; fancy_put_text_x11(cx,cy,tmp,cs,cf); } void fancy_put_text_x11(x,y,str,size,font) int x,y,size,font; char *str; { /*int yoff; */ if(strlen(str)==0)return; switch(font){ case 1: if(avsymfonts[size]==1){ XSetFont(display,font_gc,symfonts[size]->fid); /*yoff=symfonts[size]->ascent;*/ } else { XSetFont(display,font_gc,small_font->fid); /*yoff=small_font->ascent;*/ } XSetForeground(display,font_gc,GrFore); XDrawString(display,draw_win,font_gc,x,y,str,strlen(str)); XSetForeground(display,font_gc,GrBack); break; default: if(avromfonts[size]==1){ XSetFont(display,font_gc,romfonts[size]->fid); /*yoff=romfonts[size]->ascent;*/ } else { XSetFont(display,font_gc,small_font->fid); /*yoff=small_font->ascent;*/ } XSetForeground(display,font_gc,GrFore); XDrawString(display,draw_win,font_gc,x,y,str,strlen(str)); XSetForeground(display,font_gc,GrBack); break; } } void scale_dxdy(x,y,i,j) float x,y; double *i,*j; { float dx=(DRight-DLeft)/(XMax-XMin); float dy=(DTop-DBottom)/(YMax-YMin); *i=x*dx; *j=y*dy; } void scale_to_screen(x,y,i,j) /* not really the screen! */ float x,y; int *i,*j; { float dx=(DRight-DLeft)/(XMax-XMin); float dy=(DTop-DBottom)/(YMax-YMin); *i=(int)((x-XMin)*dx)+DLeft; *j=(int)((y-YMin)*dy)+DBottom; } void scale_to_real(i,j,x,y) /* Not needed except for X */ float *x,*y; int i,j; { int i1,j1; float x1,y1; get_draw_area(); i1=i-DLeft; j1=j-DBottom; x1=(float)i1; y1=(float)j1; *x=(MyGraph->xhi-MyGraph->xlo)*x1/((float)(DRight-DLeft))+MyGraph->xlo; *y=(MyGraph->yhi-MyGraph->ylo)*y1/((float)(DTop-DBottom))+MyGraph->ylo; } void init_all_graph() { int i; for(i=0;i8){ NPltV=8; } MyGraph->nvars=NPltV; for(i=1;ixv[i]=IX_PLT[i+1]; MyGraph->yv[i]=IY_PLT[i+1]; MyGraph->zv[i]=IZ_PLT[i+1]; MyGraph->color[i]=i; } } void reset_graph() { if(AXES>=5) PLOT_3D=1; else PLOT_3D=0; MyGraph->xv[0]=IXPLT; MyGraph->yv[0]=IYPLT; MyGraph->zv[0]=IZPLT; MyGraph->xmax=x_3d[1]; MyGraph->ymax=y_3d[1]; MyGraph->zmax=z_3d[1]; MyGraph->xbar=.5*(x_3d[1]+x_3d[0]); MyGraph->ybar=.5*(y_3d[1]+y_3d[0]); MyGraph->zbar=.5*(z_3d[1]+z_3d[0]); MyGraph->dx=2./(x_3d[1]-x_3d[0]); MyGraph->dy=2./(y_3d[1]-y_3d[0]); MyGraph->dz=2./(z_3d[1]-z_3d[0]); MyGraph->xmin=x_3d[0]; MyGraph->ymin=y_3d[0]; MyGraph->zmin=z_3d[0]; MyGraph->xlo=MY_XLO; MyGraph->ylo=MY_YLO; MyGraph->xhi=MY_XHI; MyGraph->yhi=MY_YHI; MyGraph->grtype=AXES; check_windows(); set_normal_scale(); redraw_the_graph(); } void get_graph() { x_3d[0]=MyGraph->xmin; x_3d[1]=MyGraph->xmax; y_3d[0]=MyGraph->ymin; y_3d[1]=MyGraph->ymax; z_3d[0]=MyGraph->zmin; z_3d[1]=MyGraph->zmax; MY_XLO=MyGraph->xlo; MY_YLO=MyGraph->ylo; MY_XHI=MyGraph->xhi; MY_YHI=MyGraph->yhi; IXPLT=MyGraph->xv[0]; IYPLT=MyGraph->yv[0]; IZPLT=MyGraph->zv[0]; PLOT_3D=MyGraph->ThreeDFlag; if(PLOT_3D) AXES=5; else AXES=0; AXES=MyGraph->grtype; } void init_graph(i) int i; { int j,k; if(AXES<=3)AXES=0; for(j=0;j<3;j++) for(k=0;k<3;k++) if(k==j)graph[i].rm[k][j]=1.0; else graph[i].rm[k][j]=0.0; graph[i].nvars=1; for(j=0;jTheta=theta; MyGraph->Phi=phi; MyGraph->rm[0][0]=ct; MyGraph->rm[0][1]=st; MyGraph->rm[0][2]=0.0; MyGraph->rm[1][0]=-cp*st; MyGraph->rm[1][1]=cp*ct; MyGraph->rm[1][2]=sp; MyGraph->rm[2][0]=st*sp; MyGraph->rm[2][1]=-sp*ct; MyGraph->rm[2][2]=cp; } void scale3d(x,y,z,xp,yp,zp) float x,y,z,*xp,*yp,*zp; { *xp=(x-MyGraph->xbar)*MyGraph->dx; *yp=(y-MyGraph->ybar)*MyGraph->dy; *zp=(z-MyGraph->zbar)*MyGraph->dz; } double proj3d(double theta,double phi,double x,double y,double z,int in) { double ct=cos(DEGTORAD*theta),st=sin(DEGTORAD*theta); double sp=sin(DEGTORAD*phi),cp=cos(DEGTORAD*phi); double rm[3][3]; double vt[3],vnew[3]; int i,j; rm[0][0]=ct; rm[0][1]=st; rm[0][2]=0.0; rm[1][0]=-cp*st; rm[1][1]=cp*ct; rm[1][2]=sp; rm[2][0]=st*sp; rm[2][1]=-sp*ct; rm[2][2]=cp; vt[0]=x; vt[1]=y; vt[2]=z; for(i=0;i<3;i++){ vnew[i]=0.0; for(j=0;j<3;j++)vnew[i]=vnew[i]+rm[i][j]*vt[j]; } return vnew[in]; } int threedproj(x2p,y2p,z2p,xp,yp) float x2p,y2p,z2p,*xp,*yp; { float x1p,y1p,z1p,s; /* if(fabs(x2p)>1||fabs(y2p)>1||fabs(z2p)>1)return(0); */ rot_3dvec(x2p,y2p,z2p,&x1p,&y1p,&z1p); if(MyGraph->PerspFlag==0){ *xp=x1p; *yp=y1p; return(1); } if((z1p>=(float)(MyGraph->ZView))||(z1p<(float)(MyGraph->ZPlane)))return(0); s=(float)(MyGraph->ZView-MyGraph->ZPlane)/((float)(MyGraph->ZView)-z1p); x1p=s*x1p; y1p=s*y1p; *xp=x1p; *yp=y1p; return(1); } void text3d(x,y,z,s) float x,y,z; char *s; { float xp,yp; if(threedproj(x,y,z,&xp,&yp)) text_abs(xp,yp,s); } void text_3d(x,y,z,s) float x,y,z; char *s; { float xp,yp; if(threed_proj(x,y,z,&xp,&yp)) text_abs(xp,yp,s); } int threed_proj(x,y,z,xp,yp) float x,y,z,*xp,*yp; { float x1p,y1p,z1p,s; float x2p,y2p,z2p; scale3d(x,y,z,&x2p,&y2p,&z2p); /* scale to a cube */ /* if(fabs(x2p)>1||fabs(y2p)>1||fabs(z2p)>1)return(0); */ rot_3dvec(x2p,y2p,z2p,&x1p,&y1p,&z1p); if(MyGraph->PerspFlag==0){ *xp=x1p; *yp=y1p; return(1); } if((z1p>=(float)(MyGraph->ZView))||(z1p<(float)(MyGraph->ZPlane)))return(0); s=(float)(MyGraph->ZView-MyGraph->ZPlane)/((float)(MyGraph->ZView)-z1p); x1p=s*x1p; y1p=s*y1p; *xp=x1p; *yp=y1p; return(1); } void point_3d( x, y, z) float x,y,z; { float xp,yp; if(threed_proj(x,y,z,&xp,&yp))point_abs(xp,yp); } void line3dn(xs1,ys1,zs1,xsp1,ysp1,zsp1) /* unscaled version unclipped */ float xs1,ys1,zs1,xsp1,ysp1,zsp1; { float xs,ys,zs; float xsp,ysp,zsp; rot_3dvec(xs1,ys1,zs1,&xs,&ys,&zs); /* rotate the line */ rot_3dvec(xsp1,ysp1,zsp1,&xsp,&ysp,&zsp); if(MyGraph->PerspFlag)pers_line(xs,ys,zs,xsp,ysp,zsp); else line_nabs(xs,ys,xsp,ysp); } void line3d(x01,y01,z01,x02,y02,z02) /* unscaled version */ float x01,x02,y01,y02,z01,z02; { float xs,ys,zs; float xs1,ys1,zs1; float xsp,ysp,zsp; float xsp1,ysp1,zsp1; if(!clip3d(x01,y01,z01,x02,y02,z02,&xs1,&ys1,&zs1,&xsp1,&ysp1,&zsp1))return; rot_3dvec(xs1,ys1,zs1,&xs,&ys,&zs); /* rotate the line */ rot_3dvec(xsp1,ysp1,zsp1,&xsp,&ysp,&zsp); if(MyGraph->PerspFlag)pers_line(xs,ys,zs,xsp,ysp,zsp); else line_abs(xs,ys,xsp,ysp); } void line_3d(x,y,z,xp,yp,zp) float x,y,z; float xp,yp,zp; { float xs,ys,zs; float xs1,ys1,zs1; float xsp,ysp,zsp; float xsp1,ysp1,zsp1; float x01,x02,y01,y02,z01,z02; scale3d(x,y,z,&x01,&y01,&z01); /* scale to a cube */ scale3d(xp,yp,zp,&x02,&y02,&z02); if(!clip3d(x01,y01,z01,x02,y02,z02,&xs1,&ys1,&zs1,&xsp1,&ysp1,&zsp1))return; rot_3dvec(xs1,ys1,zs1,&xs,&ys,&zs); /* rotate the line */ rot_3dvec(xsp1,ysp1,zsp1,&xsp,&ysp,&zsp); if(MyGraph->PerspFlag)pers_line(xs,ys,zs,xsp,ysp,zsp); else line_abs(xs,ys,xsp,ysp); } void pers_line(x,y,z,xp,yp,zp) float x,y,z,xp,yp,zp; { float Zv=(float)MyGraph->ZView,Zp=(float)MyGraph->ZPlane; float d=Zv-Zp,s; float eps=.005*d; if(((zp>=Zv)&&(z>=Zv))||((zpZv) { s=(Zv-eps-z)/(zp-z); zp=Zv-eps; yp=y+s*(yp-y); xp=x+s*(xp-x); } if(z>Zv) { s=(Zv-eps-zp)/(z-zp); z=Zv-eps; y=yp+s*(y-yp); x=xp+s*(x-xp); } if(zprm[i][j]*vt[j]; } *xp=vnew[0]; *yp=vnew[1]; *zp=vnew[2]; } void point_abs(x1, y1) float x1,y1; { int xp,yp; float x_left=XMin; float x_right=XMax; float y_top=YMax; float y_bottom=YMin; if((x1>x_right)||(x1y_top)||(y1x_right)||(x1y_top)||(y1=l){ /* oops - end of string */ new[j]='?'; new[j+1]=0; return; } } } /* ok - we have found matching and are done */ goto nc; /* sometimes its just easier to use the !#$$# goto */ } na: new[j]=c; j++; nc: /* normal characters */ i++; if(i>=l) break; } new[j]=0; return; } void fancy_text_abs(x,y,old,size,font) float x,y; int size,font; char *old; { int xp,yp; char text[256]; scale_to_screen(x,y,&xp,&yp); fillintext(old,text); if(PSFlag)special_put_text_ps(xp,yp,text,size); else special_put_text_x11(xp,yp,text,size); /* fancy_put_text_x11(xp,yp,text,size,font); */ } int clip3d( x1, y1, z1, x2, y2, z2, x1p, y1p, z1p, x2p, y2p, z2p) float x1, y1, z1, x2, y2, z2, *x1p, *y1p,*z1p,*x2p, *y2p, *z2p; { int istack,ix1=0,ix2=0,iy1=0,iy2=0,iz1=0,iz2=0,iflag=0; float wh,wv,wo,xhat,yhat,zhat,del; istack=1; *x1p=x1; *y1p=y1; *z1p=z1; *x2p=x2; *y2p=y2; *z2p=z2; if(x1<-1.)ix1=-1; if(x1>1.)ix1=1; if(x2<-1.)ix2=-1; if(x2>1.)ix2=1; if(y1<-1.)iy1=-1; if(y1>1.)iy1=1; if(y2<-1.)iy2=-1; if(y2>1.)iy2=1; if(z1<-1.)iz1=-1; if(z1>1.)iz1=1; if(z2<-1.)iz2=-1; if(z2>1.)iz2=1; if((abs(ix1)+abs(ix2)+abs(iy1)+abs(iy2)+abs(iz1)+abs(iz2))==0)return(1); /* Both are outside the cube */ if((ix1==ix2)&&(ix1!=0))return(0); if((iy1==iy2)&&(iy1!=0))return(0); if((iz1==iz2)&&(iz1!=0))return(0); if(ix1==0)goto C2; wv=-1; if(ix1>0)wv=1; *x1p=wv; del=(wv-x2)/(x1-x2); yhat=(y1-y2)*del+y2; zhat=(z1-z2)*del+z2; if(fabs(zhat)<=EP1&&fabs(yhat)<=EP1){ *y1p=yhat; *z1p=zhat; iflag=1; goto C3; } istack=0; C2: if(iy1==0)goto C22; wh=-1; if(iy1>0)wh=1; *y1p=wh; del=(wh-y2)/(y1-y2); xhat=(x1-x2)*del+x2; zhat=(z1-z2)*del+z2; if(fabs(zhat)<=EP1&&fabs(xhat)<=EP1){ *x1p=xhat; *z1p=zhat; iflag=1; goto C3; } istack=0; C22: if(iz1==0)goto C3; wo=-1; if(iz1>0)wo=1; *z1p=wo; del=(wo-z2)/(z1-z2); xhat=del*(x1-x2)+x2; yhat=del*(y1-y2)+y2; if(fabs(xhat)<=EP1&&fabs(yhat)<=EP1){ *x1p=xhat; *y1p=yhat; iflag=1;} else istack=0; C3: istack+=iflag; if((ix2==0)||(istack==0))goto C44; wv=-1; if(ix2>0)wv=1; *x2p=wv; del=(wv-x1)/(x2-x1); yhat=(y2-y1)*del+y1; zhat=(z2-z1)*del+z1; if(fabs(yhat)<=EP1&&fabs(zhat)<=EP1){ *y2p=yhat; *z2p=zhat; return(1); } C44: if(iy2==0||istack==0)goto C4; wh=-1; if(iy2>0)wh=1; *y2p=wh; del=(wh-y1)/(y2-y1); xhat=(x2-x1)*del+x1; zhat=(z2-z1)*del+z1; if(fabs(xhat)<=EP1&&fabs(zhat)<=EP1){ *z2p=zhat; *x2p=xhat; return(1); } C4: if(iz2==0||istack==0)return(iflag); wo=-1; if(iz2>0)wo=1; *z2p=wo; del=(wo-z1)/(z2-z1); xhat=(x2-x1)*del+x1; yhat=(y2-y1)*del+y1; if(fabs(xhat)<=EP1&&fabs(yhat)<=EP1){ *x2p=xhat; *y2p=yhat; return(1); } return(iflag); } int clip(x1,x2,y1, y2, x1_out,y1_out,x2_out,y2_out) float x1,y1,x2,y2,*x1_out,*y1_out,*x2_out,*y2_out; /************************************************************ * * Clipping algorithm * * on input, * * (x1,y1) and (x2,y2) are endpoints for line * * (x_left,y_bottom) and (x_right,y_top) is window * * output: * * value is 1 for drawing, 0 for no drawing * * (x1_out,y1_out),(x2_out,y2_out) are endpoints * * of clipped line * ***************************************************************/ { int istack,ix1,ix2,iy1,iy2,isum,iflag; float wh,xhat,yhat,wv; float x_left=XMin; float x_right=XMax; float y_top=YMax; float y_bottom=YMin; istack=1; ix1=ix2=iy1=iy2=iflag=0; *y1_out=y1; *y2_out=y2; *x1_out=x1; *x2_out=x2; if(x1x_right)ix1=1; if(x2x_right)ix2=1; if(y2y_top)iy2=1; if(y1y_top)iy1=1; isum=abs(ix1)+abs(ix2)+abs(iy1)+abs(iy2); if(isum==0)return(1); /* both inside window so plottem' */ if(((ix1==ix2)&&(ix1!=0))||((iy1==iy2)&&(iy1!=0)))return(0); if(ix1==0) goto C2; wv=x_left; if(ix1>0) wv=x_right; *x1_out=wv; yhat=(y1-y2)*(wv-x2)/(x1-x2)+y2; if((yhat<=y_top)&&(yhat>=y_bottom)) { *y1_out=yhat; iflag=1; goto C3; } istack=0; C2: if(iy1==0) goto C3; wh=y_bottom; if(iy1>0)wh=y_top; *y1_out=wh; xhat=(x1-x2)*(wh-y2)/(y1-y2)+x2; if((xhat<=x_right)&&(xhat>=x_left)) { *x1_out=xhat; iflag=1; } else istack=0; C3: istack+=iflag; if((ix2==0)||(istack==0)) goto C4; wv=x_left; if(ix2>0) wv=x_right; *x2_out=wv; yhat=(y2-y1)*(wv-x1)/(x2-x1)+y1; if((yhat<=y_top)&&(yhat>=y_bottom)) { *y2_out=yhat; return(1); } C4: if((iy2==0)||(istack==0))return(iflag); wh=y_bottom; if(iy2>0) wh=y_top; *y2_out=wh; xhat=(x2-x1)*(wh-y1)/(y2-y1)+x1; if((xhat<=x_right)&&(xhat>=x_left)) { *x2_out=xhat; return(1); } return(iflag); } void eq_symb(x,type) double *x; int type; { float dx=6.0*(float)(MyGraph->xhi-MyGraph->xlo)*SYMSIZE; float dy=6.0*(float)(MyGraph->yhi-MyGraph->ylo)*SYMSIZE; int ix=MyGraph->xv[0]-1,iy=MyGraph->yv[0]-1,iz=MyGraph->zv[0]-1; if(MyGraph->TimeFlag)return; set_color(0); if(MyGraph->ThreeDFlag) { dx=6.0*SYMSIZE/MyGraph->dx; dy=6.0*SYMSIZE/MyGraph->dy; line_3d((float)x[ix]+dx,(float)x[iy],(float)x[iz], (float)x[ix]-dx,(float)x[iy],(float)x[iz]); line_3d((float)x[ix],(float)x[iy]+dy,(float)x[iz], (float)x[ix],(float)x[iy]-dy,(float)x[iz]); return; } draw_symbol((float)x[ix],(float)x[iy],SYMSIZE,type); point_abs((float)x[ix],(float)x[iy]); } void draw_symbol( x, y, size,my_symb) float x,y,size; int my_symb; { float dx=(float)(MyGraph->xhi-MyGraph->xlo)*size; float dy=(float)(MyGraph->yhi-MyGraph->ylo)*size; static int sym_dir[4][48] = { /* box */ {0, -6, -6,1, 12, 0,1, 0, 12,1,-12, 0, 1, 0,-12,3, 0, 0,3, 0, 0,3, 0, 0, 3, 0, 0,3, 0, 0,3, 0, 0,3, 0, 0, 3, 0, 0,3, 0, 0,3, 0, 0,3, 0, 0}, /* triangle */ {0, -6, -6,1, 12, 0,1, -6, 12,1, -6,-12, 3, 0, 0,3, 0, 0,3, 0, 0,3, 0, 0, 3, 0, 0,3, 0, 0,3, 0, 0,3, 0, 0, 3, 0, 0,3, 0, 0,3, 0, 0,3, 0, 0}, /* cross */ {0, -6, 0,1, 12, 0,0, -6, -6,1, 0, 12, 3, 0, 0,3, 0, 0,3, 0, 0,3, 0, 0, 3, 0, 0,3, 0, 0,3, 0, 0,3, 0, 0, 3, 0, 0,3, 0, 0,3, 0, 0,3, 0, 0}, /* circle */ {0, 6, 0,1, -1, 3,1, -2, 2,1, -3, 1, 1, -3, -1,1, -2, -2,1, -1, -3,1, 1, -3, 1, 2, -2,1, 3, -1,1, 3, 1,1, 2, 2, 1, 1, 3,3, 0, 0,3, 0, 0,3, 0, 0}, }; int ind=0,pen=0; float x1=x,y1=y,x2,y2; while(pen!=3) { x2=sym_dir[my_symb][3*ind+1]*dx+x1; y2=sym_dir[my_symb][3*ind+2]*dy+y1; pen=sym_dir[my_symb][3*ind]; if(pen!=0) line_abs(x1,y1,x2,y2); x1=x2; y1=y2; ind++; } } dialog_box.c0000644000175000017500000001201311633745144013224 0ustar dumzdejdumzdej#include "dialog_box.h" #include "many_pops.h" #include "ggets.h" #include #include #include #include #include #include #include #include #include #define ALL_DONE 2 #define DONE_WITH_THIS 1 #define FORGET_ALL 0 #define FORGET_THIS 3 #include "struct.h" #define EV_MASK (ButtonPressMask |\ KeyPressMask |\ ExposureMask |\ StructureNotifyMask) #define BUT_MASK (ButtonPressMask |\ KeyPressMask |\ ExposureMask |\ StructureNotifyMask |\ EnterWindowMask |\ LeaveWindowMask) extern Display *display; extern Window main_win; extern unsigned int MyBackColor,MyForeColor; extern int screen; extern GC gc; extern int xor_flag,DCURY,DCURX,CURY_OFF,CURS_X,CURS_Y; double atof(); Window make_window(); int get_dialog(wname,name,value,ok,cancel,max) char *wname,*name,*value,*ok,*cancel; int max; { int lm=strlen(name)*DCURX; int lv=max*DCURX; int pos,colm; int lo=strlen(ok)*DCURX; int lc=strlen(cancel)*DCURX; int status; XTextProperty winname; DIALOG d; strcpy(d.mes_s,name); strcpy(d.input_s,value); strcpy(d.ok_s,ok); strcpy(d.cancel_s,cancel); d.base=XCreateSimpleWindow(display,RootWindow(display,screen),0,0, lm+lv+20,30+2*DCURY,2,MyForeColor,MyBackColor); XStringListToTextProperty(&wname,1,&winname); XClassHint class_hints; class_hints.res_name=""; class_hints.res_class=""; XSetWMProperties(display,d.base,&winname,NULL,NULL,0,NULL,NULL,&class_hints); d.mes=XCreateSimpleWindow(display,d.base,5,5,lm,DCURY+8,1,MyBackColor,MyBackColor); d.input=XCreateSimpleWindow(display,d.base,10+lm,5,lv,DCURY+8,1,MyBackColor,MyBackColor); d.ok=XCreateSimpleWindow(display,d.base,5,10+DCURY,lo+4,DCURY+8,1,MyForeColor,MyBackColor); d.cancel=XCreateSimpleWindow(display,d.base, 5+lo+10,10+DCURY,lc+4,DCURY+8,1,MyForeColor,MyBackColor); XSelectInput(display,d.base,EV_MASK); XSelectInput(display,d.input,EV_MASK); XSelectInput(display,d.mes,EV_MASK); XSelectInput(display,d.ok,BUT_MASK); XSelectInput(display,d.cancel,BUT_MASK); /* txt=XCreateFontCursor(display,XC_xterm); XDefineCursor(display,d.input,txt); */ XMapWindow(display,d.base); XMapWindow(display,d.mes); XMapWindow(display,d.input); XMapWindow(display,d.ok); XMapWindow(display,d.cancel); /* CURS_X=strlen(d.input_s); */ /* showchar('_', DCURX*CURS_X, 0, d.input); */ pos=strlen(d.input_s); colm=DCURX*pos; while(1) { status=dialog_event_loop(&d,max,&pos,&colm); if(status!=-1)break; } XSelectInput(display,d.cancel,EV_MASK); XSelectInput(display,d.ok,EV_MASK); XDestroySubwindows(display,d.base); XDestroyWindow(display,d.base); XFlush(display); if(status==ALL_DONE||status==DONE_WITH_THIS) strcpy(value,d.input_s); return(status); } int dialog_event_loop(d,max,pos,col) DIALOG *d; int max; int *pos,*col; { int status=-1; int done=0; int ch; XEvent ev; XNextEvent(display,&ev); switch(ev.type){ case ConfigureNotify: case Expose: case MapNotify: do_expose(ev); display_dialog(ev.xany.window,*d,*pos,*col); break; case ButtonPress: if(ev.xbutton.window==d->ok) { status=ALL_DONE; } if(ev.xbutton.window==d->cancel) { status=FORGET_ALL; } if(ev.xbutton.window==d->input) XSetInputFocus(display,d->input,RevertToParent,CurrentTime); break; case EnterNotify: if(ev.xcrossing.window==d->ok|| ev.xcrossing.window==d->cancel ) XSetWindowBorderWidth(display, ev.xcrossing.window,2); break; case LeaveNotify: if(ev.xcrossing.window==d->ok|| ev.xcrossing.window==d->cancel ) XSetWindowBorderWidth(display, ev.xcrossing.window,1); break; case KeyPress: ch=get_key_press(&ev); edit_window(d->input,pos,d->input_s,col,&done,ch); if(done==-1)status=FORGET_ALL; if(done==1||done==2)status=DONE_WITH_THIS; break; } return(status); } void display_dialog(w,d,pos,col) Window w; DIALOG d; int pos,col; { if(w==d.ok) XDrawString(display,w,gc,0,CURY_OFF+1,d.ok_s,strlen(d.ok_s)); if(w==d.cancel) XDrawString(display,w,gc,0,CURY_OFF+1,d.cancel_s,strlen(d.cancel_s)); if(w==d.mes) XDrawString(display,w,gc,0,CURY_OFF+1,d.mes_s,strlen(d.mes_s)); if(w==d.input){ XDrawString(display,w,gc,0,CURY_OFF,d.input_s,strlen(d.input_s)); put_cursor_at(w,col,0); /* showchar('_',DCURX*strlen(d.input_s),0,d.input); */ } } /* Uses Dialog boxes for input of numbers */ /* new_float(name,value) char *name; double *value; { char tvalue[100]; int status; sprintf(tvalue,"%.16g",*value); status=get_dialog(name,name,tvalue,"Ok","Cancel",30); if(status==FORGET_ALL||strlen(tvalue)==0)return; if(tvalue[0]=='%') { do_calc(&tvalue[1],value); return; } *value=atof(tvalue); } */ /* new_int(name,value) char *name; int *value; { char tvalue[100]; int status; sprintf(tvalue,"%d",*value); status=get_dialog(name,name,tvalue,"Ok","Cancel",30); if(status==FORGET_ALL||strlen(tvalue)==0)return; *value=atoi(tvalue); } */ numerics.c0000644000175000017500000002757411630554615012762 0ustar dumzdejdumzdej #include "numerics.h" #include "menudrive.h" #include #include #include #include #include #include "browse.h" #include "pop_list.h" #include "volterra2.h" #include "menu.h" #include "ggets.h" #include "pp_shoot.h" #include "storage.h" #include "delay_handle.h" #include "graf_par.h" extern Window main_win,info_pop; extern Display *display; extern int DCURY,NDELAYS; extern int RandSeed; #include "struct.h" extern GRAPH *MyGraph; #define MAX_LEN_SBOX 25 #define VOLTERRA 6 #define BACKEUL 7 #define RKQS 8 #define STIFF 9 #define CVODE 10 #define GEAR 5 #define DP5 11 #define DP83 12 #define RB23 13 #define SYMPLECT 14 extern int NKernel,MyStart,MaxPoints; extern int NFlags; extern double STOL; extern char *info_message,*meth_hint[]; extern int DelayGrid; extern double OmegaMax,AlphaMax; double atof(); extern BROWSER my_browser; /* This is numerics.c * The input is primitive and eventually, I want to make it so that it uses nice windows for input. For now, I just will let it remain command driven */ typedef struct { double tmod; int maxvar,sos,type,sign; char section[256]; int formula[256]; } POINCARE_MAP; POINCARE_MAP my_pmap; int (*solver)(); extern double DELTA_T,TEND,T0,TRANS, NULL_ERR,EVEC_ERR,NEWT_ERR; extern double BOUND,DELAY,TOLER,ATOLER,HMIN,HMAX; float *fft_data,*hist_data,color_scale,min_scale; extern double POIPLN; extern double BVP_TOL,BVP_EPS; extern int NMESH,NJMP,METHOD,NC_ITER; extern int EVEC_ITER; extern int BVP_MAXIT,BVP_NL,BVP_NR; extern int POIMAP,POIVAR,POISGN,SOS; extern int HIST,HVAR,hist_ind,FOREVER,INFLAG; extern int MaxEulIter; extern double EulTol; extern int AutoEvaluate; int gear(); int discrete(); int euler(); int mod_euler(); int rung_kut(); int adams(); int volterra(); int bak_euler(); int symplect3(); int cv_bandflag=0,cv_bandupper=1,cv_bandlower=1; extern int COLOR,color_total,color_min; extern Window command_pop; /* This is the input for the various functions */ /* I will need access to storage */ extern float **storage; extern int storind; extern int NODE,NEQ; /* as well as the number of odes etc */ void chk_volterra() { if (NKernel>0)METHOD=VOLTERRA; } void check_pos(j) int *j; { if(*j<=0)*j=1; } void quick_num(int com) { char key[]="tsrdnviobec"; if(com>=0&&com<11) get_num_par(key[com]); } void get_num_par(ch) char ch; { double temp; int tmp; switch(ch){ case 'a': make_adj(); break; case 't': flash(0); /* total */ new_float("total :",&TEND); FOREVER=0; if(TEND<0) { FOREVER=1; TEND=-TEND; } flash(0); break; case 's': flash(1); /* start */ new_float("start time :",&T0); flash(1); break; case 'r': flash(2); /* transient */ new_float("transient :",&TRANS); flash(2); break; case 'd': flash(3); /* DT */ temp=DELTA_T; new_float("Delta t :",&DELTA_T); if(DELTA_T==0.0)DELTA_T=temp; if(DELAY>0.0) { free_delay(); if(alloc_delay(DELAY)){ INFLAG=0; /* Make sure no last ics allowed */ } } else free_delay(); if(NKernel>0){ INFLAG=0; MyStart=1; alloc_kernels(1); } /* if(NMemory>0){ make_kernels(); reset_memory(); INFLAG=0; } */ flash(3); break; case 'n': flash(4); /* ncline */ new_int("ncline mesh :",&NMESH); /* new_float("Error :",&NULL_ERR); */ check_pos(&NMESH); flash(4); break; case 'v': /* new_int("Number Left :", &BVP_NL); new_int("Number Right :", &BVP_NR); */ new_int("Maximum iterates :",&BVP_MAXIT); check_pos(&BVP_MAXIT); new_float("Tolerance :",&BVP_TOL); new_float("Epsilon :",&BVP_EPS); reset_bvp(); break; case 'i': flash(5); /* sing pt */ new_int("Maximum iterates :",&EVEC_ITER); check_pos(&EVEC_ITER); new_float("Newton tolerance :",&EVEC_ERR); new_float("Jacobian epsilon :",&NEWT_ERR); if(NFlags>0) new_float("SMIN :",&STOL); flash(5); break; case 'o': flash(6); /* noutput */ new_int("n_out :",&NJMP); check_pos(&NJMP); flash(6); break; case 'b': flash(7); /* bounds */ new_float("Bounds :",&BOUND); BOUND=fabs(BOUND); flash(7); break; case 'm': flash(8); /* method */ get_method(); if(METHOD==VOLTERRA&&NKernel==0){ err_msg("Volterra only for integral eqns"); METHOD=4; } if(NKernel>0)METHOD=VOLTERRA; if(METHOD==GEAR||METHOD==RKQS||METHOD==STIFF) { new_float("Tolerance :",&TOLER); new_float("minimum step :",&HMIN); new_float("maximum step :",&HMAX); } if(METHOD==CVODE||METHOD==DP5||METHOD==DP83||METHOD==RB23) { new_float("Relative tol:",&TOLER); new_float("Abs. Toler:",&ATOLER); } if(METHOD==BACKEUL||METHOD==VOLTERRA){ new_float("Tolerance :",&EulTol); new_int("MaxIter :",&MaxEulIter); } if(METHOD==VOLTERRA){ tmp=MaxPoints; new_int("MaxPoints:",&tmp); new_int("AutoEval(1=yes) :",&AutoEvaluate); allocate_volterra(tmp,1); } if(METHOD==CVODE||METHOD==RB23) { new_int("Banded system(0/1)?",&cv_bandflag); if(cv_bandflag==1){ new_int("Lower band:",&cv_bandlower); new_int("Upper band:",&cv_bandupper); } } if(METHOD==SYMPLECT){ if((NODE%2)!=0){ err_msg("Symplectic is only for even dimensions"); METHOD=4; } } flash(8); break; case 'e': flash(9); /* delay */ if(NDELAYS==0)break; new_float("Maximal delay :",&DELAY); new_float("real guess :", &AlphaMax); new_float("imag guess :", &OmegaMax); new_int("DelayGrid :",&DelayGrid); if(DELAY>0.0) { free_delay(); if(alloc_delay(DELAY)){ INFLAG=0; /* Make sure no last ics allowed */ } } else free_delay(); flash(9); break; case 'c': flash(10); /* color */ if(COLOR==0)break; set_col_par(); flash(10); break; case 'h': flash(11); do_stochast(); flash(11); break; case 'f': flash(11); /* FFT */ flash(11); break; case 'p': flash(12); /*Poincare map */ get_pmap_pars(); flash(12); break; case 'u': flash(13); /* ruelle */ ruelle(); flash(13); break; case 'k': flash(14); /*lookup table */ new_lookup(); flash(14); break; case 27: do_meth(); TEND=fabs(TEND); alloc_meth(); help(); break; } /* End num switch */ } void chk_delay() { if(DELAY>0.0) { free_delay(); if(alloc_delay(DELAY)){ INFLAG=0; /* Make sure no last ics allowed */ } } else free_delay(); } void set_delay() { if(NDELAYS==0)return; if(DELAY>0.0){ free_delay(); if(alloc_delay(DELAY)){ INFLAG=0; } } } void ruelle() { new_int("x-axis shift ",&(MyGraph->xshft)); new_int("y-axis shift ",&(MyGraph->yshft)); new_int("z-axis shift",&(MyGraph->zshft)); if(MyGraph->xshft<0)MyGraph->xshft=0; if(MyGraph->yshft<0)MyGraph->yshft=0; if(MyGraph->zshft<0)MyGraph->zshft=0; } void init_numerics() /* these are the default values of the numerical parameters */ { DELTA_T=.05; TEND=20.0; T0=0.0; TRANS=0.0; NULL_ERR=.001; EVEC_ERR=.001; NEWT_ERR=.001; BOUND=100.0; DELAY=0.0; TOLER=.00001; HMIN=.001; HMAX=1.0; POIPLN=0.0; NMESH=50; NJMP=1; METHOD=4; NC_ITER=100; EVEC_ITER=100; /* new improved poincare map */ my_pmap.maxvar=1; my_pmap.type=0; my_pmap.sos=0; my_pmap.sign=1; my_pmap.tmod=8.*atan(1.0); sprintf(my_pmap.section," "); POIMAP=0; POIVAR=1; POISGN=1; SOS=0; } void meth_dialog() { /*static char *n[]={"*6Method","Abs tol","Rel Tol","DtMin","DtMax", "Banded(y/n)","UpperBand","LowerBand"};*/ char values[8][MAX_LEN_SBOX]; sprintf(values[0],"%d",METHOD); sprintf(values[1],"%g",ATOLER); sprintf(values[2],"%g",TOLER); } void get_pmap_pars_com(int l) { static char mkey[]="nsmp"; char ch; static char *n[]={"*0Variable","Section","Direction (+1,-1,0)","Stop on sect(y/n)"}; char values[4][MAX_LEN_SBOX]; static char *yn[]={"N","Y"}; int status; char n1[15]; int i1=POIVAR; ch=mkey[l]; POIMAP=0; if(ch=='s')POIMAP=1; if(ch=='m')POIMAP=2; if(ch=='p')POIMAP=3; if(POIMAP==0)return; ind_to_sym(i1,n1); sprintf(values[0],"%s",n1); sprintf(values[1],"%.16g",POIPLN); sprintf(values[2],"%d",POISGN); sprintf(values[3],"%s",yn[SOS]); status=do_string_box(4,4,1,"Poincare map",n,values,45); if(status!=0){ find_variable(values[0],&i1); if(i1<0) { POIMAP=0; err_msg("No such section"); return; } POIVAR=i1; POISGN=atoi(values[2]); if(values[3][0]=='Y'||values[3][0]=='y')SOS=1; else SOS=0; POIPLN=atof(values[1]); } } void get_method() { char ch; int i; int nmeth; Window temp=main_win; static char *n[]={"(D)iscrete","(E)uler","(M)od. Euler", "(R)unge-Kutta","(A)dams","(G)ear","(V)olterra","(B)ackEul", "(Q)ualst.RK4","(S)tiff","(C)Vode","DoPri(5)","DoPri(8)3", "Rosen(2)3","sYmplectic"}; static char key[]="demragvbqsc582y"; #ifdef CVODE_YES nmeth=15; #else nmeth=15; #endif ch = (char)pop_up_list(&temp,"Method",n,key,nmeth,15,METHOD,10,DCURY+8, meth_hint,info_pop,info_message); for(i=0;i(nmeth-1))i=nmeth-1; /* XDestroyWindow(display,temp); */ } void set_col_par_com(int i) { int j,ivar; double temp[2]; float maxder=0.0,minder=0.0,sum=0.0; char ch,name[20]; MyGraph->ColorFlag=i; if(MyGraph->ColorFlag==0){ /* set color to black/white */ return; } if(MyGraph->ColorFlag==2){ ind_to_sym(MyGraph->ColorValue,name); new_string("Color via:",name); find_variable(name,&ivar); if(ivar>=0) MyGraph->ColorValue=ivar; else{ err_msg("No such quantity!"); MyGraph->ColorFlag=0; return; } } /* This will be uncommented ..... */ ch=TwoChoice("(O)ptimize","(C)hoose","Color","oc"); if(ch=='c') { temp[0]=MyGraph->min_scale; temp[1]=MyGraph->min_scale+MyGraph->color_scale; new_float("Min :",&temp[0]); new_float("Max :",&temp[1]); if(temp[1]>temp[0]&&((MyGraph->ColorFlag==2) ||(MyGraph->ColorFlag==1&&temp[0]>=0.0))) { MyGraph->min_scale=temp[0]; MyGraph->color_scale=(temp[1]-temp[0]); } else{ err_msg("Min>=Max or Min<0 error"); } return; } if(MyGraph->ColorFlag==1) { if(storind<2)return; maxder=0.0; minder=1.e20; for(i=1;imaxder)maxder=sum; } if(minder>=0.0&&maxder>minder) { MyGraph->color_scale=(maxder-minder)/(fabs(DELTA_T*NJMP)); MyGraph->min_scale=minder/(fabs(DELTA_T*NJMP)); } } else { get_max(MyGraph->ColorValue,&temp[0],&temp[1]); MyGraph->min_scale=temp[0]; MyGraph->color_scale=(temp[1]-temp[0]); if(MyGraph->color_scale==0.0)MyGraph->color_scale=1.0; } } void do_meth() { if(NKernel>0)METHOD=VOLTERRA; switch(METHOD) { case 0: solver=discrete; DELTA_T=1;break; case 1: solver=euler;break; case 2: solver=mod_euler;break; case 3: solver=rung_kut;break; case 4: solver=adams;break; case 5: NJMP=1;break; case 6: solver=volterra;break; case SYMPLECT: solver=symplect3; break; case BACKEUL: solver=bak_euler;break; case RKQS: case STIFF: case CVODE: case DP5: case DP83: case RB23: NJMP=1; break; default: solver=rung_kut; } } choice_box.c0000644000175000017500000000771511610403677013231 0ustar dumzdejdumzdej#include "choice_box.h" #include #include #include #include #include #include #include #include #define ALL_DONE 2 #define DONE_WITH_THIS 1 #define FORGET_ALL 0 #define FORGET_THIS 3 #include "struct.h" #include "pop_list.h" #include "ggets.h" #define EV_MASK (ButtonPressMask |\ KeyPressMask |\ ExposureMask |\ StructureNotifyMask) extern Display *display; extern Window main_win; extern unsigned int MyBackColor,MyForeColor; extern int screen; extern GC gc; extern int xor_flag,DCURY,DCURX,CURY_OFF,CURS_X,CURS_Y; void destroy_choice(p) CHOICE_BOX p; { XDestroySubwindows(display,p.base); XDestroyWindow(display,p.base); } void display_choice(w,p) Window w; CHOICE_BOX p; { int i; int n=p.n; XSetFillStyle(display,gc,FillSolid); XSetForeground(display,gc,MyForeColor); if(w==p.ok)XDrawString(display,w,gc,0,CURY_OFF,"Ok",2); if(w==p.cancel) XDrawString(display,w,gc,0,CURY_OFF,"Cancel",6); for(i=0;i #include #include "ggets.h" #include #define COLOR_SCALE 0 #define GRAYSCALE 1 #define RGRAYSCALE 2 #define SOLID -1 #define RED 20 #define REDORANGE 21 #define ORANGE 22 #define YELLOWORANGE 23 #define YELLOW 24 #define YELLOWGREEN 25 #define GREEN 26 #define BLUEGREEN 27 #define BLUE 28 #define PURPLE 29 #define C_NORM 0 #define C_PERIODIC 1 #define C_HOT 2 #define C_COOL 3 #define C_REDBLUE 4 #define C_GRAY 5 #define C_BUDGIE 6 extern GC gc_graph,small_gc; extern Display *display; extern int screen; extern Window main_win; int color_mode=1,color_min,color_total,COLOR,color_max; extern int DCURX,DCURY,CURY_OFF,CURS_X,CURS_Y,DCURXs,DCURYs; extern unsigned int Black,White; extern unsigned int MyBackColor,MyForeColor,GrFore,GrBack; int periodic=0,spectral; int custom_color; #define MAX_COLORS 256 #define COL_TOTAL 100 /* int rfun(),gfun(),bfun(); */ XColor color[MAX_COLORS]; /* int pixel[MAX_COLORS]; */ extern int TrueColorFlag; void tst_color(w) Window w; { int i; for(i=0;i.666666)&&(per==1))x=1.-y; if(x>.33333333333)return(0); return((int)(3.*255*sqrt((.333334-x)*(x+.33334)))); } int gfun(y,per) double y; int per; { if(y>.666666)return(0); return( (int)(3.*255*sqrt((.6666667-y)*(y)))); } int bfun(y,per) double y; int per; { if(y<.333334)return(0); return((int)(2.79*255*sqrt((1.05-y)*(y-.333333333)))); } void NewColormap(int type) { if(TrueColorFlag==0){ err_msg("New colormaps not supported without TrueColor"); return; } custom_color=type; MakeColormap(); } void get_ps_color(int i,float *r,float *g,float *b) { float z=1./(255.*255.); *r=z*(float)color[i].red; *g=z*(float)color[i].green; *b=z*(float)color[i].blue; } void MakeColormap() { Colormap cmap; int i; int clo=20; int r[256],g[256],b[256]; color_min = 30; color_max = MAX_COLORS -1; color_total = color_max - color_min +1; if(color_total>COL_TOTAL)color_total=COL_TOTAL; color_max=color_min+color_total; cmap = DefaultColormap(display,screen); for (i = 0; i < clo; i++) { color[i].pixel = i; } for(i=20;i<30;i++){ color[i].red=0; color[i].blue=0; color[i].green=0; color[i].flags = DoRed | DoGreen | DoBlue; } color[RED].red=255; color[BLUE].blue=255; color[GREEN].green=225; color[YELLOWGREEN].red=200; color[YELLOWGREEN].blue=75; color[YELLOWGREEN].green=235; color[REDORANGE].red=240; color[REDORANGE].green=100; color[ORANGE].red=255; color[ORANGE].green=165 ; color[YELLOWORANGE].red=255; color[YELLOWORANGE].green=205; color[YELLOW].red=200; color[YELLOW].green=200; color[BLUEGREEN].blue=200; color[BLUEGREEN].green=200; color[PURPLE].red=160; color[PURPLE].green=32; color[PURPLE].blue=240; for(i=20;i<30;i++) { color[i].red=color[i].red<<8; color[i].blue=color[i].blue<<8; color[i].green=color[i].green<<8; color[i].flags = DoRed | DoGreen | DoBlue; XAllocColor(display,cmap,&color[i]); } make_cmaps(r,g,b,color_total+1,custom_color); for (i = color_min; i <= color_max; i++) { color[i].red=r[i-color_min]; color[i].green=g[i-color_min]; color[i].blue=b[i-color_min]; color[i].flags = DoRed | DoGreen | DoBlue; XAllocColor(display,cmap,&color[i]); } } int ColorMap(i) int i; { if(i==-1)return(GrBack); if(i==0)return(GrFore); if(color_mode){ if(i<0)i=0; if(i>=color_max)i=color_max; return(color[i].pixel); } else { return(i); } } init_conds.c0000644000175000017500000014403511633745416013262 0ustar dumzdejdumzdej#include "init_conds.h" #include "parserslow.h" #include "tabular.h" #include "nullcline.h" #include "menudrive.h" #include "arrayplot.h" #include "lunch-new.h" #include "volterra2.h" #include "calc.h" #include "delay_handle.h" #include "integrate.h" #include "eig_list.h" #include "graf_par.h" #include #include #include /* This makes a big box with windows that have the names of the variables and their current initial data, parameters, BCs etc This also has the slider boxes This also has the file selector gadget This also has the clone gadget */ #include #include #include #include #include #ifndef WCTYPE #include #else #include #endif #include #include "xpplim.h" #include "ic.bitmap" #include "param.bitmap" #include "delay.bitmap" #include "filebrowse.bitmap" #include "bc.bitmap" #include "shoot.h" #include "ggets.h" #include "pop_list.h" #include "read_dir.h" #include "derived.h" #include "form_ode.h" #include "many_pops.h" #include "mykeydef.h" #define HOTWILD 2 #define HOTFILE 1 #define READEM 1 #define WRITEM 0 #define MAX_LEN_SBOX 25 #define MAXLINES 5000 extern char *save_eqn[MAXLINES]; extern int NLINES; extern Display *display; extern int screen,Xup; extern GC gc, small_gc; extern Window main_win; extern int DCURX,DCURXs,DCURY,DCURYs,CURY_OFFs,CURY_OFF; extern int NDELAYS; extern char UserBGBitmap[100]; extern double DELAY; extern int noicon; #define PARAMBOX 1 #define ICBOX 2 #define DELAYBOX 3 #define BCBOX 4 #define BOXEVENT (ButtonPressMask |\ KeyPressMask |\ ExposureMask |\ StructureNotifyMask |\ LeaveWindowMask |\ EnterWindowMask) #define BOXDONE -2 #define EDIT_WAIT 0 #define EDIT_NEXT 1 #define EDIT_ESC 2 #define EDIT_DONE 3 extern char cur_dir[]; FILESEL filesel; extern FILEINFO my_ff; extern int NUPAR,NODE,NEQ,NMarkov; extern char upar_names[MAXPAR][11],uvar_names[MAXODE][12]; extern char delay_string[MAXODE][80]; extern double default_val[MAXPAR]; extern double last_ic[MAXODE]; extern double default_ic[MAXODE]; PAR_SLIDER my_par_slide[3]; extern BC_STRUCT my_bc[MAXODE]; Window make_window(); BoxList *HotBox; int HotBoxItem=-1; BoxList ICBox; BoxList ParamBox; BoxList DelayBox; BoxList BCBox; int BoxMode; double atof(); extern char this_file[100]; #define SB_DIM 5 #define SB_SPC 2 /* scroll-list gadget */ void create_scroll_list(Window base,int x,int y,int width, int height,SCROLL_LIST *sl) { int tst=(DCURYs+3)+2*(SB_DIM+SB_SPC); if(heightn=0; sl->n0=0; sl->pos=0; sl->v=NULL; sl->twid=width; sl->text=make_window(base,x,y,width,height,1); sl->up=make_window(base,x+width+SB_SPC,y,SB_DIM,SB_DIM,1); sl->side=make_window(base,x+width+SB_SPC,y+SB_DIM+SB_SPC, SB_DIM,height-2*(SB_DIM+SB_SPC),1); sl->down=make_window(base,x+width+SB_SPC,y+height-2*SB_DIM-SB_SPC, SB_DIM,SB_DIM,1); sl->npos=height-2*(SB_DIM+SB_SPC); sl->max=height/(DCURYs+3); } void free_scroll_list(SCROLL_LIST *sl) { int n=sl->n; int i; for(i=0;iv[i]); free(sl->v); sl->v=NULL; sl->n=0; } void add_scroll_item(char *v,SCROLL_LIST *sl) { int n=sl->n; int m=strlen(v); sl->v=(char **)realloc((void *)sl->v,(n+1)*sizeof(char *)); sl->v[n]=(char *)malloc((m+1)); strcpy(sl->v[n],v); sl->n=n+1; } int expose_scroll_list(Window w,SCROLL_LIST sl) { int i; if(w==sl.up){ XClearWindow(display,w); XDrawLine(display,w,small_gc,0,SB_DIM,SB_DIM/2,0); XDrawLine(display,w,small_gc,SB_DIM,SB_DIM,SB_DIM/2,0); return 1; } if(w==sl.down){ XClearWindow(display,w); XDrawLine(display,w,small_gc,0,0,SB_DIM/2,SB_DIM); XDrawLine(display,w,small_gc,SB_DIM,0,SB_DIM/2,SB_DIM); return 1; } if(w==sl.side){ XClearWindow(display,w); for(i=0;i<4;i++) XDrawLine(display,w,small_gc,0,sl.npos+i,SB_DIM,sl.npos+i); return 1; } if(w==sl.text){ redraw_scroll_list(sl); return 1; } return(0); } void redraw_scroll_list(SCROLL_LIST sl) { int i,n=sl.n,j; int y; if(n==0)return; /* nothing there */ XClearWindow(display,sl.text); for(i=0;i\n\n extern double constants[]; \n"); plintf("main(argc,argv)\n char **argv; \n int argc;\n{\n do_main(argc,argv);\n }\n"); plintf("/* defines for %s */ \n",this_file); for(i=0;i0){ fprintf(fp,"par "); for(i=0;igo&&p->use==1) run_now(); if(w!=p->top)return; strcpy(values[0],p->parname); sprintf(values[1],"%.16g",p->val); sprintf(values[2],"%.16g",p->lo); sprintf(values[3],"%.16g",p->hi); status=do_string_box(4,4,1,"Set Sliders",n,values,35); if(status==0)return; if(strlen(values[0])==0){ /* empty string cancels */ p->use=0; return; } status=find_user_name(PARAMBOX,values[0]); if(status==-1){ status=find_user_name(ICBOX,values[0]); if(status==-1){ err_msg("Not a parameter or variable !"); return; } p->type=ICBOX; p->index=status; } else { p->type=PARAMBOX; p->index=status; } lo=atof(values[2]); hi=atof(values[3]); val=atof(values[1]); if(valhi||hi<=lo){ err_msg(" low <= value <= high "); return; } p->val=val; p->hi=hi; p->lo=lo; strcpy(p->parname,values[0]); set_val(p->parname,val); if(p->type==ICBOX) last_ic[p->index]=val; redraw_params(); redraw_ics(); p->use=1; set_slide_pos(p); redraw_slide(p); } void expose_selector(w) Window w; { display_file_sel(filesel,w); } /* this is rather lazy and slow but hey it works */ void redraw_directory() { XClearWindow(display,filesel.dir); expose_selector(filesel.dir); } void redraw_file_list() { int i; for(i=0;i=f.n)XDrawString(display,w,small_gc,5,CURY_OFFs," ",1); else { if(i0%s",my_ff.dirnames[i0]); else sprintf(t,"%s",my_ff.filenames[i0-my_ff.ndirs]); XDrawString(display,w,small_gc,5,CURY_OFFs,t,strlen(t)); } } } } void new_wild() { free_finfo(&my_ff); /* delete the old file info */ filesel.n0=0; /* back to the top of the list */ get_fileinfo(filesel.wildtxt,cur_dir,&my_ff); filesel.n=my_ff.ndirs+my_ff.nfiles; redraw_file_list(); XFlush(display); } void fs_scroll(i) int i; { int n0=filesel.n0; int new,nend; int nw=filesel.nwin,n=filesel.n; if(n<=nw)return; new=n0-i; nend=new+nw; if(new<0)new=0; if(nend>n)new=n-nw; filesel.n0=new; redraw_file_list(); } int button_selector(w) Window w; { int i,i0; int k,n=filesel.n; if(w==filesel.ok)return 1; if(w==filesel.cancel)return 2; if(w==filesel.up)fs_scroll(1); if(w==filesel.dn)fs_scroll(-1); if(w==filesel.pgup)fs_scroll(filesel.nwin); if(w==filesel.pgdn)fs_scroll(-filesel.nwin); if(w==filesel.file) { /* selected the file text */ if(filesel.hot!=HOTFILE)filesel.pos=strlen(filesel.filetxt); filesel.hot=HOTFILE; redraw_fs_text(filesel.filetxt,filesel.file,1); redraw_fs_text(filesel.wildtxt,filesel.wild,0); /* set up text stuff */ return 0; } if(w==filesel.wild){ if(filesel.hot!=HOTWILD)filesel.pos=strlen(filesel.wildtxt); filesel.hot=HOTWILD; redraw_fs_text(filesel.filetxt,filesel.file,0); redraw_fs_text(filesel.wildtxt,filesel.wild,1); return 0; } i0=-1; for(i=0;i-1){ /* clicked on a file or directory */ k=i0+filesel.n0; if(k0){ pos--; wpos--; if(wpos<0){ off=off-4; if(off<0)off=0; wpos=pos-off; } } else ping(); break; case RIGHT: if(posmc){ off=off+4; if(off+mc>l) off=l-mc; wpos=pos-off; } } else ping(); break; case HOME: pos=0; wpos=0; break; case END: pos=l; wpos=mc; break; case BADKEY: return 0; case DOWN: fs_scroll(-1); return 0; case UP: fs_scroll(1); return 0; case PGUP: fs_scroll(filesel.nwin); return 0; case PGDN: fs_scroll(-filesel.nwin); return 0; /* junk key */ case ESC: return EDIT_ESC; case FINE: return EDIT_DONE; case BKSP: /* if(pos0){ memmov(&string[pos-1],&string[pos],l-pos+1); pos--; wpos--; if(wpos<0){ off=off-4; if(off<0)off=0; wpos=pos-off; } l--; } else ping(); break; case TAB:/*TAB completion of file names */ { struct dirent *dp; char ft[100]; char ftpath[100]; /*User may have typed ahead (maybe they remember the path they want)"*/ /*Try to change to that new directory if it is one.*/ if ((dp=(struct dirent*)opendir(filesel.filetxt))!=NULL) { if (strcmp(cur_dir,filesel.filetxt)!=0) { change_directory(filesel.filetxt); get_directory(cur_dir); redraw_directory(); free_finfo(&my_ff); /* delete the old file info */ filesel.n0=0; /* back to the top of the list */ get_fileinfo(filesel.wildtxt,cur_dir,&my_ff); filesel.n=my_ff.ndirs+my_ff.nfiles; strcpy(filesel.filetxt,cur_dir); int m = strlen(filesel.filetxt); if (filesel.filetxt[m-1] != '/') { strcat(filesel.filetxt,"/"); } redraw_fs_text(filesel.filetxt,filesel.file,1); redraw_file_list(); XFlush(display); } return(EDIT_WAIT); /*Wait for further instruction...*/ } int m=strlen(filesel.filetxt)+1; strcpy(ft,filesel.filetxt); while ((dp=(struct dirent*)opendir(ft))==NULL) { /*This WHILE is perhaps a bit clunky but since we can't be sure of path separator user will type in the box a trial-by-error approach may be more robust.*/ ft[m] = '\0'; m--; if ((ft[m] != '/') & (ft[m] != '\\')) { ft[m] = '\0'; m--; } if (m==0) { break; } } int n=0; ft[0] = '\0'; if (m> strlen(filesel.filetxt)) { return(EDIT_WAIT); } for (n=0;n 1) /*Expand the file text to most generic currently represented*/ { int j=0; char U[256]; if (my_ff.ndirs > 0) { strcpy(U,my_ff.dirnames[0]); } else { strcpy(U,my_ff.filenames[0]); } for (j=0;j=' ') && (ch <= '~')){ if(strlen(string)>=256) ping(); else { movmem(&string[pos+1],&string[pos],l-pos+1); string[pos]=ch; pos=pos+1; wpos++; l++; if(wpos>mc){ off=off+4; if(off+mc>l) off=l-mc; wpos=pos-off; } } } break; } /* all done lets save everything */ off=pos-wpos; *off1=off; *pos1=pos; XClearWindow(display,w); XDrawString(display,w,small_gc,0,CURY_OFF,string+off,strlen(string)-off); cp=DCURXs*(pos-off); put_edit_cursor(w,cp); return 0; } int selector_key(ev) XEvent ev; { char ch; int flag; /* plintf(" hot=%d pos=%d \n",filesel.hot,filesel.pos); */ ch=get_key_press(&ev); switch(filesel.hot){ case HOTFILE: flag=edit_fitem(ch,filesel.filetxt,filesel.file, &(filesel.off),&(filesel.pos),29); if(flag==EDIT_DONE)return 1; if(flag==EDIT_ESC) return 2; return(0); case HOTWILD: flag=edit_fitem(ch,filesel.wildtxt,filesel.wild, &(filesel.off),&(filesel.pos),29); if(flag==EDIT_DONE){ new_wild(); return 0; } if(flag==EDIT_ESC)return 2; return 0; } return 0; } void destroy_selector() { filesel.here=0; XDestroySubwindows(display,filesel.base); XDestroyWindow(display,filesel.base); free_finfo(&my_ff); } int file_selector(title,file,wild) char *title; char *wild,*file; { int i; if(!get_directory(cur_dir)) return 0; if(!get_fileinfo(wild,cur_dir,&my_ff)) return 0; create_file_selector(title,file,wild); i=do_file_select_events(); destroy_selector(); XFlush(display);/*Need to do this otherwise the file dialog hangs around*/ if(i==0)return 0; /* plintf(" Got a file: %s \n",filesel.filetxt); */ strcpy(file,filesel.filetxt); return 1; /* got a file name */ } void reset_sliders() { int i; double val; PAR_SLIDER *p; for(i=0;i<3;i++){ p=&my_par_slide[i]; if(p->use){ if(p->type==ICBOX) val=last_ic[p->index]; else get_val(p->parname,&val); p->val=val; set_slide_pos(p); expose_slider(p->slide,p); expose_slider(p->top,p); } } } void redraw_slide(p) PAR_SLIDER *p; { expose_slider(p->slide,p); expose_slider(p->top,p); expose_slider(p->left,p); expose_slider(p->right,p); } void set_slide_pos(p) PAR_SLIDER *p; { double pos; int ip; pos=2. + (p->l-4)*(p->val-p->lo)/(p->hi-p->lo); ip=(int)pos; if(ip<2)ip=2; if(ip>(p->l-2))ip=p->l-2; p->pos=ip; } void slide_release(w) Window w; { int i; for(i=0;i<3;i++) do_slide_release(w,&my_par_slide[i]); } void do_slide_release(w,p) int w; PAR_SLIDER *p; { if(p->use==0)return; if(p->slide==w){ set_val(p->parname,p->val); if(p->type==ICBOX) last_ic[p->index]=p->val; redraw_ics(); redraw_params(); } } void slider_motion(ev) XEvent ev; { int x,i; Window w; w=ev.xmotion.window; x=ev.xmotion.x; /* printf(" state=%d\n",ev.xmotion.state); */ for(i=0;i<3;i++) do_slide_motion(w,x,&my_par_slide[i],ev.xmotion.state); } void do_slide_motion(w,x,p,s) PAR_SLIDER *p; Window w; int x,s; { if(w==p->slide){ p->pos=x; if(x<2) p->pos=2; if(x>(p->l-2)) p->pos=p->l-2; expose_slider(p->slide,p); if(p->use){ p->val=p->lo+ (p->hi-p->lo)*(double)(p->pos-2)/(double)(p->l-4); expose_slider(p->top,p); set_val(p->parname,p->val); if(p->type==ICBOX) last_ic[p->index]=p->val; if(s<300) {clear_draw_window(); create_new_cline(); redraw_dfield(); run_now();} } } } void enter_slides(w,val) Window w; int val; { int i; for(i=0;i<3;i++) enter_slider(w,&my_par_slide[i],val); } void enter_slider(w,p,val) Window w; int val; PAR_SLIDER *p; { if(w==p->top||w==p->go) XSetWindowBorderWidth(display,w,val+1); } void expose_slides(w) Window w; { int i; for(i=0;i<3;i++) expose_slider(w,&my_par_slide[i]); } void expose_slider(w,p) PAR_SLIDER *p; Window w; { int x,len=12*DCURXs; char top[256]; if(w==p->slide){draw_slider(w,p->pos,p->hgt,p->l);return;} if(w==p->go){ XDrawString(display,w,small_gc,2,0.75*CURY_OFFs,"go",2); return; } if(p->use){ if(w==p->left){ sprintf(top,"%.16g",p->lo); x=1; XClearWindow(display,w); XDrawString(display,w,small_gc,x,CURY_OFFs,top,strlen(top)); return; } if(w==p->right){ sprintf(top,"%.16g",p->hi); x=1; if(strlen(top)<12) x=len-DCURXs*strlen(top)-1; XClearWindow(display,w); XDrawString(display,w,small_gc,x,CURY_OFFs,top,strlen(top)); return; } if(w==p->top){ sprintf(top,"%s=%.16g",p->parname,p->val); XClearWindow(display,w); XDrawString(display,w,small_gc,2,CURY_OFFs,top,strlen(top)); } } else { if(w==p->top){ sprintf(top,"Par/Var?"); x=1; XClearWindow(display,w); XDrawString(display,w,small_gc,x,CURY_OFFs,top,strlen(top)); } } } void draw_slider(w,x,hgt,l) int x,hgt,l; Window w; { int x0=x-2,i; if(x0<0)x0=0; if(x0>(l-4))x0=l-4; XClearWindow(display,w); for(i=0;i<4;i++) XDrawLine(display,w,small_gc,x0+i,0,x0+i,hgt); } void make_par_slider(base,x,y,width,index) Window base; int x,y,width,index; { int mainhgt=3*(DCURYs+2); int mainwid=32*DCURXs; int xs; Window w; if(mainwid<(width+4))mainwid=width+4; w=make_plain_window(base,x,y,mainwid,mainhgt,1); my_par_slide[index].main=w; xs=(mainwid-width-4)/2; my_par_slide[index].slide=make_window(w,xs,DCURYs+5,width+4,DCURYs-4,1); my_par_slide[index].go=make_window(w,xs+width+8,DCURYs+5,3*DCURXs,DCURYs-3,1); my_par_slide[index].top=make_window(w,2,2,mainwid-6,DCURYs,1); my_par_slide[index].left=make_window(w,2,2*DCURYs+3,12*DCURXs,DCURYs,0); my_par_slide[index].right=make_window(w,mainwid-12*DCURXs-4,2*DCURYs+3, 12*DCURXs,DCURYs,0); my_par_slide[index].lo=0.0; my_par_slide[index].hi=1.0; my_par_slide[index].val=0.5; my_par_slide[index].use=0; my_par_slide[index].l=width+4; my_par_slide[index].pos=(width+4)/2; my_par_slide[index].parname[0]=0; my_par_slide[index].hgt=DCURYs-4; } /* The rest of the code is good | V */ void make_new_ic_box() { if(ICBox.xuse){ XRaiseWindow(display,ICBox.base); return; } make_box_list_window(&ICBox,ICBOX); make_icon((char*)ic_bits,ic_width,ic_height,ICBox.base); } void make_new_bc_box() { if(BCBox.xuse){ XRaiseWindow(display,BCBox.base); return; } make_box_list_window(&BCBox,BCBOX); make_icon((char*)bc_bits,bc_width,bc_height,BCBox.base); } void make_new_delay_box() { if(DelayBox.use==0)return; if( DelayBox.xuse==1){ XRaiseWindow(display,DelayBox.base); return; } make_box_list_window(&DelayBox,DELAYBOX); make_icon((char*)delay_bits,delay_width,delay_height,DelayBox.base); } void make_new_param_box() { if(ParamBox.use==0)return; if(ParamBox.xuse==1){ XRaiseWindow(display,ParamBox.base); return; } make_box_list_window(&ParamBox,PARAMBOX); make_icon((char*)param_bits,param_width,param_height,ParamBox.base); } void initialize_box() { make_box_list(&ICBox,"Initial Data","ICs",NODE+NMarkov,ICBOX,1); if(NUPAR>0) make_box_list(&ParamBox,"Parameters","Par",NUPAR,PARAMBOX,1); else ParamBox.use=0; if(NDELAYS>0) make_box_list(&DelayBox,"Delay ICs","Delay", NODE,DELAYBOX,1); else DelayBox.use=0; make_box_list(&BCBox,"Boundary Conds","BCs",NODE,BCBOX,1); /* Iconify them !! */ /* if(noicon==0){ if(ICBox.xuse)XIconifyWindow(display,ICBox.base,screen); if(DelayBox.xuse) XIconifyWindow(display,DelayBox.base,screen); if(ParamBox.xuse) XIconifyWindow(display,ParamBox.base,screen); if(BCBox.xuse)XIconifyWindow(display,BCBox.base,screen); } */ } void resize_par_box(win) Window win; { unsigned int h,w; int nwin; int ok=0; BoxList *b; if(ICBox.xuse==1&&win==ICBox.base){ ok=1; b=&ICBox; get_new_size(win,&w,&h); get_nrow_from_hgt(h,&nwin,(int*)&w); } if(ParamBox.xuse==1&&win==ParamBox.base){ ok=2; b=&ParamBox; get_new_size(win,&w,&h); get_nrow_from_hgt(h,&nwin,(int*)&w); } if(BCBox.xuse==1&&win==BCBox.base){ ok=3; b=&BCBox; get_new_size(win,&w,&h); get_nrow_from_hgt(h,&nwin,(int*)&w); } if(DelayBox.xuse==1&&win==DelayBox.base){ ok=4; b=&DelayBox; get_new_size(win,&w,&h); get_nrow_from_hgt(h,&nwin,(int*)&w); } if(ok==0)return; if(nwin>b->n)nwin=b->n; if(nwin==b->nwin)return; b->nwin=nwin; switch(ok) { case 1: destroy_box(&ICBox); make_new_ic_box(); break; case 2: destroy_box(&ParamBox); make_new_param_box(); break; case 3: destroy_box(&BCBox); make_new_bc_box(); break; case 4: destroy_box(&DelayBox); make_new_delay_box(); break; } } /* this returns the fixed width, the number of entries allowed */ void get_nrow_from_hgt(h,n,w) int h; int *n; int *w; { int hgt=DCURYs+4; *w=28*DCURXs; *n= h/(hgt+4)-3; } void destroy_box(BoxList *b) { /*int n,nrow; */ if(b->xuse==0)return; b->xuse=0; XFlush(display); XSetInputFocus(display,main_win,RevertToParent,CurrentTime); if(b->use==0)return; XDestroySubwindows(display,b->base); XDestroyWindow(display,b->base); /*n=b->n; nrow=b->nwin; */ /* now free up stuff */ free(b->w); free(b->we); if(b->type==ICBOX){ free(b->ck); free(b->isck); } XFlush(display); } void make_box_list_window(BoxList *b,int type) { int nrow,n; int x,y; int xb1,xb2,xb3,xb4; int i,wid1,wid2; int width,height,wid,hgt; Window base; XTextProperty winname,iconame; XSizeHints size_hints; n=b->n; nrow=b->nwin; wid1=16*DCURXs; wid2=22*DCURXs; wid=wid1+wid2+DCURXs; hgt=DCURYs+4; height=(nrow+2)*(hgt+4)+2*hgt; width=wid+8*DCURXs; b->minwid=width; b->minhgt=height; base=make_plain_window(RootWindow(display,screen),0,0,width,height,4); b->base=base; XStringListToTextProperty(&b->wname,1,&winname); XStringListToTextProperty(&b->iname,1,&iconame); size_hints.flags=PPosition|PSize|PMinSize; size_hints.x=0; size_hints.y=0; size_hints.width=width; size_hints.height=height; size_hints.min_width=width; size_hints.min_height=height; size_hints.max_width=width; size_hints.max_height=height; XClassHint class_hints; class_hints.res_name=""; class_hints.res_class=""; XSetWMProperties(display,base,&winname,&iconame,NULL,0,&size_hints,NULL,&class_hints); b->w = (Window *)malloc(nrow*sizeof(Window)); b->we = (Window *)malloc(nrow*sizeof(Window)); if(type==ICBOX){ b->ck=(Window *)malloc(nrow*sizeof(Window)); b->isck=(int *)malloc(n*sizeof(int)); for(i=0;iisck[i]=0; } /* xb1=(width-19*DCURXs)/2; */ xb1 = 2+7*DCURXs+14; /* xb2=xb1+4*DCURXs; xb3=xb2+9*DCURXs; xb4=xb3+8*DCURXs; */ xb2=xb1+7*DCURXs+14; xb3=xb2+7*DCURXs+14; xb4=xb3+7*DCURXs+14; /* b->close=make_window(base,2,5,5*DCURXs,DCURYs,1); b->ok=make_window(base,xb1,5,2*DCURXs,DCURYs,1); b->def=make_window(base,xb2,5,7*DCURXs,DCURYs,1); b->cancel=make_window(base,xb3,5,6*DCURXs,DCURYs,1); b->go=make_window(base,xb4,5,2*DCURXs,DCURYs,1); */ b->close=make_window(base,2,5,7*DCURXs+10,DCURYs,1); b->ok=make_window(base,xb1,5,7*DCURXs+10,DCURYs,1); b->def=make_window(base,xb2,5,7*DCURXs+10,DCURYs,1); b->cancel=make_window(base,xb3,5,7*DCURXs+10,DCURYs,1); b->go=make_window(base,xb4,5,7*DCURXs+10,DCURYs,1); xb1=DCURXs+wid1+wid2+12; b->up=make_window(base,xb1,2*DCURYs,3*DCURXs,DCURYs,1); b->dn=make_window(base,xb1,2*DCURYs+DCURYs+4,3*DCURXs,DCURYs,1); b->pgup=make_window(base,xb1,2*DCURYs+2*DCURYs+8,3*DCURXs,DCURYs,1); b->pgdn=make_window(base,xb1,2*DCURYs+3*DCURYs+12,3*DCURXs,DCURYs,1); for(i=0;iw[i]=make_plain_window(base,x,y,wid1,hgt,0); b->we[i]=make_plain_window(base,x+wid1+2,y,wid2,hgt,1); XSelectInput(display,b->w[i],BOXEVENT); if(type==ICBOX){ b->ck[i]=make_plain_window(base,1,y,6,DCURYs,1); } } y=DCURYs+(hgt+4)*nrow+1.5*hgt; x=(width-24)/3; if(type==ICBOX){ b->xvt=make_window(base,x,y,5*DCURXs,DCURYs,1); b->pp=make_window(base,x+6*DCURXs,y,5*DCURXs,DCURYs,1); b->arr=make_window(base,x+12*DCURXs,y,5*DCURXs,DCURYs,1); } b->xuse=1; } void make_box_list(b,wname,iname,n,type,use) BoxList *b; char *wname,*iname; int n,type,use; { int nrow,i; char sss[256]; double z; nrow=10; if(n<10)nrow=n; b->xuse=0; b->use=use; b->mc=21; b->type=type; b->n=n; b->n0=0; b->nwin=nrow; b->value=(char **)malloc(n*sizeof(char*)); b->pos=(int *)malloc(n*sizeof(int)); b->off=(int *)malloc(n*sizeof(int)); b->iname=(char *)malloc(strlen(iname)+5); strcpy(b->iname,iname); b->wname=(char *)malloc(strlen(wname)+5); strcpy(b->wname,wname); for(i=0;ivalue[i]=(char *)malloc(256); switch(type){ case PARAMBOX: get_val(upar_names[i],&z); sprintf(sss,"%.16g",z); set_edit_params(b,i,sss); break; case ICBOX: sprintf(sss,"%.16g",last_ic[i]); set_edit_params(b,i,sss); break; case BCBOX: set_edit_params(b,i,my_bc[i].string); break; case DELAYBOX: set_edit_params(b,i,delay_string[i]); break; } } } /* this is added to take care of making sure exposure of the boxes is easily taken care of */ void do_box_expose(w) Window w; { if(ICBox.xuse)display_box(ICBox,w); if(BCBox.xuse)display_box(BCBox,w); if(ParamBox.xuse)display_box(ParamBox,w); if(DelayBox.xuse)display_box(DelayBox,w); } void justify_string(w1,s1) Window w1; char *s1; { int n1=strlen(s1)*DCURXs,nt=10*DCURXs; int i=0; if(n1n1)return; /* don't draw the ones out of range*/ i=index-n0; w=b.w[i]; we=b.we[i]; switch(b.type){ case PARAMBOX: draw_editable(we,b.value[index], b.off[index],b.pos[index],b.mc); justify_string(w,upar_names[index]); break; case BCBOX: justify_string(w,my_bc[index].name); draw_editable(we,b.value[index],b.off[index], b.pos[index],b.mc); break; case ICBOX: draw_editable(we,b.value[index],b.off[index], b.pos[index],b.mc); justify_string(w,uvar_names[index]); break; case DELAYBOX: justify_string(w,uvar_names[index]); draw_editable(we,b.value[index],b.off[index], b.pos[index],b.mc); break; } } void redraw_params() { int i; double z; evaluate_derived(); if(ParamBox.use) for(i=0;i=n0&&index0) graph_all(plot_list,n,0); } void set_up_pp() { int i; int plot_list[3],n=0; for(i=0;i1) graph_all(plot_list,n,1); } void set_up_arry() { int i; int plot_list[2],n=0; for(i=0;ixuse==0)return; switch(b->type){ case PARAMBOX: redraw_params(); return; case BCBOX: redraw_bcs(); return; case ICBOX: redraw_ics(); return; case DELAYBOX: redraw_delays(); return; } } void do_box_button(b,w) BoxList *b; Window w; { int i,n=b->nwin; if(b->xuse==0)return; if(w==b->close) destroy_box(b); if(w==b->ok||w==b->go) load_entire_box(b); if(w==b->cancel) redraw_entire_box(b); if(w==b->go) run_now(); if(w==b->def&&b->type==PARAMBOX) set_default_params(); if(w==b->def&&b->type==ICBOX) set_default_ics(); /* now for the "scrolling" */ if(w==b->up)box_list_scroll(b,1); if(w==b->pgup)box_list_scroll(b,b->nwin); if(w==b->dn)box_list_scroll(b,-1); if(w==b->pgdn)box_list_scroll(b,-b->nwin); for(i=0;iwe[i]){ XSetInputFocus(display,w,RevertToParent,CurrentTime); check_box_cursor(); HotBoxItem=i; HotBox=b; draw_editable(w,b->value[i+b->n0],b->off[i+b->n0],b->pos[i+b->n0],b->mc); } } if(b->type==ICBOX){ for(i=0;inwin;i++){ if(w==b->ck[i]){ b->isck[i+b->n0]=1-b->isck[i+b->n0]; if(b->isck[i+b->n0]) XDrawString(display,w,small_gc,0,CURY_OFFs,"*",1); else XClearWindow(display,w); } } if(w==b->xvt){ set_up_xvt(); } if(w==b->pp){ set_up_pp(); } if(w==b->arr){ set_up_arry(); } } } void box_list_scroll(b,i) BoxList *b; int i; { int n0=b->n0; int new; int nw=b->nwin,n=b->n; int nend; if(n<=nw)return; /* do nothing - there is nothing to do */ new=n0-i; nend=new+nw; if(new<0)new=0; if(nend>n)new=n-nw; b->n0=new; switch(b->type){ case PARAMBOX: load_entire_box(b); redraw_params(); reset_sliders(); break; case BCBOX: load_entire_box(b); redraw_bcs(); break; case ICBOX: load_entire_box(b); redraw_ics(); reset_sliders(); break; case DELAYBOX: load_entire_box(b); redraw_delays(); break; } } void box_buttons(w) Window w; { if(ICBox.xuse)do_box_button(&ICBox,w); if(BCBox.xuse)do_box_button(&BCBox,w); if(DelayBox.xuse)do_box_button(&DelayBox,w); if(ParamBox.xuse)do_box_button(&ParamBox,w); } void box_keypress(ev,used) XEvent ev; int *used; { if(ICBox.xuse){do_box_key(&ICBox,ev,used);if(*used)return;} if(BCBox.xuse){do_box_key(&BCBox,ev,used);if(*used)return;} if(DelayBox.xuse){do_box_key(&DelayBox,ev,used);if(*used)return;} if(ParamBox.xuse){do_box_key(&ParamBox,ev,used);if(*used)return;} } void do_box_key(b,ev,used) int *used; BoxList *b; XEvent ev; { Window w=ev.xkey.window; char ch; Window focus; int rev,n=b->nwin,i,j,flag; *used=0; if(b->xuse==0)return; for(i=0;iwe[i]==w){ XGetInputFocus(display,&focus,&rev); if(w==focus){ *used=1; ch=get_key_press(&ev); flag=edit_bitem(b,i,ch); if(flag==EDIT_NEXT&&n>1){ j=i+1; if(j==n)j=0; XSetInputFocus(display,b->we[j],RevertToParent,CurrentTime); set_value_from_box(b,i); HotBoxItem=j; draw_editable(b->we[i],b->value[i+b->n0], b->off[i+b->n0],b->pos[i+b->n0],b->mc); draw_editable(b->we[j],b->value[j+b->n0], b->off[j+b->n0],b->pos[j+b->n0],b->mc); if(b->type==PARAMBOX||b->type==ICBOX)reset_sliders(); } if(flag==EDIT_DONE){ HotBoxItem=-1; XSetInputFocus(display,main_win,RevertToParent,CurrentTime); load_entire_box(b); } if(flag==EDIT_ESC){ HotBoxItem=-1; XSetInputFocus(display,main_win,RevertToParent,CurrentTime); } } } } } void man_ic() { int done,index=0; double z; char name[256],junk[256]; while(1){ sprintf(name,"%s :",uvar_names[index]); z=last_ic[index]; done=new_float(name,&z); if(done==0){ last_ic[index]=z; sprintf(junk,"%.16g",z); set_edit_params(&ICBox,index,junk); draw_one_box(ICBox,index); index++; if(index>=NODE+NMarkov)return; } if(done==-1)return; } } void new_parameter() { int done,index; double z; char name[256],value[256],junk[256]; while(1){ name[0]=0; done=new_string("Parameter:",name); if(strlen(name)==0||done==0){redo_stuff(); return;} if(strncasecmp(name,"DEFAULT",7 )==0){ set_default_params(); continue; } if(strncasecmp(name,"!LOAD", 5 )==0){ io_parameter_file(name,READEM); continue; } if(strncasecmp(name,"!SAVE", 5 )==0){ io_parameter_file(name,WRITEM); continue; } else { index=find_user_name(PARAMBOX,name); if(index>=0){ get_val(upar_names[index],&z); sprintf(value,"%s :",name); done=new_float(value,&z); if(done==0){ set_val(upar_names[index],z); sprintf(junk,"%.16g",z); set_edit_params(&ParamBox,index,junk); draw_one_box(ParamBox,index); reset_sliders(); } if(done==-1){ redo_stuff(); return; } } } } } void redo_stuff() { evaluate_derived(); re_evaluate_kernels(); redo_all_fun_tables(); evaluate_derived(); } void set_default_ics() { int i; for(i=0;imc)l=mc; XClearWindow(display,win); XDrawString(display,win,small_gc,0,CURY_OFF,string+off,l); XGetInputFocus(display,&focus,&rev); if(focus==win){ cp=DCURXs*(cursor-off); /* must be fixed */ put_edit_cursor(win,cp); } } void put_edit_cursor(w,pos) Window w; int pos; { int x1=pos; int x2=x1+1; XDrawLine(display,w,small_gc,x1,1,x1,DCURYs-1); XDrawLine(display,w,small_gc,x2,1,x2,DCURYs-1); } int edit_bitem(b,i,ch) int i; BoxList *b; char ch; { Window win=b->we[i]; int i0=i+b->n0; char *string=b->value[i0]; int off=b->off[i0]; int pos=b->pos[i0]; int mc=b->mc; int l=strlen(string),wpos=pos-off; switch(ch){ case LEFT: if(pos>0){ pos--; wpos--; if(wpos<0){ off=off-4; if(off<0)off=0; wpos=pos-off; } } else ping(); break; case RIGHT: if(posmc){ off=off+4; if(off+mc>l) off=l-mc; wpos=pos-off; } } else ping(); break; case HOME: pos=0; wpos=0; break; case END: pos=l; wpos=mc; break; case BADKEY: return 0; case DOWN: box_list_scroll(b,-1); return 0; case UP: box_list_scroll(b,1); return 0; case PGUP: box_list_scroll(b,b->nwin); return 0; case PGDN: box_list_scroll(b,-b->nwin); return 0; /* junk key */ case ESC: return EDIT_ESC; case FINE: return EDIT_NEXT; case BKSP: /* if(pos0){ memmov(&string[pos-1],&string[pos],l-pos+1); pos--; wpos--; if(wpos<0){ off=off-4; if(off<0)off=0; wpos=pos-off; } l--; } else ping(); break; case TAB: return EDIT_DONE; default: if( (ch>=' ') && (ch <= '~')){ if(strlen(string)>=256) ping(); else { movmem(&string[pos+1],&string[pos],l-pos+1); string[pos]=ch; pos=pos+1; wpos++; l++; if(wpos>mc){ off=off+4; if(off+mc>l) off=l-mc; wpos=pos-off; } } } break; } /* all done lets save everything */ off=pos-wpos; b->off[i0]=off; b->pos[i0]=pos; draw_editable(win,string,off,pos,mc); return 0; } void add_edit_float(b,i,z) double z; int i; BoxList *b; { char junk[256]; sprintf(junk,"%.16g",z); add_editval(b,i,junk); } void set_edit_params(b,i,string) BoxList *b; int i; char *string; { int l=strlen(string); strcpy(b->value[i],string); b->off[i]=0; if(l>b->mc) b->pos[i]=b->mc; else b->pos[i]=l; } void add_editval(b,i,string) BoxList *b; int i; char *string; { int n0=b->n0,n1=b->n0+b->nwin-1; int iw; set_edit_params(b,i,string); if(in1)return; iw=i-n0; if(b->xuse) draw_editable(b->we[iw],string,b->off[i],b->pos[i],b->mc); } void check_box_cursor() { int n0; if(HotBoxItem<0||HotBox->xuse==0)return; n0=HotBox->n0; draw_editable(HotBox->we[HotBoxItem],HotBox->value[HotBoxItem+n0], HotBox->off[HotBoxItem],HotBox->pos[HotBoxItem], HotBox->mc); HotBoxItem=-1; } void prt_focus() { Window focus; int rev; XGetInputFocus(display,&focus,&rev); plintf(" focus=%d\n",focus); } int to_float(s,z) char *s; double *z; { int flag; *z=0.0; if(s[0]=='%') { flag=do_calc(&s[1],z); if(flag==-1)return -1; return 0; } *z=atof(s); return(0); } void set_value_from_box(b,i) BoxList *b; int i; { char *s; double z; s=b->value[i]; switch(b->type){ case ICBOX: if(to_float(s,&z)==-1)return; last_ic[i]=z; add_edit_float(b,i,z); break; case PARAMBOX: if(to_float(s,&z)==-1)return; set_val(upar_names[i],z); add_edit_float(b,i,z); break; case BCBOX: strcpy(my_bc[i].string,s); add_editval(b,i,s); break; case DELAYBOX: strcpy(delay_string[i],s); add_editval(b,i,s); break; } } void load_entire_box(b) BoxList *b; { int i,n=b->n; for(i=0;itype==PARAMBOX){ re_evaluate_kernels(); redo_all_fun_tables(); reset_sliders(); } if(b->type==DELAYBOX){ do_init_delay(DELAY); } } browse.c0000644000175000017500000007033711633745054012433 0ustar dumzdejdumzdej#include "browse.h" #include #include #include "parserslow.h" #include #include "ggets.h" #include "dialog_box.h" #include "eig_list.h" #include "integrate.h" #include "menudrive.h" #include "init_conds.h" #include "many_pops.h" #include "pop_list.h" #include #include #include #include #include #include #include #include #include #ifndef WCTYPE #include #else #include #endif #include "xpplim.h" #include "browse.bitmap" #include "newhome.h" #include "mykeydef.h" extern char *browse_hint[]; #define xds(a) { XDrawString(display,w,small_gc,5,CURY_OFFs,a,strlen(a));\ return;} #define BMAXCOL 20 extern SYMBOL my_symb[MAX_SYMBS]; extern int *my_ode[]; extern int *plotlist,N_plist; char *ode_names[MAXODE]; double evaluate(); double atof(); extern int NEQ,MAXSTOR,NMarkov,FIX_VAR; extern int NEQ_MIN; extern int NODE,NJMP; extern int Xup,TipsFlag; extern double last_ic[MAXODE],DELTA_T; extern int NSYM,NSYM_START,NCON,NCON_START; extern Display *display; extern int screen,storind; extern GC gc, small_gc; extern int DCURX,DCURXs,DCURY,DCURYs,CURY_OFFs,CURY_OFF; extern unsigned int MyBackColor,MyForeColor,MyMainWinColor,MyDrawWinColor,GrFore,GrBack; extern Window command_pop; #define MYMASK (ButtonPressMask |\ ButtonReleaseMask |\ KeyPressMask |\ ExposureMask |\ StructureNotifyMask |\ LeaveWindowMask |\ EnterWindowMask) #define SIMPMASK (ButtonPressMask |\ ButtonReleaseMask |\ KeyPressMask |\ ExposureMask |\ StructureNotifyMask) /* The one and only primitive data browser */ /*typedef struct { Window base,upper; Window find,up,down,pgup,pgdn,home,end,left,right; Window first,last,restore,write,get,close; Window load,repl,unrepl,table,addcol,delcol; Window main; Window label[BMAXCOL]; Window time; Window hint; char hinttxt[256]; int dataflag,xflag; int col0,row0,ncol,nrow; int maxrow,maxcol; float **data; int istart,iend; } BROWSER; */ BROWSER my_browser; extern int noicon; extern char uvar_names[MAXODE][12]; float *old_rep; int REPLACE=0,R_COL=0; float **storage; float **get_browser_data() { return my_browser.data; } void set_browser_data(float **data,int col0) { my_browser.data=data; my_browser.col0=col0; } float *get_data_col(int c) { return my_browser.data[c]; } /*Excerpt from the man (Section 2) for gettimeofday: "The use of the timezone structure is obsolete; the tz argument should normally be spec- ified as NULL. The tz_dsttime field has never been used under Linux; it has not been and will not be supported by libc or glibc. Each and every occurrence of this field in the kernel source (other than the declaration) is a bug." */ int gettimenow() { struct timeval now; /*struct timezone tz; gettimeofday(&now,&tz); */ gettimeofday(&now,NULL); return now.tv_usec; } void waitasec(msec) int msec; { struct timeval tim; /*struct timezone tz;*/ double sec=(double)msec/1000; double t1,t2; gettimeofday(&tim,NULL); t1=tim.tv_sec+(tim.tv_usec/1000000.0); while(1) { gettimeofday(&tim,NULL); t2=tim.tv_sec+(tim.tv_usec/1000000.0); if((t2-t1)>sec) return; } } int get_maxrow_browser() { return my_browser.maxrow; } void write_mybrowser_data(FILE *fp) { write_browser_data(fp,&my_browser); } void write_browser_data(fp,b) FILE *fp; BROWSER *b; { int i,j,l; for(i=b->istart;iiend;i++){ if(N_plist>0){ for(l=0;ldata[j][i]); } } else { for(j=0;jmaxcol;j++)fprintf(fp,"%.8g ",b->data[j][i]); } fprintf(fp,"\n"); } } int check_for_stor(data) float **data; { if(data!=storage){ err_msg("Only data can be in browser"); return(0); } else return(1); } void del_stor_col(var,b) BROWSER *b; char *var; { int nc; int i,j; find_variable(var,&nc); if(nc<0) { err_msg("No such column...."); return; } if(nc<=NEQ_MIN){ /* NEQ_MIN = NODE+NAUX */ err_msg("Can't delete that column"); return; } if(check_active_plot(nc)==1){ err_msg("This variable is still actively plotted! - Cant delete!"); return; } /* plintf(" nc=%d NEQ= %d\n",nc,NEQ); */ change_plot_vars(nc); if(ncmaxrow;i++) storage[j][i]=storage[j+1][i]; for(i=0;i<400;i++) my_ode[j-1+FIX_VAR][i]=my_ode[j+FIX_VAR][i]; strcpy(uvar_names[j-1],uvar_names[j]); strcpy(ode_names[j-1],ode_names[j]); } } free(storage[NEQ+1]); free(ode_names[NEQ]); free(my_ode[NEQ+FIX_VAR]); NEQ--; b->maxcol=NEQ+1; redraw_browser(*b); } void data_del_col(b) /* this only works with storage */ BROWSER *b; { Window w; int rev,status; char var[20]; if(check_for_stor(b->data)==0)return; XGetInputFocus(display,&w,&rev); err_msg("Sorry - not working very well yet..."); return; strcpy(var,""); status=get_dialog("Delete","Name",var,"Ok","Cancel",20); if(status!=0) del_stor_col(var,b); } void data_add_col(b) BROWSER *b; { Window w; int rev,status; char var[20],form[80]; if(check_for_stor(b->data)==0)return; XGetInputFocus(display,&w,&rev); strcpy(var,""); strcpy(form,""); status=get_dialog("Add Column","Name",var,"Ok","Cancel",20); if(status!=0){ status=get_dialog("Add Column","Formula:",form,"Add it","Cancel",80); if(status!=0) add_stor_col(var,form,b); } } int add_stor_col(name,formula,b) char *name,*formula; BROWSER *b; { int com[400],i,j; if(add_expr(formula,com,&i)){ err_msg("Bad Formula .... "); return(0); } if((my_ode[NEQ+FIX_VAR]=(int *)malloc(400))==NULL){ err_msg("Cant allocate formula space"); return(0); } if((storage[NEQ+1]=(float *)malloc(MAXSTOR * sizeof(float)))==NULL){ err_msg("Cant allocate space ...."); free(my_ode[NEQ]); return(0); } if((ode_names[NEQ]=(char *)malloc(80))==NULL){ err_msg("Cannot allocate space ..."); free(my_ode[NEQ]); free(storage[NEQ+1]); return(0); } strcpy(ode_names[NEQ],formula); strupr(ode_names[NEQ]); for(j=0;j<=i;j++) my_ode[NEQ+FIX_VAR][j]=com[j]; strcpy(uvar_names[NEQ],name); strupr(uvar_names[NEQ]); for(i=0;imaxrow;i++) storage[NEQ+1][i]=0.0; /* zero it all */ for(i=0;imaxrow;i++){ for(j=0;jmaxcol=NEQ+1; redraw_browser(*b); return(1); } void chk_seq(char *f,int *seq, double *a1, double *a2) { int i,j=-1; char n1[256],n2[256]; int n=strlen(f); *seq=0; *a1=0.0; *a2=0.0; for(i=0;i-1){ for(i=0;i0&&i<(n-1))derv=(dat[dif_var][i+1]-old)/(2*dt); */ if(i>0&&i<(n-1))derv=(dat[dif_var][i+1]-dat[dif_var][i])/dt; old=dat[dif_var][i]; dat[R_COL][i]=derv; } } NCON=NCON_START; NSYM=NSYM_START; } void wipe_rep() { if(!REPLACE)return; free(old_rep); REPLACE=0; } void unreplace_column() { int i,n=my_browser.maxrow; if(!REPLACE)return; for(i=0;i-1)*col=*col+1; } void browse_but_on(b,i,w,yn) int i; Window w; int yn; BROWSER *b; { int val=1; if(yn)val=2; XSetWindowBorderWidth(display,w,val); if(yn&&TipsFlag&&i>=0){ strcpy(b->hinttxt,browse_hint[i]); display_browser(b->hint,*b); } } void enter_browser(ev,b,yn) XEvent ev; BROWSER *b; int yn; { Window w=ev.xexpose.window; if(w==b->find)browse_but_on(b,0,w,yn); if(w==b->up)browse_but_on(b,1,w,yn); if(w==b->down)browse_but_on(b,2,w,yn); if(w==b->pgup)browse_but_on(b,3,w,yn); if(w==b->pgdn)browse_but_on(b,4,w,yn); if(w==b->left)browse_but_on(b,5,w,yn); if(w==b->right)browse_but_on(b,6,w,yn); if(w==b->home)browse_but_on(b,7,w,yn); if(w==b->end)browse_but_on(b,8,w,yn); if(w==b->first)browse_but_on(b,9,w,yn); if(w==b->last)browse_but_on(b,10,w,yn); if(w==b->restore)browse_but_on(b,11,w,yn); if(w==b->write)browse_but_on(b,12,w,yn); if(w==b->get)browse_but_on(b,13,w,yn); if(w==b->repl)browse_but_on(b,14,w,yn); if(w==b->unrepl)browse_but_on(b,15,w,yn); if(w==b->table)browse_but_on(b,16,w,yn); if(w==b->load)browse_but_on(b,17,w,yn); if(w==b->time)browse_but_on(b,18,w,yn); if(w==b->addcol)browse_but_on(b,19,w,yn); if(w==b->delcol)browse_but_on(b,20,w,yn); if(w==b->close)browse_but_on(b,-1,w,yn); } void display_browser(w,b) Window w; BROWSER b; { int i,i0; if(w==b.hint){ XClearWindow(display,b.hint); XDrawString(display,w,small_gc,8,CURY_OFFs,b.hinttxt,strlen(b.hinttxt)); return; } if(w==b.find)xds("Find") if(w==b.up)xds("Up") if(w==b.down)xds("Down") if(w==b.pgup)xds("PgUp") if(w==b.pgdn)xds("PgDn") if(w==b.left)xds("Left") if(w==b.right)xds("Right") if(w==b.home)xds("Home") if(w==b.end)xds("End") if(w==b.first)xds("First") if(w==b.last)xds("Last") if(w==b.restore)xds("Restore") if(w==b.write)xds("Write") if(w==b.get)xds("Get") if(w==b.repl)xds("Replace"); if(w==b.unrepl)xds("Unrepl"); if(w==b.table)xds("Table"); if(w==b.load)xds("Load"); if(w==b.time)xds("Time") if(w==b.addcol)xds("Add col") if(w==b.close)xds("Close") if(w==b.delcol)xds("Del col") for(i=0;i=b.maxcol)return; /* if this one is too big, they all are */ for(i=0;ixflag=0; XDestroySubwindows(display,b->base); XDestroyWindow(display,b->base); } void make_new_browser() { if(my_browser.xflag==1){ XRaiseWindow(display,my_browser.base); return; } make_browser(&my_browser,"Data Viewer","Data",20,5); my_browser.xflag=1; } Window br_button(root,row,col,name,iflag) int row,col,iflag; Window root; char *name; { Window win; int dcol=12*DCURXs; int drow=(DCURYs+6); /*int width=strlen(name)*DCURXs; */ int width=8*DCURXs; int x; int y; if(iflag==1)dcol=14*DCURXs; x=dcol*col+4; y=drow*row+4; win=make_window(root,x,y,width+5,DCURYs+1,1); XSelectInput(display,win,MYMASK); return(win); } Window br_button_data(root,row,col,name,iflag) int row,col,iflag; Window root; char *name; { Window win; int dcol=12*DCURXs; int drow=(DCURYs+6); int width=strlen(name)*DCURXs; int x; int y; if(iflag==1)dcol=14*DCURXs; x=dcol*col+4; y=drow*row+4; win=make_window(root,x,y,width+5,DCURYs+1,1); XSelectInput(display,win,MYMASK); return(win); } void make_browser(b,wname,iname,row,col) BROWSER *b; int row,col; char *wname,*iname; { int i; int ncol=col; int width,height; Window base; /* XWMHints wm_hints; */ XTextProperty winname,iconname; XSizeHints size_hints; int dcol=DCURXs*17; int drow=(DCURYs+6); int ystart=8; if(ncol<5)ncol=5; height=drow*(row+6); width=ncol*dcol; b->nrow=row; b->ncol=ncol; base=make_plain_window(RootWindow(display,screen),0,0,width,height,4); b->base=base; XSelectInput(display,base,ExposureMask|KeyPressMask|ButtonPressMask| StructureNotifyMask); /* plintf("Browser base: %d \n",base); */ XStringListToTextProperty(&wname,1,&winname); XStringListToTextProperty(&iname,1,&iconname); size_hints.flags=PPosition|PSize|PMinSize; size_hints.x=0; size_hints.y=0; /* size_hints.width=width; size_hints.height=height; */ size_hints.min_width=width-15; size_hints.min_height=height; /* wm_hints.initial_state=IconicState; wm_hints.flags=StateHint; */ XClassHint class_hints; class_hints.res_name=""; class_hints.res_class=""; XSetWMProperties(display,base,&winname,&iconname,NULL,0,&size_hints,NULL,&class_hints); make_icon((char*)browse_bits,browse_width,browse_height,base); b->upper=make_window(base,0,0,width,ystart+drow*6,1); XSetWindowBackground(display,b->upper,MyMainWinColor); b->main=make_plain_window(base,0,ystart+drow*6,width,row*drow,1); XSetWindowBackground(display,b->main,MyDrawWinColor); b->find=br_button(base,0,0,"find",0); b->get=br_button(base,1,0,"get ",0); b->repl=br_button(base,2,0,"replace",0); b->restore=br_button(base,0,1,"restore",0); b->write=br_button(base,1,1," write ",0); b->load=br_button(base,2,1," load ",0); b->first=br_button(base,0,2,"first",0); b->last=br_button(base,1,2,"last ",0); b->unrepl=br_button(base,2,2,"unrepl",0); b->table=br_button(base,2,3,"table",0); b->up=br_button(base,0,3," up ",0); b->down=br_button(base,1,3,"down",0); b->pgup=br_button(base,0,4,"pgup",0); b->pgdn=br_button(base,1,4,"pgdn",0); b->left=br_button(base,0,5,"left ",0); b->right=br_button(base,1,5,"right",0); b->home=br_button(base,0,6,"home",0); b->end=br_button(base,1,6,"end ",0); b->addcol=br_button(base,2,4,"addcol",0); b->delcol=br_button(base,2,5,"delcol",0); b->close=br_button(base,2,6,"close",0); b->time=br_button(base,5,0,"time ",1); b->hint=make_window(base,0,4*drow,width-17,drow-3,1); XSelectInput(display,b->time,SIMPMASK); for(i=0;ilabel[i]=br_button_data(base,5,i+1,"1234567890",1); XSelectInput(display,b->label[i],SIMPMASK); /* plintf(" %d \n",i); */ } if(noicon==0)XIconifyWindow(display,base,screen); /* XMapWindow(display,base); */ } /* These are the global exporters ... */ void expose_my_browser(ev) XEvent ev; { if(my_browser.xflag==0)return; expose_browser(ev,my_browser); } void enter_my_browser(ev,yn) XEvent ev; int yn; { if(my_browser.xflag==0)return; enter_browser(ev,&my_browser,yn); } void my_browse_button(ev) XEvent ev; { if(my_browser.xflag==0)return; browse_button(ev,&my_browser); } void my_browse_keypress(ev,used) int *used; XEvent ev; { if(my_browser.xflag==0)return; browse_keypress(ev,used,&my_browser); } void resize_my_browser(win) Window win; { if(my_browser.xflag==0)return; resize_browser(win,&my_browser); } void expose_browser(ev,b) XEvent ev; BROWSER b; { if(my_browser.xflag==0)return; if(ev.type!=Expose)return; display_browser(ev.xexpose.window,b); } void resize_browser(win,b) Window win; BROWSER *b; { unsigned int w,h,hreal; int dcol=17*DCURXs,drow=DCURYs+6; int i0; int newrow,newcol; if(my_browser.xflag==0)return; if(win!=b->base)return; /* w=ev.xconfigure.width; h=ev.xconfigure.height; */ get_new_size(win,&w,&h); hreal=h; /* first make sure the size is is ok and an integral value of the proper width and height */ i0=w/dcol; if((w%dcol)>0)i0++; if(i0>b->maxcol)i0=b->maxcol; w=i0*dcol; if(i0<5)w=5*dcol; newcol=i0; h=hreal-8-5*drow; i0=h/drow; if((h%drow)>0)i0++; if(i0>b->maxrow)i0=b->maxrow; h=i0*drow+DCURXs/2; newrow=i0; /* Now resize everything */ if(b->ncol==newcol&&b->nrow==newrow) return; b->ncol=newcol; b->nrow=newrow; XResizeWindow(display,b->base,w-17,hreal); XResizeWindow(display,b->upper,w-17,8+drow*3); XResizeWindow(display,b->main,w-17,h); /* Let the browser know how many rows and columns of data */ } /* if button is pressed in the browser then do the following */ void browse_button(ev,b) BROWSER *b; XEvent ev; { XEvent zz; int done=1; Window w=ev.xbutton.window; if(my_browser.xflag==0)return; if(w==b->up||w==b->down||w==b->pgup||w==b->pgdn||w==b->left||w==b->right) { done=1; while(done){ if(w==b->up)data_up(b); if(w==b->down)data_down(b); if(w==b->pgup)data_pgup(b); if(w==b->pgdn)data_pgdn(b); if(w==b->left)data_left(b); if(w==b->right)data_right(b); waitasec(100); if(XPending(display)>0) { XNextEvent(display,&zz); switch(zz.type){ case ButtonRelease: done=0; break; } } } return; } if(w==b->home){data_home(b); return;} if(w==b->end){data_end(b); return;} if(w==b->first){data_first(b); return;} if(w==b->last){data_last(b); return;} if(w==b->restore){data_restore(b); return;} if(w==b->write){data_write(b); return;} if(w==b->get){data_get(b); return;} if(w==b->find){data_find(b); return;} if(w==b->repl){data_replace(b);return;} if(w==b->load){data_read(b);return; } if(w==b->addcol){data_add_col(b);return;} if(w==b->delcol){data_del_col(b);return;} if(w==b->unrepl){data_unreplace(b);return;} if(w==b->table){data_table(b);return;} if(w==b->close){kill_browser(b);return;} } void browse_keypress(ev,used,b) BROWSER *b; XEvent ev; int *used; { Window w=ev.xkey.window; char ks; Window w2; int rev; *used=0; if(my_browser.xflag==0)return; XGetInputFocus(display,&w2,&rev); if(w==b->main||w==b->base||w==b->upper||w2==b->base) { *used=1; ks=(char)get_key_press(&ev); /* XLookupString(&ev,buf,maxlen,&ks,&comp); */ if(ks==UP){data_up(b); return;} if(ks==DOWN){data_down(b); return;} if(ks==PGUP){data_pgup(b); return;} if(ks==PGDN){data_pgdn(b); return;} if(ks==LEFT){data_left(b); return;} if(ks==RIGHT){data_right(b); return;} if(ks==HOME){data_home(b); return;} if(ks==END){data_end(b); return;} if(ks=='s'||ks=='S'){data_first(b); return;} if(ks=='e'||ks=='E'){data_last(b); return;} if(ks=='r'||ks=='R'){data_restore(b); return;} if(ks=='W'||ks=='w'){data_write(b); return;} if(ks=='g'||ks=='G'){data_get(b); return;} if(ks=='f'||ks=='F'){data_find(b); return;} if(ks=='l'||ks=='L'){data_read(b);return;} if(ks=='u'||ks=='U'){data_unreplace(b);return;} if(ks=='t'||ks=='T'){data_table(b);return;} if(ks=='p'||ks=='P'){data_replace(b);return;} if(ks=='a'||ks=='A'){data_add_col(b);return;} if(ks=='d'||ks=='D'){data_del_col(b);return;} if(ks==ESC){ XSetInputFocus(display,command_pop, RevertToParent,CurrentTime); return; } } /* end of cases */ } void data_up(b) BROWSER *b; { if(b->row0>0){ b->row0--; draw_data(*b); } } void data_down(b) BROWSER *b; { if(b->row0<(b->maxrow-1)){ b->row0++; draw_data(*b); } } void data_pgup(b) BROWSER *b; { int i=b->row0-b->nrow; if(i>0) b->row0=i; else b->row0=0; draw_data(*b); } void data_pgdn(b) BROWSER *b; { int i=b->row0+b->nrow; if(i<(b->maxrow-1)) b->row0=i; else b->row0=b->maxrow-1; draw_data(*b); } void data_home(b) BROWSER *b; { b->row0=0; b->istart=0; b->iend=b->maxrow; draw_data(*b); } void data_end(b) BROWSER *b; { b->row0=b->maxrow-1; draw_data(*b); } void get_data_xyz(x,y,z,i1,i2,i3,off) int i1,i2,i3,off; float *x,*y,*z; { int in=my_browser.row0+off; *x=my_browser.data[i1][in]; *y=my_browser.data[i2][in]; *z=my_browser.data[i3][in]; } void data_get(b) BROWSER *b; { int i,in=b->row0; set_ivar(0,(double)storage[0][in]); for(i=0;idata,b->maxrow); draw_data(*b); } XSetInputFocus(display,w,rev,CurrentTime); } void data_unreplace(b) BROWSER *b; { unreplace_column(); draw_data(*b); } void data_table(b) BROWSER *b; { Window w; int rev,status; static char *name[]={"Variable","Xlo","Xhi","File"}; char value[4][25]; double xlo=0,xhi=1; int col; sprintf(value[0],uvar_names[0]); sprintf(value[1],"0.00"); sprintf(value[2],"1.00"); sprintf(value[3],"%s.tab",value[0]); XGetInputFocus(display,&w,&rev); status=do_string_box(4,4,1,"Tabulate",name,value,40); XSetInputFocus(display,w,rev,CurrentTime); if(status==0)return; xlo=atof(value[1]); xhi=atof(value[2]); find_variable(value[0],&col); if(col>=0) make_d_table(xlo,xhi,col,value[3],*b); } void data_find(b) BROWSER *b; { Window w; int rev,status; static char *name[]={"*0Variable","Value"}; char value[2][25]; int col,row; float val; sprintf(value[0],uvar_names[0]); sprintf(value[1],"0.00"); XGetInputFocus(display,&w,&rev); status=do_string_box(2,2,1,"Find Data",name,value,40); XSetInputFocus(display,w,rev,CurrentTime); if(status==0)return; val=(float)atof(value[1]); find_variable(value[0],&col); if(col>=0)find_value(col,val,&row,*b); if(row>=0){ b->row0=row; draw_data(*b); } } void open_write_file(fp,fil,ok) FILE **fp; char *fil; int *ok; { char ans; *ok=0; *fp=fopen(fil,"r"); if(*fp!=NULL){ fclose(*fp); ans=(char)TwoChoice("Yes","No", "File Exists! Overwrite?","yn"); if(ans!='y')return; } *fp=fopen(fil,"w"); if(*fp==NULL){ respond_box("Ok", "Cannot open file"); *ok=0; } else *ok=1; return; } void data_read(b) BROWSER *b; { int status; char fil[256]; char ch; FILE *fp; int k; int len,count=0,white=1; float z; strcpy(fil,"test.dat"); /* XGetInputFocus(display,&w,&rev); status=get_dialog("Load","Filename:",fil,"Ok","Cancel",40); XSetInputFocus(display,w,rev,CurrentTime); */ status=file_selector("Load data",fil,"*.dat"); if(status==0)return; fp=fopen(fil,"r"); if(fp==NULL){ respond_box("Ok", "Cannot open file"); return; } /* Now we establish the width of the file and read it. If there are more columns than available we ignore them. if there are fewer rows we read whats necessary if there are more rows then read until we are done or MAX_STOR_ROW. This data can be plotted etc like anything else */ do { fscanf(fp,"%c",&ch); if( !isspace((int)ch)&&(white) ) { white=0; ++count; } if( isspace((int)ch) &&(1-white)) white=1; } while(ch != '\n'); rewind(fp); len=0; while(!feof(fp)) { for(k=0;kmaxcol)b->data[k][len]=z; } ++len; if(len>=MAXSTOR)break; } fclose(fp); refresh_browser(len); storind=len; /* b->maxrow=len; draw_data(*b); */ } void data_write(b) BROWSER *b; { int status; char fil[256]; FILE *fp; int i,j; int ok; strcpy(fil,"test.dat"); /* XGetInputFocus(display,&w,&rev); XSetInputFocus(display,command_pop,RevertToParent,CurrentTime); strcpy(fil,"test.dat"); new_string("Write to:",fil); */ /* status=get_dialog("Write","Filename:",fil,"Ok","Cancel",40); XSetInputFocus(display,w,rev,CurrentTime); */ status=file_selector("Write data",fil,"*.dat"); if(status==0)return; open_write_file(&fp,fil,&ok); if(!ok)return; for(i=b->istart;iiend;i++){ for(j=0;jmaxcol;j++)fprintf(fp,"%.8g ",b->data[j][i]); fprintf(fp,"\n"); } fclose(fp); } void data_left(b) BROWSER *b; { int i=b->col0; if(i>1){ b->col0--; redraw_browser(*b); } } void data_right(b) BROWSER *b; { int i=b->col0+b->ncol; if(i<=b->maxcol){ b->col0++; redraw_browser(*b); } } void data_first(b) BROWSER *b; { b->istart=b->row0; } void data_last(b) BROWSER *b; { b->iend=b->row0+1; } void data_restore(b) BROWSER *b; { restore(b->istart,b->iend); } void get_col_list(s,cl,n) int *n,*cl; char *s; { int len,i; char sp[256]; convert(s,sp); len=strlen(sp); if(len==0){ for(i=0;i<*n;i++) cl[i]=i; return; } } kinescope.c0000644000175000017500000001371611622522400013072 0ustar dumzdejdumzdej#include "kinescope.h" #include "scrngif.h" #include "pop_list.h" #include "aniparse.h" #include "browse.h" #include "ggets.h" #include /* Kinescope for X windows */ #include #include #include #include /* #include */ #include #include #include #include #include "mykeydef.h" extern Display *display; extern Window draw_win,main_win,info_pop; extern int DCURY; extern GC gc_graph; #define MAXFILM 250 int ks_ncycle=1; int ks_speed=50; extern char *info_message,*kin_hint[]; extern int screen; int mov_ind; typedef struct { unsigned int h,w; Pixmap xi; } MOVIE; MOVIE movie[MAXFILM]; void do_movie_com(int c) { /* XDestroyWindow(display,temp); draw_help(); XFlush(display); */ switch(c){ case 0: if(film_clip()==0) respond_box("Okay","Out of film!"); break; case 1: reset_film(); break; case 2: play_back(); break; case 3: auto_play(); break; case 4: save_kine(); break; case 5: make_anigif(); break; case 6: /* test_keys(); */ break; } } void reset_film() { int i; if(mov_ind==0)return; for(i=0;i=MAXFILM)return(0); XGetGeometry(display,draw_win,&root,&x,&y,&w,&h,&bw,&d); movie[mov_ind].h=h; movie[mov_ind].w=w; movie[mov_ind].xi=XCreatePixmap(display,RootWindow(display,screen),w,h, DefaultDepth(display,screen)); XCopyArea(display,draw_win,movie[mov_ind].xi,gc_graph,0,0,w,h,0,0); mov_ind++; return 1; } int show_frame(int i, int h, int w) { if(h=mov_ind)i=0; if(show_frame(i,h,w))return; break; case KeyPress: switch(get_key_press(&ev)){ case ESC: return; case RIGHT: i++; if(i>=mov_ind)i=0; if(show_frame(i,h,w))return; break; case LEFT: i--; if(i<0)i=mov_ind-1; if(show_frame(i,h,w))return; break; case HOME: i=0; if(show_frame(i,h,w))return; break; case END: i=mov_ind-1; if(show_frame(i,h,w))return; break; } } } } void save_kine() { char base[128]; int fmat=1; sprintf(base,"frame"); #ifdef NOGIF #else new_int("format:1-ppm,2-gif",&fmat); #endif new_string("Base file name",base); if(strlen(base)>0) save_movie(base,fmat); } void make_anigif() { int i=0; int x,y; FILE *fp; Window root; unsigned int h,w,bw,d; XGetGeometry(display,draw_win,&root,&x,&y,&w,&h,&bw,&d); if(mov_ind==0)return; if(h0) { XNextEvent(display,&ev); switch(ev.type){ case ButtonPress: return; break; case KeyPress: key=get_key_press(&ev); if(key==27)return; if(key==','){ ks_speed-=dt; if(ks_speedsmax)ks_speed=smax; } break; } } /* done checking now increment pix */ waitasec(ks_speed); i++; if(i>=mov_ind){cycle++; i=0;} if(h=ks_ncycle)return; } /* Big loop */ } void too_small() { respond_box("Okay","Window too small for film!"); } axes2.c0000644000175000017500000002017011610403677012137 0ustar dumzdejdumzdej#include "axes2.h" #include #include /* All new improved axes !! */ #include #include #include #include #include "xpplim.h" #include "struct.h" #include "ggets.h" #include "graphics.h" #include "main.h" #include "many_pops.h" #define NOAXES 0 #define CROSS 1 #define TAXIS 3 #define ELAXIS 2 #define BOX 4 #define CROSS3D 5 #define T3D 7 #define EL3D 6 #define CUBE 8 #define SIGNIF (0.01) /* less than one hundredth of a tic mark */ #define CheckZero(x,tic) (fabs(x) < ((tic) * SIGNIF) ? 0.0 : (x)) extern GRAPH *MyGraph; extern GC small_gc; extern int DCURXs,DCURYs; extern Display *display; extern Window draw_win; extern int DX_0,DY_0,D_WID,D_HGT; extern int PSFlag; extern char uvar_names[MAXODE][12]; extern int DLeft,DRight,DTop,DBottom,VTic,HTic,VChar,HChar; extern int TextJustify,TextAngle; extern double XMin,XMax,YMin,YMax; void re_title() { char bob[40]; make_title(bob); title_text(bob); } void get_title_str(s1,s2,s3) char *s1,*s2,*s3; { int i; if((i=MyGraph->xv[0])==0)strcpy(s1,"T"); else strcpy(s1,uvar_names[i-1]); if((i=MyGraph->yv[0])==0)strcpy(s2,"T"); else strcpy(s2,uvar_names[i-1]); if((i=MyGraph->zv[0])==0)strcpy(s3,"T"); else strcpy(s3,uvar_names[i-1]); } void make_title(str) char *str; { int i; char name1[20]; char name2[20]; char name3[20]; if((i=MyGraph->xv[0])==0)strcpy(name1,"T"); else strcpy(name1,uvar_names[i-1]); if((i=MyGraph->yv[0])==0)strcpy(name2,"T"); else strcpy(name2,uvar_names[i-1]); if((i=MyGraph->zv[0])==0)strcpy(name3,"T"); else strcpy(name3,uvar_names[i-1]); if(MyGraph->grtype>=5) sprintf(str,"%s vs %s vs %s",name3,name2,name1); else sprintf(str,"%s vs %s",name2,name1); } double dbl_raise(x,y) double x; int y; { register int i; double val; val = 1.0; for (i=0; i < abs(y); i++) val *= x; if (y < 0 ) return (1.0/val); return(val); } double make_tics(tmin,tmax) double tmin,tmax; { register double xr,xnorm,tics,tic,l10; xr = fabs(tmin-tmax); l10 = log10(xr); xnorm = pow(10.0,l10-(double)((l10 >= 0.0 ) ? (int)l10 : ((int)l10-1))); if (xnorm <= 2) tics = 0.2; else if (xnorm <= 5) tics = 0.5; else tics = 1.0; tic = tics * dbl_raise(10.0,(l10 >= 0.0 ) ? (int)l10 : ((int)l10-1)); return(tic); } void find_max_min_tic(tmin,tmax,tic) double *tmin,*tmax,tic; { double t1=*tmin; t1=tic*floor(*tmin/tic); if(t1<*tmin)t1+=tic; *tmin=t1; t1=tic*ceil(*tmax/tic); if(t1>*tmax)t1-=tic; *tmax=t1; } void redraw_cube_pt(double theta,double phi) { char bob[50]; set_linestyle(0); make_rot(theta,phi); clr_scrn(); sprintf(bob,"theta=%g phi=%g",theta,phi); canvas_xy(bob); } void do_axes() { char s1[20],s2[20],s3[20]; get_title_str(s1,s2,s3); set_linestyle(0); re_title(); SmallGr(); switch(MyGraph->grtype) { case 0: Box_axis(MyGraph->xlo,MyGraph->xhi,MyGraph->ylo,MyGraph->yhi, MyGraph->xlabel,MyGraph->ylabel,1); break; case 5: Frame_3d(); break; } SmallBase(); } void redraw_cube(double theta,double phi) { char bob[50]; set_linestyle(0); make_rot(theta,phi); blank_screen(draw_win); draw_unit_cube(); sprintf(bob,"theta=%g phi=%g",theta,phi); canvas_xy(bob); } void draw_unit_cube() { line3d(-1.,-1.,-1.,1.,-1.,-1.); line3d(1.,-1.,-1.,1.,1.,-1.); line3d(1.,1.,-1.,-1.,1.,-1.); line3d(-1.,1.,-1.,-1.,-1.,-1.); line3d(-1.,-1.,1.,1.,-1.,1.); line3d(1.,-1.,1.,1.,1.,1.); line3d(1.,1.,1.,-1.,1.,1.); line3d(-1.,1.,1.,-1.,-1.,1.); line3d(1.,1.,1.,1.,1.,-1.); line3d(-1.,1.,1.,-1.,1.,-1.); line3d(-1.,-1.,1.,-1.,-1.,-1.); line3d(1.,-1.,1.,1.,-1.,-1.); } void Frame_3d() { double tx,ty,tz; float x1,y1,z1,x2,y2,z2,dt=.03; float x0=MyGraph->xorg,y0=MyGraph->yorg,z0=MyGraph->zorg; char bob[20]; double xmin=MyGraph->xmin,xmax=MyGraph->xmax,ymin=MyGraph->ymin; double ymax=MyGraph->ymax,zmin=MyGraph->zmin,zmax=MyGraph->zmax; float x4=xmin,y4=ymin,z4=zmin,x5=xmax,y5=ymax,z5=zmax; float x3,y3,z3,x6,y6,z6; tx=make_tics(xmin,xmax); ty=make_tics(ymin,ymax); tz=make_tics(zmin,zmax); find_max_min_tic(&xmin,&xmax,tx); find_max_min_tic(&zmin,&zmax,tz); find_max_min_tic(&ymin,&ymax,ty); scale3d((float)xmin,(float)ymin,(float)zmin,&x1,&y1,&z1); scale3d((float)xmax,(float)ymax,(float)zmax,&x2,&y2,&z2); scale3d(x4,y4,z4,&x3,&y3,&z3); scale3d(x5,y5,z5,&x6,&y6,&z6); set_linestyle(-2); line3d(-1.,-1.,-1.,1.,-1.,-1.); line3d(1.,-1.,-1.,1.,1.,-1.); line3d(1.,1.,-1.,-1.,1.,-1.); line3d(-1.,1.,-1.,-1.,-1.,-1.); line3d(-1.,-1.,1.,1.,-1.,1.); line3d(1.,-1.,1.,1.,1.,1.); line3d(1.,1.,1.,-1.,1.,1.); line3d(-1.,1.,1.,-1.,-1.,1.); line3d(1.,1.,1.,1.,1.,-1.); line3d(-1.,1.,1.,-1.,1.,-1.); line3d(-1.,-1.,1.,-1.,-1.,-1.); line3d(1.,-1.,1.,1.,-1.,-1.); line3dn(-1.-dt,-1.,z2,-1.+dt,-1.,z2); line3dn(-1.-dt,-1.,z1,-1.+dt,-1.,z1); line3dn(x2,-1.-dt,-1.0,x2,-1.0+dt,-1.0); line3dn(x1,-1.-dt,-1.0,x1,-1.0+dt,-1.0); line3dn(1.0-dt,y1,-1.0,1.0+dt,y1,-1.0); line3dn(1.0-dt,y2,-1.0,1.0+dt,y2,-1.0); set_linestyle(-1); if(MyGraph->zorgflag)line_3d(x0,y0,z4,x0,y0,z5); if(MyGraph->yorgflag)line_3d(x0,y4,z0,x0,y5,z0); if(MyGraph->xorgflag)line_3d(x4,y0,z0,x5,y0,z0); dt=.06; TextJustify=2; sprintf(bob,"%g",xmin); text3d(x1,-1-2.*dt,-1.0,bob); sprintf(bob,"%g",xmax); text3d(x2,-1-2.*dt,-1.0,bob); text3d(0.0,-1-dt,-1.0,MyGraph->xlabel); TextJustify=0; sprintf(bob,"%g",ymin); /*sprintf(bob,"%g",ymin,bob); */ text3d(1+dt,y1,-1.0,bob); sprintf(bob,"%g",ymax); /*sprintf(bob,"%g",ymax,bob); */ text3d(1+dt,y2,-1.0,bob); text3d(1+dt,0.0,-1.0,MyGraph->ylabel); TextJustify=2; sprintf(bob,"%g",zmin); text3d(-1.-dt,-1-dt,z1,bob); sprintf(bob,"%g",zmax); text3d(-1.-dt,-1-dt,z2,bob); text3d(-1.-dt,-1.-dt,0.0,MyGraph->zlabel); TextJustify=0; } void Box_axis(x_min,x_max,y_min,y_max,sx,sy,flag) double x_min,x_max,y_min,y_max; int flag; char *sx,*sy; { double ytic,xtic; int xaxis_y,yaxis_x; int ybot=DBottom,ytop=DTop; int xleft=DLeft,xright=DRight; if(ybot>ytop){ ytop=ybot; ybot=DTop; } ytic=make_tics(y_min,y_max); xtic=make_tics(x_min,x_max); scale_to_screen((float)MyGraph->xorg,(float)MyGraph->yorg,&yaxis_x,&xaxis_y); set_linestyle(-1); if(MyGraph->xorgflag&&flag) if(xaxis_y>=ybot&&xaxis_y<=ytop) line(xleft,xaxis_y,xright,xaxis_y); if(MyGraph->yorgflag&&flag) if(yaxis_x>=xleft&&yaxis_x<=xright) line(yaxis_x,ybot,yaxis_x,ytop); set_linestyle(-2); line(xleft,ybot,xright,ybot); line(xright,ybot,xright,ytop); line(xright,ytop,xleft,ytop); line(xleft,ytop,xleft,ybot); draw_ytics(sy,ytic*floor(y_min/ytic),ytic,ytic*ceil(y_max/ytic)); draw_xtics(sx,xtic*floor(x_min/xtic),xtic,xtic*ceil(x_max/xtic)); TextJustify=0; set_linestyle(0); } void draw_ytics(s1,start, incr, end) double start, incr, end; char *s1; { double ticvalue,place; double y_min=YMin,y_max=YMax, x_min=XMin; char bob[100]; int xt,yt,s=1; TextJustify=2; /* Right justification */ for(ticvalue=start;ticvalue<=end;ticvalue+=incr){ place=CheckZero(ticvalue,incr); if(ticvaluey_max)continue; sprintf(bob,"%g",place); scale_to_screen((float)x_min,(float)place,&xt,&yt); line(DLeft,yt,DLeft+HTic,yt); line(DRight,yt,DRight-HTic,yt); put_text(DLeft-(int)(1.25*HChar),yt,bob); } scale_to_screen((float)x_min,(float)y_max,&xt,&yt); if(DTopx_max)continue; sprintf(bob,"%g",place); scale_to_screen((float)place,y_min,&xt,&yt); line(xt,DBottom,xt,DBottom+s*VTic); line(xt,DTop,xt,DTop-s*VTic); put_text(xt,yt-(int)(1.25*VChar*s),bob); } put_text((DLeft+DRight)/2,yt-(int)(2.5*VChar*s),s2); } abort.c0000644000175000017500000000217711633747356012245 0ustar dumzdejdumzdej#include "abort.h" #include #include #include #include #include "many_pops.h" #include "ggets.h" #include "aniparse.h" extern Window command_pop; extern GC gc,gc_graph,small_gc; extern Display *display; extern int DCURYb,DCURXb,CURY_OFFb; extern int DCURYs,DCURXs,CURY_OFFs; extern int DCURY,DCURX,CURY_OFF; int get_command_width() { int x,y; unsigned int w,h,bw,de; Window root; XGetGeometry(display,command_pop,&root,&x,&y,&w,&h,&bw,&de); XClearWindow(display,command_pop); return(w); } void plot_command(nit,icount,cwidth) int nit,icount,cwidth; { int i; float dx; if(nit==0)return; dx=(float)icount*(float)cwidth/(float)nit; i=(int)dx; XDrawPoint(display,command_pop,gc,i,5); } int my_abort() { int ch; XEvent event; while(XPending(display)>0){ XNextEvent(display,&event); if(check_ani_pause(event)==27)return(27); switch(event.type){ case Expose: do_expose(event); break; case ButtonPress: break; case KeyPress: ch=get_key_press(&event); return(ch); } return(0); } return(64); } parser2.c0000644000175000017500000013717011610403677012504 0ustar dumzdejdumzdej#include /* NOTE!!! I am changing the parser a great deal here I am making parameters 200-300 kernels are 1000 variables are 1100 - 2100 for now shift/delay adds 3000 to them currently 600 is the maximum to get it up to eg 700 delete all .o files change xpplim.h by adding 100 to MAXODE,MAXODE1 add 50 to MAXPRIMEVAR better make worksize bigger - I am not sure how much cant hurt to be too big - 300000 = 2.4MB memory which is not too much these days change is_uvar - change 17 to 18 isvar - " " the following are the currently used indices 0-99 functions of 1 variable like sin, cos, etc 100-199 fixed functions of 2 variables like + -, etc 200-399 parameters 500-599 vector variables 600-699 networks 700-799 lookup tables 800-899 dummy arguments for functions 900-999 special stuff 1000-1099 volterra kernels 2400-2499 user defined functions 3200-3300 shifted constants 10000-11000 variables 20000-21000 shifted variables */ #include /* #include */ #include #include #ifndef WCTYPE #include #else #include #endif #include "parser.h" #include "xpplim.h" #include "getvar.h" #define THOUS 10000 #define MAXEXPLEN 1024 #define SP stack_pointer #define S0 stack[stack_pointer] #define SM1 stack[stack_pointer-1] /* #define DBL_EPSILON 2.23E-15 */ #define POP stack[--stack_pointer] #define PUSH(a) zippy=(a); stack[stack_pointer++]=zippy; double zippy; #define DFNORMAL 1 #define DFFP 2 #define DFSTAB 3 #define COM(a) my_symb[toklist[(a)]].com int ERROUT; extern int DelayFlag; int NDELAYS=0; /*double pow2(); */ int (*e_fun[25])(); double feval_rpn(); double get_delay(); double delay_stab_eval(); double lookup(),network_value(); double atof(),erf(),erfc(),rndom(),poidev(); double ndrand48(); double ker_val(); double hom_bcs(); double BoxMuller; #ifdef NOLGAMMA double lgamma(); #endif int BoxMullerFlag=0; int RandSeed=12345678; typedef void (*pf)(void); extern int newseed; extern int del_stab_flag; double CurrentIndex=0.0; int SumIndex=1; /************************* RPN COMPILER * **************************/ /* new functions */ void zz_pmod() { double z; SP--; z=fmod(SM1,S0); if(z<0)z+=S0; SM1=z; } void zz_atan2() { SP--; SM1=atan2(SM1,S0); } void zz_pow() { SP--; SM1=pow(SM1,S0); } void zz_max() { SP--; if(SM1S0)SM1=S0; } void zz_dand() { SP--; SM1=S0&&SM1; } void zz_dor() { SP--; SM1=S0||SM1; } void zz_dnot() { SM1=(double)(SM1==0.0); } void zz_dge() { SP--; SM1=(double)(SM1>=S0); } void zz_dle() { SP--; SM1=(double)(SM1<=S0); } void zz_dlt() { SP--; SM1=(double)(SM1S0); } void zz_deq() { SP--; SM1=(double)(SM1==S0); } void zz_dne() { SP--; SM1=(double)(SM1!=S0); } void zz_normal() { SP--; SM1=normal(SM1,S0); } void zz_bessel_j() { SP--; SM1=jn((int)SM1,S0); } void zz_bessel_i() { SP--; SM1=bessi((int)SM1,S0); } void zz_bessel_y() { SP--; SM1=yn((int)SM1,S0); } void zz_add() { SP--; SM1+=S0; } void zz_subt() { SP--; SM1-=S0; } void zz_div() { SP--; SM1/=S0; } void zz_mult() { SP--; SM1*=S0; } void zz_sin() { SM1=sin(SM1); } void zz_cos() { SM1=cos(SM1); } void zz_tan() { SM1=tan(SM1); } void zz_pois() { SM1=poidev(SM1); } void zz_asin() { SM1=asin(SM1); } void zz_acos() { SM1=acos(SM1); } void zz_atan() { SM1=atan(SM1); } void zz_sinh() { SM1=sinh(SM1); } void zz_cosh() { SM1=cosh(SM1); } void zz_tanh() { SM1=tanh(SM1); } void zz_fabs() { SM1=fabs(SM1); } void zz_exp() { SM1=exp(SM1); } void zz_log() { SM1=log(SM1); } void zz_log10() { SM1=log10(SM1); } void zz_sqrt() { SM1=sqrt(SM1); } void zz_neg() { SM1=-SM1; } void zz_recip() { SM1=1/SM1; } void zz_heaviside() { SM1=(double)(SM1>0); } void zz_signum() { double z=SM1; if(z>0){SM1=1.0; return;} if(z<0){SM1=-1.0;return;} SM1=0.0; } void zz_floor() { SM1=floor(SM1); } void zz_erf() { SM1=erf(SM1); } void zz_erfc() { SM1=erfc(SM1); } void zz_hom_bcs() { SM1=hom_bcs(SM1); } void zz_rndom() { SM1=rndom(SM1); } void zz_lgamma() { SM1=lgamma(SM1); } /* How to add a new hardcoded function to XPP because only 1 and 2 variable functions can be hard coded there are limitations: Suppose the function is hill(x,n)=x^n/(1+x^n) 1. In parser2.c add the c-code for the function. double hill(double x,double n) { double y=pow(x,n); return y/(1+y); } at the top of the file also add double hill(); 2. In parser.h add the name of the function at the end of the structure my_symb "HILL",4,120,2,10,0, name, length of name,command,args,priority,0 priority is always 10 for functions command = LAST2VAR (in parser.c) or LAST1VAR for 1 variable funs increment LAST2VAR or LAST1VAR increment STDSYM - tells XPP how many standard symbols there are 3. in parser.c add the C code for 2 variable funs: void zz_hill() { SP--; SM1=hill(SM1,S0); } for 1 variable funs void zz_myfun() { SM1=myfun(SM1); } 4. in parser2.c add the code for 2 variable funs: fun2[20]=zz_hill; in the subroutine two_args() note that 20 is because LAST2VAR = 120 for 1 variable funs fun1[25]=zz_myfun; in subroutine one_arg(); since 25 was LAST1VAR 5. Recompile! */ /***************************** * PARSER.C * * * * parses any algebraic expression * and converts to an integer array * to be interpreted by the rpe_val * function. * * the main data structure is a contiguous * list of symbols with their priorities * and their symbol value * * on the first pass, the expression is converted to * a list of integers without any checking except for * valid symbols and for numbers * * next this list of integers is converted to an RPN expression * for evaluation. * * * 6/95 stuff added to add names to namelist without compilation *************************************************************/ /* INIT_RPN */ /* int matherr(e) struct exception *e; { char *c; switch (e->type) { case DOMAIN: c = "domain error"; break; case SING : c = "argument singularity"; break; case OVERFLOW: c = "overflow range"; break; case UNDERFLOW: c = "underflow range"; break; default: c = "(unknown error"; break; } fprintf(stderr, "math exception : %d\n", e->type); fprintf(stderr, " name : %s\n", e->name); fprintf(stderr, " arg 1: %e\n", e->arg1); fprintf(stderr, " arg 2: %e\n", e->arg2); fprintf(stderr, " ret : %e\n", e->retval); return 1; } */ init_rpn() { int i; ERROUT = 1; NCON = 0; NFUN = 0; NVAR = 0; NKernel=0; MaxPoints=4000; NSYM = STDSYM; two_args(); one_arg(); add_con("PI", M_PI); add_con("I'",0.0); /* add_con("c___1",0.0); add_con("c___2",0.0); add_con("c___3",0.0); */ SumIndex=NCON-1; init_table(); if (newseed==1) RandSeed=time(0); nsrand48(RandSeed); } /* FREE_UFUNS */ free_ufuns() { int i; for(i=0;i=0){ if(ERROUT)printf("%s is a duplicate name\n",junk); return(1); } return(0); } /* ADD_CONSTANT */ add_constant(junk) char *junk; { int len; char string[100]; if(duplicate_name(junk)==1)return(1); if(NCON>=397) { if(ERROUT)printf("too many constants !!\n"); return(1); } convert(junk,string); len=strlen(string); if(len<1){ plintf("Empty parameter - remove spaces\n"); return 1; } if(len>MXLEN){ len=MXLEN; plintf("Error: name %s too long \n",string); } strncpy(my_symb[NSYM].name,string,len); my_symb[NSYM].name[len]='\0'; my_symb[NSYM].len=len; my_symb[NSYM].pri=10; my_symb[NSYM].arg=0; my_symb[NSYM].com=200+NCON-1; NSYM++; return(0); } /* GET_TYPE */ get_type(index) int index; { return(my_symb[index].com); } /* ADD_CON */ add_con(name,value) char *name; double value; { if(NCON>=397) { if(ERROUT)printf("too many constants !!\n"); return(1); } constants[NCON]=value; NCON++; return(add_constant(name)); } add_kernel(name,mu,expr) char *name,*expr; double mu; { char string[100]; char bexpr[MAXEXPLEN],kexpr[MAXEXPLEN]; int len,i,in=-1; if(duplicate_name(name)==1)return(1); if(NKernel==MAXKER){ plintf("Too many kernels..\n"); return(1); } if(mu<0||mu>=1.0){ plintf(" mu must lie in [0,1.0) \n"); return(1); } convert(name,string); len=strlen(string); if(len>MXLEN){ len=MXLEN; plintf("Error: name %s too long \n",string); }; strncpy(my_symb[NSYM].name,string,len); my_symb[NSYM].name[len]='\0'; my_symb[NSYM].len=len; my_symb[NSYM].pri=10; my_symb[NSYM].arg=0; my_symb[NSYM].com=1000+NKernel; kernel[NKernel].k_n1=0.0; kernel[NKernel].mu=mu; kernel[NKernel].k_n=0.0; kernel[NKernel].k_n1=0.0; kernel[NKernel].flag=0; for(i=0;i0){ kernel[NKernel].flag=CONV; kernel[NKernel].expr=(char *)malloc(strlen(expr)+2-in); kernel[NKernel].kerexpr=(char *)malloc(in+1); for(i=0;i=MAXODE1) { if(ERROUT)printf("too many variables !!\n"); return(1); } convert(junk,string); len=strlen(string); if(len>MXLEN){ len=MXLEN; plintf("Error: name %s too long \n",string); }; strncpy(my_symb[NSYM].name,string,len); my_symb[NSYM].name[len]='\0'; my_symb[NSYM].len=len; my_symb[NSYM].pri=10; my_symb[NSYM].arg=0; my_symb[NSYM].com=10000+NVAR; NSYM++; NVAR++; return(0); } /* ADD_EXPR */ add_expr(expr,command, length ) char *expr; int *command, *length; { char dest[1024]; int my_token[1024]; int com2[1024],ilen2; int err,i; convert(expr,dest); /* plintf(" Making token for %s\n",expr); */ err=make_toks(dest,my_token); i=0; /* while(i<50){ plintf(" %d %d \n",i,my_token[i]); if(my_token[i]==ENDTOK)break; i++; } */ if(err!=0)return(1); err = alg_to_rpn(my_token,com2); if(err!=0)return(1); i=0; while(com2[i]!=ENDEXP)i++; *length=i+1; /* for(i=0;i<*length;i++)printf("%d \n",com2[i]); */ pass3(com2,command,&ilen2); /* plintf(" ilen2=%d \n",ilen2); */ /* for(i=0;iMXLEN){ len=MXLEN; plintf("Error: name %s too long \n",string); }; strncpy(my_symb[NSYM].name,string,len); my_symb[NSYM].name[len]='\0'; my_symb[NSYM].len=len; my_symb[NSYM].pri=10; my_symb[NSYM].arg=1; my_symb[NSYM].com=VECT_ROOT+index; NSYM++; return(0); } add_net_name(index,name) int index; char *name; { char string[50]; int len=strlen(name); plintf(" Adding net %s %d \n",name,index); if(duplicate_name(name)==1)return(1); convert(name,string); if(len>MXLEN){ len=MXLEN; plintf("Error: name %s too long \n",string); }; strncpy(my_symb[NSYM].name,string,len); my_symb[NSYM].name[len]='\0'; my_symb[NSYM].len=len; my_symb[NSYM].pri=10; my_symb[NSYM].arg=1; my_symb[NSYM].com=600+index; NSYM++; return(0); } /* ADD LOOKUP TABLE */ add_2d_table(name,file) char *name,*file; { plintf(" TWO D NOT HERE YET \n"); return(1); } add_file_table(index,file) char *file; int index; { if(load_table(file,index)==0) { if(ERROUT)printf("Problem with creating table !!\n"); return(1); } return(0); } add_table_name(index,name) char *name; int index; { char string[50]; int len=strlen(name); if(duplicate_name(name)==1)return(1); convert(name,string); if(len>MXLEN){ len=MXLEN; plintf("Error: name %s too long \n",string); }; strncpy(my_symb[NSYM].name,string,len); my_symb[NSYM].name[len]='\0'; my_symb[NSYM].len=len; my_symb[NSYM].pri=10; my_symb[NSYM].arg=1; my_symb[NSYM].com=700+index; set_table_name(name,index); NSYM++; return(0); } /* ADD LOOKUP TABLE */ add_form_table(index,nn,xlo,xhi,formula) char *formula; double xlo,xhi; int nn; int index; { /* plintf(" add-form index= %d \n",index); */ if(create_fun_table(nn,xlo,xhi,formula,index)==0) { if(ERROUT)printf("Problem with creating table !!\n"); return(1); } return(0); } set_old_arg_names(narg) int narg; { int i; for(i=0;i=MAXUFUN) { if(ERROUT)printf("too many functions !!\n"); return(1); } plintf(" Added user fun %s \n",name); convert(name,string); if(len>MXLEN){ len=MXLEN; plintf("Error: name %s too long \n",string); }; strncpy(my_symb[NSYM].name,string,len); my_symb[NSYM].name[len]='\0'; my_symb[NSYM].len=len; my_symb[NSYM].pri=10; my_symb[NSYM].arg=narg; my_symb[NSYM].com=2400+index; NSYM++; strcpy(ufun_names[index],name); return 0; } add_ufun_new(index,narg,rhs,args) char *rhs,args[MAXARG][11]; int narg,index; { int i,l; int end; /* plintf(" compiling function %s \n",rhs); */ if(narg>MAXARG){ plintf("Maximal arguments exceeded \n"); return(1); } if((ufun[index]=(int *)malloc(1024))==NULL) { if(ERROUT)printf("not enough memory!!\n"); return(1); } if((ufun_def[index]=(char *)malloc(MAXEXPLEN))==NULL) { if(ERROUT)printf("not enough memory!!\n"); return(1); } ufun_arg[index].narg=narg; for(i=0;i=MAXUFUN) { if(ERROUT)printf("too many functions !!\n"); return(1); } if((ufun[NFUN]=(int *)malloc(1024))==NULL) { if(ERROUT)printf("not enough memory!!\n"); return(1); } if((ufun_def[NFUN]=(char *)malloc(MAXEXPLEN))==NULL) { if(ERROUT)printf("not enough memory!!\n"); return(1); } convert(junk,string); if(add_expr(expr,ufun[NFUN],&end)==0) { if(len>MXLEN){ len=MXLEN; plintf("Error: name %s too long \n",string); }; strncpy(my_symb[NSYM].name,string,len); my_symb[NSYM].name[len]='\0'; my_symb[NSYM].len=len; my_symb[NSYM].pri=10; my_symb[NSYM].arg=narg; my_symb[NSYM].com=2400+NFUN; NSYM++; /* OLD WAY */ /* ufun[NFUN][end-1]=ENDFUN; ufun[NFUN][end]=narg; ufun[NFUN][end+1]=ENDEXP; */ /* NEW WAY */ ufun[NFUN][end-1]=IENDFUN; ufun[NFUN][end]=narg; ufun[NFUN][end+1]=IENDEXPR; strcpy(ufun_def[NFUN],expr); l=strlen(ufun_def[NFUN]); ufun_def[NFUN][l-1]=0; strcpy(ufun_names[NFUN],junk); narg_fun[NFUN]=narg; for(i=0;i1&&xx<6)return(1); else return(0); } /* IS_UVAR */ is_uvar(x) int x; { int y=x/100; if((y>=100)&&(y<200))return(1); else return(0); } isvar(y) int y; { if((y>=100)&&(y<200))return(1); return 0; } iscnst(y) int y; { if(y>1&&y<6)return(1); return 0; } isker(y) int y; { if(y==10)return(1); return 0; } is_kernel(x) int x; { if((x/100)==10)return(1); else return(0); } is_lookup(x) int x; { if((x/100)==7)return(1); else return(0); } find_lookup(name) char *name; { int index,com; find_name(name,&index); if(index==-1)return(-1); com=my_symb[index].com; if(is_lookup(com))return(com%100); return(-1); } /* FIND_NAME */ find_name(string, index) char *string; int *index; { char junk[100]; int i,len; convert(string,junk); len=strlen(junk); for(i=0;i=my_symb[newtok%THOUS].pri) { command[comptr]=my_symb[oldtok%THOUS].com; /* plintf("com(%d)=%d\n",comptr,command[comptr]); */ if((my_symb[oldtok%THOUS].arg==2)&& (my_symb[oldtok%THOUS].com/100==1)) ncomma--; my_com=command[comptr]; comptr++; /* New code 3/95 */ if(my_com==NUMSYM){ /* plintf("tp=%d ",tokptr); */ tokptr--; /* plintf(" ts[%d]=%d ",tokptr,tokstak[tokptr]); */ command[comptr]=tokstak[tokptr-1]; /* plintf("xcom(%d)=%d\n",comptr,command[comptr]); */ comptr++; tokptr--; command[comptr]=tokstak[tokptr-1]; /* plintf("xcom(%d)=%d\n",comptr,command[comptr]); */ comptr++; } /* end new code 3/95 */ if(my_com==SUMSYM){ loopstk[lptr]=comptr; comptr++; lptr++; ncomma-=1; } if(my_com==ENDSUM){ lptr--; jmp=comptr-loopstk[lptr]-1; command[loopstk[lptr]]=jmp; } if(my_com==MYIF){ loopstk[lptr]=comptr; /* add some space for jump */ comptr++; lptr++; nif++; } if(my_com==MYTHEN){ /* First resolve the if jump */ lptr--; jmp=comptr-loopstk[lptr]; /* -1 is old */ command[loopstk[lptr]]=jmp; /* Then set up for the then jump */ loopstk[lptr]=comptr; lptr++; comptr++; nthen++; } if(my_com==MYELSE){ lptr--; jmp=comptr-loopstk[lptr]-1; command[loopstk[lptr]]=jmp; nelse++; } if(my_com==ENDDELAY||my_com==ENDSHIFT||my_com==ENDISHIFT){ ncomma-=1; } if(my_com==ENDDELSHFT||my_com==ENDSET) ncomma-=2; /* if(my_com==CONV||my_com==DCONV){ ncomma-=1; } */ /* CHECK FOR USER FUNCTION */ if(is_ufun(my_com)) { my_arg=my_symb[oldtok].arg; command[comptr]=my_arg; comptr++; ncomma=ncomma+1-my_arg; } /* USER FUNCTION OKAY */ tokptr--; oldtok=tokstak[tokptr-1]; goto next; } /* NEW code 3/95 */ if(newtok==NUMTOK){ tokstak[tokptr++]=toklist[lstptr++]; tokstak[tokptr++]=toklist[lstptr++]; } /* end 3/95 */ tokstak[tokptr]=newtok; oldtok=newtok; tokptr++; goto getnew; } if(ncomma!=0){ plintf("Illegal number of arguments\n"); return(1); } if((nif!=nelse)||(nif!=nthen)){ plintf("If statement missing ELSE or THEN \n"); return(1); } command[comptr]=my_symb[ENDTOK].com; /* pr_command(command); */ return(0); } pr_command(command) int *command; { int i=0; int token; while(1){ token=command[i]; plintf("%d %d \n",i,token); if(token==ENDEXP)return; i++; } } fpr_command(command) int *command; { int i=0; int token; while(1){ token=command[i]; plintf("%d %d \n",i,token); if(token==IENDEXPR)return; i++; } } show_where(string,index) char *string; int index; { char junk[MAXEXPLEN]; int i; for(i=0;i2&&token<9)return(1); if(token>43&&token<51)return(1); if(token==54)return(1); return(0); } pure_number(token) int token; { int com=my_symb[token].com; int i1=com/100; /* !! */ if(token==NUMTOK||isvar(i1)||iscnst(i1)||isker(i1)||i1==8||token==INDX) return(1); return(0); } gives_number(token) int token; { int com=my_symb[token].com; int i1=com/100; if(token==INDX)return(1); if(token==NUMTOK)return(1); if(i1==0&&!unary_sym(token))return(1); /* single variable functions */ if(i1==1&&!binary_sym(token))return(1); /* two-variable function */ /* !! */ if(i1==8||isvar(i1)||iscnst(i1)||i1==7||i1==6||i1==5||isker(i1)||i1==UFUN)return(1); if(com==MYIF||token==DELSHFTSYM||token==DELSYM||token==SHIFTSYM||token==ISHIFTSYM||com==SUMSYM)return(1); return(0); } check_syntax(oldtoken,newtoken) /* 1 is BAD! */ int oldtoken,newtoken; { int com1=my_symb[oldtoken].com,com2=my_symb[newtoken].com; /* if the first symbol or ( or binary symbol then must be unary symbol or something that returns a number or another ( */ if(unary_sym(oldtoken)||oldtoken==COMMA||oldtoken==STARTTOK ||oldtoken==LPAREN||binary_sym(oldtoken)) { if(unary_sym(newtoken)||gives_number(newtoken)||newtoken==LPAREN)return(0); return(1); } /* if this is a regular function, then better have ( */ if(function_sym(oldtoken)){ if(newtoken==LPAREN)return(0); return(1); } /* if we have a constant or variable or ) or kernel then better have binary symbol or "then" or "else" as next symbol */ if(pure_number(oldtoken)){ if(binary_sym(newtoken)||newtoken==RPAREN ||newtoken==COMMA||newtoken==ENDTOK) return(0); return(1); } if(oldtoken==RPAREN){ if(binary_sym(newtoken)||newtoken==RPAREN ||newtoken==COMMA||newtoken==ENDTOK)return(0); if(com2==MYELSE||com2==MYTHEN||com2==ENDSUM)return(0); return(1); } plintf("Bad token %d \n",oldtoken); return(1); } /****************************** * PARSER * ******************************/ make_toks(dest,my_token) char *dest; int *my_token; { char num[40],junk[10]; double value; int old_tok=STARTTOK,tok_in=0; int index=0,err,token,nparen=0,lastindex=0; union /* WARNING -- ASSUMES 32 bit int and 64 bit double */ { struct { int int1; int int2; } pieces; struct { double z; } num; } encoder; while(dest[index]!='\0') { lastindex=index; find_tok(dest,&index,&token); if((token==MINUS)&& ((old_tok==STARTTOK)||(old_tok==COMMA)||(old_tok==LPAREN))) token=NEGATE; if(token==LPAREN)++nparen; if(token==RPAREN)--nparen; if(token==NSYM) { if(do_num(dest,num,&value,&index)){ show_where(dest,index); return(1); } /* new code 3/95 */ encoder.num.z=value; my_token[tok_in++]=NUMTOK; my_token[tok_in++]=encoder.pieces.int1; my_token[tok_in++]=encoder.pieces.int2; if(check_syntax(old_tok,NUMTOK)==1){ plintf("Illegal syntax \n"); show_where(dest,lastindex); return(1); } old_tok=NUMTOK; } else { my_token[tok_in++]=token; if(check_syntax(old_tok,token)==1){ plintf("Illegal syntax (Ref:%d %d) \n",old_tok,token); show_where(dest,lastindex); tokeninfo(old_tok); tokeninfo(token); return(1); } old_tok=token; } } my_token[tok_in++]=ENDTOK; if(check_syntax(old_tok,ENDTOK)==1){ plintf("Premature end of expression \n"); show_where(dest,lastindex); return(1); } if(nparen!=0) { if(ERROUT)printf(" parentheses don't match\n"); return(1); } return(0); } tokeninfo(tok) int tok; { plintf(" %s %d %d %d %d \n", my_symb[tok].name,my_symb[tok].len,my_symb[tok].com, my_symb[tok].arg,my_symb[tok].pri); } do_num(source,num,value,ind) char *source,*num; double *value; int *ind; { int j=0,i=*ind,error=0; int ndec=0,nexp=0,ndig=0; char ch,oldch; oldch='\0'; *value=0.0; while(1) { ch=source[i]; if(((ch=='+')||(ch=='-'))&&(oldch!='E'))break; if((ch=='*')||(ch=='^')||(ch=='/')||(ch==',')||(ch==')')||(ch=='\0') || (ch=='|') || (ch=='>') || (ch=='<') || (ch=='&') || (ch=='='))break; if((ch=='E')||(ch=='.')||(ch=='+')||(ch=='-')||isdigit(ch)) { if(isdigit(ch))ndig++; switch(ch) { case 'E': nexp++; if((nexp==2)||(ndig==0))goto err;break; case '.': ndec++; if((ndec==2)||(nexp==1))goto err;break; } num[j]=ch; j++; i++; oldch=ch; } else { err: num[j]=ch; j++; error=1; break; } } num[j]='\0'; if(error==0)*value=atof(num); else if(ERROUT)printf(" illegal expression: %s\n",num); *ind=i; return(error); } convert(source,dest) char *source,*dest; { char ch; int i=0,j=0; while (1) { ch=source[i]; if(!isspace(ch))dest[j++]=ch; i++; if(ch=='\0')break; } strupr(dest); } find_tok(source,index,tok) char *source; int *index,*tok; { int i=*index,maxlen=0,symlen; int k,j,my_tok,match; my_tok=NSYM; for(k=0;k0;j--) { bim=bip+j*tox*bi; bip=bi; bi=bim; if (fabs(bi) > BIGNO) { ans *= BIGNI; bi *= BIGNI; bip *= BIGNI; } if (j == n) ans=bip; } ans *= bessi0(x)/bi; return x < 0.0 && (n & 1) ? -ans : ans; } } double bessi0(x) double x; { double ax,ans; double y; if ((ax=fabs(x)) < 3.75) { y=x/3.75; y*=y; ans=1.0+y*(3.5156229+y*(3.0899424+y*(1.2067492 +y*(0.2659732+y*(0.360768e-1+y*0.45813e-2))))); } else { y=3.75/ax; ans=(exp(ax)/sqrt(ax))*(0.39894228+y*(0.1328592e-1 +y*(0.225319e-2+y*(-0.157565e-2+y*(0.916281e-2 +y*(-0.2057706e-1+y*(0.2635537e-1+y*(-0.1647633e-1 +y*0.392377e-2)))))))); } return ans; } double bessi1(x) double x; { double ax,ans; double y; if ((ax=fabs(x)) < 3.75) { y=x/3.75; y*=y; ans=ax*(0.5+y*(0.87890594+y*(0.51498869+y*(0.15084934 +y*(0.2658733e-1+y*(0.301532e-2+y*0.32411e-3)))))); } else { y=3.75/ax; ans=0.2282967e-1+y*(-0.2895312e-1+y*(0.1787654e-1 -y*0.420059e-2)); ans=0.39894228+y*(-0.3988024e-1+y*(-0.362018e-2 +y*(0.163801e-2+y*(-0.1031555e-1+y*ans)))); ans *= (exp(ax)/sqrt(ax)); } return x < 0.0 ? -ans : ans; } #undef ACC #undef BIGNO #undef BIGNI /* double pow2(z,w) double z,w; { return(pow(z,w)); double sign=1.0; if(floor(w)==w){ if(z<0.0)sign=-1.0; if(fabs(fmod(w,2.0))<1.e-10)sign=1.0; return(sign*pow(fabs(z),w)); } else return(pow(fabs(z),w)); } */ /********************************************* FANCY DELAY HERE *-------------------------<<< *********************************************/ char *com_name(com) int com; { int i; for( i=0;i1)&&(it<6)){ in=i-200; in+=ish; if(in>NCON) return 0.0; else{ constants[in]=value; return value; } } if((it>99)&&(it<113)){ in=i-10000; in+=ish; if(in>MAXODE) return 0.0; else { variables[in]=value; return value; } } plintf("This can't happen: Invalid symbol index for SHIFT\n"); return 0.0; } double do_ishift(shift,variable) double shift,variable; { return shift+variable; } double do_shift(shift,variable) double shift,variable; { int it, in; int i=(int)(variable),ish=(int)shift; /* plintf( "shifting %d (%s) by %d to %d (%s)\n", (int)variable, com_name((int)variable), (int)shift, i, com_name(i) ); */ if(i<0) return(0.0); /* plintf("shift=%g variable=%g \n",shift,variable); */ it=i/100; if((it>1)&&(it<6)){ in=i-200; in+=ish; if(in>NCON) return 0.0; else return constants[in]; } if((it>99)&&(it<113)){ in=i-10000; in+=ish; if(in>MAXODE) return 0.0; else return variables[in]; } plintf("This can't happen: Invalid symbol index for SHIFT\n"); return 0.0; } double do_delay_shift(delay,shift,variable) double delay,shift,variable; { int it, in; int i=(int)(variable),ish=(int)shift; if(i<0) return(0.0); in=i-10000+ish; if(in>MAXODE) return 0.0; if(del_stab_flag>0){ if(DelayFlag&&delay>0.0) return(get_delay(in-1,delay)); return(variables[in]); } return(delay_stab_eval(delay,in)); } double do_delay(delay,i) double delay,i; { double z; int variable, it, in; variable=i-10000; if(del_stab_flag>0){ if(DelayFlag&&delay>0.0) return(get_delay(variable-1,delay)); return(variables[variable]); } return(delay_stab_eval(delay,(int)variable)); } /* double Exp(z) double z; { if(z>700)return(1.01423e+304); return(exp(z)); } double Ln(z) double z; { if(z<1e-320)return(-736.82724); return(log(z)); } double Log10(z) double z; { if(z<1e-320)return(-320.); return(log10(z)); } */ one_arg() { fun1[0]=zz_sin; fun1[1]=zz_cos; fun1[2]=zz_tan; fun1[3]=zz_asin; fun1[4]=zz_acos; fun1[5]=zz_atan; fun1[6]=zz_sinh; fun1[7]=zz_tanh; fun1[8]=zz_cosh; fun1[9]=zz_fabs; fun1[10]=zz_exp; fun1[11]=zz_log; fun1[12]=zz_log10; fun1[13]=zz_sqrt; fun1[14]=zz_neg; fun1[15]=zz_recip; fun1[16]=zz_heaviside; fun1[17]=zz_signum; fun1[18]=zz_floor; fun1[19]=zz_rndom; fun1[20]=zz_dnot; fun1[21]=zz_erf; fun1[22]=zz_erfc; fun1[23]=zz_hom_bcs; fun1[24]=zz_pois; fun1[25]=zz_lgamma; } double normal(mean,std) double mean,std; { double fac,r,v1,v2; if(BoxMullerFlag==0){ do { v1=2.0*ndrand48()-1.0; v2=2.0*ndrand48()-1.0; r=v1*v1+v2*v2; } while(r>=1.0); fac=sqrt(-2.0*log(r)/r); BoxMuller=v1*fac; BoxMullerFlag=1; return(v2*fac*std+mean); } else { BoxMullerFlag=0; return(BoxMuller*std+mean); } } double max(x,y) double x,y; { return(((x>y)?x:y)); } double min(x,y) double x,y; { return(((x0.0)return(1.0); return(0.0); } /* logical stuff */ double dnot(x) double x; { return((double)(x==0.0)); } double dand(x,y) double x,y; { return((double)(x&&y)); } double dor(x,y) double x,y; { return((double)(x||y)); } double dge(x,y) double x,y; { return((double)(x>=y)); } double dle(x,y) double x,y; { return((double)(x<=y)); } double deq(x,y) double x,y; { return((double)(x==y)); } double dne(x,y) double x,y; { return((double)(x!=y)); } double dgt(x,y) double x,y; { return((double)(x>y)); } double dlt(x,y) double x,y; { return((double)(x #include #include "xpplim.h" float **storage; double *WORK; int MAXSTOR,storind; int IWORK[10000]; extern int NODE,NMarkov; extern int METHOD; #define BACKEUL 7 #define VOLTERRA 6 #define STIFF 9 #define GEAR 5 #define RB23 13 #define SYMPLECT 14 typedef struct { int nvec,node; double *x; } XPPVEC; extern XPPVEC xpv; void init_alloc_info() { int i; xpv.node=NODE+NMarkov; xpv.nvec=0; /* this is just for now */ xpv.x=(double *)malloc((xpv.nvec+xpv.node)*sizeof(double)); /* plintf(" node=%d nvec=%d \n",xpv.node,xpv.nvec); */ for(i=xpv.node;i<(xpv.nvec+xpv.node);i++) xpv.x[i]=0.0; } void alloc_meth() { int nn=xpv.node+xpv.nvec; int sz=30*nn; switch(METHOD){ case STIFF: sz=2*nn*nn+13*nn+100; break; case GEAR: sz=30*nn+nn*nn+100; break; case BACKEUL: case VOLTERRA: sz=10*nn+nn*nn+100; break; case RB23: sz=12*nn+100+nn*nn; break; } if(WORK) free(WORK); WORK=(double *)malloc(sz*sizeof(double)); /* plintf(" I have allocated %d doubles \n",sz); */ } void init_stor(nrow,ncol) int nrow,ncol; { int i; /* WORK=(double *)malloc(WORKSIZE*sizeof(double)); if(WORK!=NULL){ */ WORK=NULL; storage=(float **)malloc((MAXODE+1)*sizeof(float *)); MAXSTOR=nrow; storind=0; if(storage!=NULL){ i=0; while((storage[i]=(float *)malloc(nrow*sizeof(float)))!=NULL){ i++; if(i==ncol)return; } } /* } */ /* plintf("col=%d\n",i); */ err_msg("Cannot allocate sufficient storage"); exit(0); } void free_storage(ncol) int ncol; { int i; for(i=0;i #include "userbut.h" #include "volterra2.h" #include "storage.h" #include "tabular.h" #include #include #include #include "xpplim.h" #define PARAM 1 #define IC 2 #define MAX_INTERN_SET 100 #define DFNORMAL 1 #define MAXOPT 1000 #define READEM 1 extern OptionsSet notAlreadySet; int nsrand48(int seed); char *interopt[MAXOPT]; int Nopts=0; int RunImmediately=0; extern char dll_lib[256]; extern char dll_fun[256]; extern int dll_flag; extern char UserBlack[8]; extern char UserWhite[8]; extern char UserMainWinColor[8]; extern char UserDrawWinColor[8]; extern char UserBGBitmap[100]; extern int UserGradients; extern int UserMinWidth; extern int UserMinHeight; extern int XPPVERBOSE; extern FILE *logfile; extern int OVERRIDE_QUIET; extern int OVERRIDE_LOGFILE; typedef struct { char *name; char *does; unsigned int use; } INTERN_SET; extern int XNullColor,YNullColor,StableManifoldColor,UnstableManifoldColor; int IX_PLT[10],IY_PLT[10],IZ_PLT[10],NPltV; int START_LINE_TYPE=1; INTERN_SET intern_set[MAX_INTERN_SET]; int Nintern_set=0; extern int STOCH_FLAG; extern char uvar_names[MAXODE][12]; extern struct { char item[30],item2[30]; int steps,steps2,reset,oldic,index,index2,cycle,type,type2,movie; double plow,phigh,plow2,phigh2; int rtype; } range; extern int custom_color; extern int del_stab_flag; extern int MaxPoints; extern double THETA0,PHI0; extern int tfBell; /*void set_option(char *s1,char *s2); */ double atof(); char *get_first(); char *get_next(); /* this file has all of the phaseplane parameters defined and created. All other files should use external stuff to use them. (Except eqn forming stuff) */ extern char batchout[256]; extern int batch_range; double last_ic[MAXODE]; extern char big_font_name[100],small_font_name[100]; extern int PaperWhite; extern int PSColorFlag,PS_FONTSIZE,PS_Color; extern char PS_FONT[100]; extern double PS_LW; extern int SEc,UEc,SPc,UPc; int (*solver)(); int rung_kut(); char delay_string[MAXODE][80]; int itor[MAXODE]; char this_file[100]; float oldhp_x,oldhp_y,my_pl_wid,my_pl_ht; int mov_ind; int storind,STORFLAG,INFLAG,MAXSTOR; double x_3d[2],y_3d[2],z_3d[2]; int IXPLT,IYPLT,IZPLT; int AXES,TIMPLOT,PLOT_3D; double MY_XLO,MY_YLO,MY_XHI,MY_YHI; double TOR_PERIOD; int TORUS; int NEQ; char options[100]; /* Numerical stuff .... */ double DELTA_T,TEND,T0,TRANS, NULL_ERR,EVEC_ERR,NEWT_ERR; double BOUND,DELAY,TOLER,ATOLER,HMIN,HMAX; double BVP_EPS,BVP_TOL; double POIPLN; extern int RandSeed; int MaxEulIter; double EulTol; extern int cv_bandflag,cv_bandupper,cv_bandlower; int NMESH,NJMP,METHOD,color_flag,NC_ITER; int EVEC_ITER; int BVP_MAXIT,BVP_FLAG; int POIMAP,POIVAR,POISGN,SOS; int FFT,NULL_HERE,POIEXT; int HIST,HVAR,hist_ind,FOREVER; /* control of range stuff */ int PAUSER,ENDSING,SHOOT,PAR_FOL; /* AUTO STUFF */ extern int auto_ntst,auto_nmx,auto_npr,auto_ncol; extern double auto_ds, auto_dsmax, auto_dsmin; extern double auto_rl0,auto_rl1,auto_a0,auto_a1; extern double auto_epss,auto_epsl,auto_epsu; extern int auto_var; extern double auto_xmin,auto_xmax,auto_ymin,auto_ymax; extern int PSFlag; int xorfix,silent,got_file; /*Logical negate OR on options set. Result overwrites the first OptionsSet in the argument list.*/ void notBothOptions(OptionsSet nasA,OptionsSet nasB) { nasA.BIG_FONT_NAME = (nasA.BIG_FONT_NAME & nasB.BIG_FONT_NAME); nasA.SMALL_FONT_NAME = (nasA.SMALL_FONT_NAME & nasB.SMALL_FONT_NAME); nasA.BACKGROUND = (nasA.BACKGROUND & nasB.BACKGROUND); nasA.IXPLT = (nasA.IXPLT & nasB.IXPLT); nasA.IYPLT = (nasA.IYPLT & nasB.IYPLT); nasA.IZPLT = (nasA.IZPLT & nasB.IZPLT); nasA.AXES = (nasA.AXES & nasB.AXES); nasA.NMESH = (nasA.NMESH & nasB.NMESH); nasA.METHOD = (nasA.METHOD & nasB.METHOD); nasA.TIMEPLOT = (nasA.TIMEPLOT & nasB.TIMEPLOT); nasA.MAXSTOR = (nasA.MAXSTOR & nasB.MAXSTOR); nasA.TEND = (nasA.TEND & nasB.TEND); nasA.DT = (nasA.DT & nasB.DT); nasA.T0 = (nasA.T0 & nasB.T0); nasA.TRANS = (nasA.TRANS & nasB.TRANS); nasA.BOUND = (nasA.BOUND & nasB.BOUND); nasA.TOLER = (nasA.TOLER & nasB.TOLER); nasA.DELAY = (nasA.DELAY & nasB.DELAY); nasA.XLO = (nasA.XLO & nasB.XLO); nasA.XHI = (nasA.XHI & nasB.XHI); nasA.YLO = (nasA.YLO & nasB.YLO); nasA.YHI = (nasA.YHI & nasB.YHI); nasA.UserBlack = (nasA.UserBlack & nasB.UserBlack); nasA.UserWhite = (nasA.UserWhite & nasB.UserWhite); nasA.UserMainWinColor = (nasA.UserMainWinColor & nasB.UserMainWinColor); nasA.UserDrawWinColor = (nasA.UserDrawWinColor & nasB.UserDrawWinColor); nasA.UserGradients = (nasA.UserGradients & nasB.UserGradients); nasA.UserBGBitmap = (nasA.UserBGBitmap & nasB.UserBGBitmap); nasA.UserMinWidth = (nasA.UserMinWidth & nasB.UserMinWidth); nasA.UserMinHeight = (nasA.UserMinHeight & nasB.UserMinHeight); nasA.YNullColor = (nasA.YNullColor & nasB.YNullColor); nasA.XNullColor = (nasA.XNullColor & nasB.XNullColor); nasA.StableManifoldColor = (nasA.StableManifoldColor & nasB.StableManifoldColor); nasA.UnstableManifoldColor = (nasA.UnstableManifoldColor & nasB.UnstableManifoldColor); nasA.START_LINE_TYPE = (nasA.START_LINE_TYPE & nasB.START_LINE_TYPE); nasA.RandSeed = (nasA.RandSeed & nasB.SMALL_FONT_NAME); nasA.PaperWhite = (nasA.PaperWhite & nasB.PaperWhite); nasA.COLORMAP = (nasA.COLORMAP & nasB.COLORMAP); nasA.NPLOT = (nasA.NPLOT & nasB.NPLOT); nasA.DLL_LIB = (nasA.DLL_LIB & nasB.DLL_LIB); nasA.DLL_FUN = (nasA.DLL_FUN & nasB.DLL_FUN); nasA.XP = (nasA.XP & nasB.XP); nasA.YP = (nasA.YP & nasB.YP); nasA.ZP = (nasA.ZP & nasB.ZP); nasA.NOUT = (nasA.NOUT & nasB.NOUT); nasA.VMAXPTS = (nasA.VMAXPTS & nasB.VMAXPTS); nasA.TOR_PER = (nasA.TOR_PER & nasB.TOR_PER); nasA.JAC_EPS = (nasA.JAC_EPS & nasB.JAC_EPS); nasA.NEWT_TOL = (nasA.NEWT_TOL & nasB.NEWT_TOL); nasA.NEWT_ITER = (nasA.NEWT_ITER & nasB.NEWT_ITER); nasA.FOLD = (nasA.FOLD & nasB.FOLD); nasA.DTMIN = (nasA.DTMIN & nasB.DTMIN); nasA.DTMAX = (nasA.DTMAX & nasB.DTMAX); nasA.ATOL = (nasA.ATOL & nasB.ATOL); nasA.TOL = (nasA.TOL & nasB.TOL); nasA.BANDUP = (nasA.BANDUP & nasB.BANDUP); nasA.BANDLO = (nasA.BANDLO & nasB.BANDLO); nasA.PHI = (nasA.PHI & nasB.PHI); nasA.THETA = (nasA.THETA & nasB.THETA); nasA.XMIN = (nasA.XMIN & nasB.XMIN); nasA.XMAX = (nasA.XMAX & nasB.XMAX); nasA.YMIN = (nasA.YMIN & nasB.YMIN); nasA.YMAX = (nasA.YMAX & nasB.YMAX); nasA.ZMIN = (nasA.ZMIN & nasB.ZMIN); nasA.ZMAX = (nasA.ZMAX & nasB.ZMAX); nasA.POIVAR = (nasA.POIVAR & nasB.POIVAR); nasA.OUTPUT = (nasA.OUTPUT & nasB.OUTPUT); nasA.POISGN = (nasA.POISGN & nasB.POISGN); nasA.POIEXT = (nasA.POIEXT & nasB.POIEXT); nasA.POISTOP = (nasA.POISTOP & nasB.POISTOP); nasA.STOCH = (nasA.STOCH & nasB.STOCH); nasA.POIPLN = (nasA.POIPLN & nasB.POIPLN); nasA.POIMAP = (nasA.POIMAP & nasB.POIMAP); nasA.RANGEOVER = (nasA.RANGEOVER & nasB.RANGEOVER); nasA.RANGESTEP = (nasA.RANGESTEP & nasB.RANGESTEP); nasA.RANGELOW = (nasA.RANGELOW & nasB.RANGELOW); nasA.RANGEHIGH = (nasA.RANGEHIGH & nasB.RANGEHIGH); nasA.RANGERESET = (nasA.RANGERESET & nasB.RANGERESET); nasA.RANGEOLDIC = (nasA.RANGEOLDIC & nasB.RANGEOLDIC); nasA.RANGE = (nasA.RANGE & nasB.RANGE); nasA.NTST = (nasA.NTST & nasB.NTST); nasA.NMAX = (nasA.NMAX & nasB.NMAX); nasA.NPR = (nasA.NPR & nasB.NPR); nasA.NCOL = (nasA.NCOL & nasB.NCOL); nasA.DSMIN = (nasA.DSMIN & nasB.DSMIN); nasA.DSMAX = (nasA.DSMAX & nasB.DSMAX); nasA.DS = (nasA.DS & nasB.DS); nasA.PARMAX = (nasA.PARMAX & nasB.PARMAX); nasA.NORMMIN = (nasA.NORMMIN & nasB.NORMMIN); nasA.NORMMAX = (nasA.NORMMAX & nasB.NORMMAX); nasA.EPSL = (nasA.EPSL & nasB.EPSL); nasA.EPSU = (nasA.EPSU & nasB.EPSU); nasA.EPSS = (nasA.EPSS & nasB.EPSS); nasA.RUNNOW = (nasA.RUNNOW & nasB.RUNNOW); nasA.SEC = (nasA.SEC & nasB.SEC); nasA.UEC = (nasA.UEC & nasB.UEC); nasA.SPC = (nasA.SPC & nasB.SPC); nasA.UPC = (nasA.UPC & nasB.UPC); nasA.AUTOEVAL = (nasA.AUTOEVAL & nasB.AUTOEVAL); nasA.AUTOXMAX = (nasA.AUTOXMAX & nasB.AUTOXMAX); nasA.AUTOYMAX = (nasA.AUTOYMAX & nasB.AUTOYMAX); nasA.AUTOXMIN = (nasA.AUTOXMIN & nasB.AUTOXMIN); nasA.AUTOYMIN = (nasA.AUTOYMIN & nasB.AUTOYMIN); nasA.AUTOVAR = (nasA.AUTOVAR & nasB.AUTOVAR); nasA.PS_FONT = (nasA.PS_FONT & nasB.PS_FONT); nasA.PS_LW = (nasA.PS_LW & nasB.PS_LW ); nasA.PS_FSIZE = (nasA.PS_FSIZE & nasB.PS_FSIZE); nasA.PS_COLOR = (nasA.PS_COLOR & nasB.PS_COLOR); nasA.FOREVER = (nasA.FOREVER & nasB.FOREVER); nasA.BVP_TOL = (nasA.BVP_TOL & nasB.BVP_TOL); nasA.BVP_EPS = (nasA.BVP_EPS & nasB.BVP_EPS); nasA.BVP_MAXIT = (nasA.BVP_MAXIT & nasB.BVP_MAXIT); nasA.BVP_FLAG = (nasA.BVP_FLAG & nasB.BVP_FLAG); nasA.SOS = (nasA.SOS & nasB.SOS); nasA.FFT = (nasA.FFT & nasB.FFT); nasA.HIST = (nasA.HIST & nasB.HIST); nasA.PSFlag = (nasA.PSFlag & nasB.PSFlag); nasA.ATOLER = (nasA.ATOLER & nasB.ATOLER); nasA.MaxEulIter = (nasA.MaxEulIter & nasB.MaxEulIter); nasA.EulTol = (nasA.EulTol & nasB.EulTol); nasA.EVEC_ITER = (nasA.EVEC_ITER & nasB.EVEC_ITER); nasA.EVEC_ERR = (nasA.EVEC_ERR & nasB.EVEC_ERR); nasA.NULL_ERR = (nasA.NULL_ERR & nasB.NULL_ERR); nasA.NEWT_ERR = (nasA.NEWT_ERR & nasB.NEWT_ERR); nasA.NULL_HERE = (nasA.NULL_HERE & nasB.NULL_HERE); } void dump_torus(fp,f) FILE *fp; int f; { int i; char bob[256]; if(f==READEM) fgets(bob,255,fp); else fprintf(fp,"# Torus information \n"); io_int(&TORUS,fp,f," Torus flag 1=ON"); io_double(&TOR_PERIOD,fp,f,"Torus period"); if(TORUS){ for(i=0;i2){IZPLT=2;} NPltV=1; for(i=0;i<10;i++){ IX_PLT[i]=IXPLT; IY_PLT[i]=IYPLT; IZ_PLT[i]=IZPLT; } notAlreadySet.NPLOT=0; } /* internal options go here */ if((fp=fopen(options,"r"))!=NULL) { read_defaults(fp); fclose(fp); } custom_color=0; init_range(); init_trans(); init_my_aplot(); init_txtview(); set_internopts(NULL); chk_volterra(); /* */ if(IZPLT>NEQ)IZPLT=NEQ; if(IYPLT>NEQ)IYPLT=NEQ; if(IXPLT==0||IYPLT==0) TIMPLOT=1; else TIMPLOT=0; if(x_3d[0]>=x_3d[1]){ x_3d[0]=-1; x_3d[1]=1; } if(y_3d[0]>=y_3d[1]){ y_3d[0]=-1; y_3d[1]=1; } if(z_3d[0]>=z_3d[1]){ z_3d[0]=-1; z_3d[1]=1; } if(MY_XLO>=MY_XHI){ MY_XLO=-2.0; MY_XHI=2.0; } if(MY_YLO>=MY_YHI){ MY_YLO=-2.0; MY_YHI=2.0; } if(AXES<5){ x_3d[0]=MY_XLO; y_3d[0]=MY_YLO; x_3d[1]=MY_XHI; y_3d[1]=MY_YHI; } init_stor(MAXSTOR,NEQ+1); if(AXES>=5)PLOT_3D=1; chk_delay(); /* check for delay allocation */ alloc_h_stuff(); alloc_v_memory(); /* allocate stuff for volterra equations */ alloc_meth(); arr_ic_start(); /* take care of all predefined array ics */ } void read_defaults(fp) FILE *fp; { char bob[100]; char *ptr; fgets(bob,80,fp); ptr=get_first(bob," "); if (notAlreadySet.BIG_FONT_NAME) { strcpy(big_font_name,ptr); notAlreadySet.BIG_FONT_NAME=0; } fgets(bob,80,fp); ptr=get_first(bob," "); if (notAlreadySet.SMALL_FONT_NAME) { strcpy(small_font_name,ptr); printf("Setting small_font_name here %s\n",small_font_name); notAlreadySet.SMALL_FONT_NAME=0; } if (notAlreadySet.PaperWhite){fil_int(fp,&PaperWhite);notAlreadySet.PaperWhite=0;}; if (notAlreadySet.IXPLT){fil_int(fp,&IXPLT);notAlreadySet.IXPLT=0;}; if (notAlreadySet.IYPLT){fil_int(fp,&IYPLT);notAlreadySet.IYPLT=0;}; if (notAlreadySet.IZPLT){fil_int(fp,&IZPLT);notAlreadySet.IZPLT=0;}; if (notAlreadySet.AXES){fil_int(fp,&AXES);notAlreadySet.PaperWhite=0;}; if (notAlreadySet.NOUT){fil_int(fp,&NJMP);notAlreadySet.NOUT=0;}; if (notAlreadySet.NMESH){fil_int(fp,&NMESH);notAlreadySet.NMESH=0;}; if (notAlreadySet.METHOD){fil_int(fp,&METHOD);notAlreadySet.METHOD=0;}; if (notAlreadySet.TIMEPLOT){fil_int(fp,&TIMPLOT);notAlreadySet.TIMEPLOT=0;}; if (notAlreadySet.MAXSTOR){fil_int(fp,&MAXSTOR);notAlreadySet.MAXSTOR=0;}; if (notAlreadySet.TEND){fil_flt(fp,&TEND);notAlreadySet.TEND=0;}; if (notAlreadySet.DT){fil_flt(fp,&DELTA_T);notAlreadySet.DT=0;}; if (notAlreadySet.T0){fil_flt(fp,&T0);notAlreadySet.T0=0;}; if (notAlreadySet.TRANS){fil_flt(fp,&TRANS);notAlreadySet.TRANS=0;}; if (notAlreadySet.BOUND){fil_flt(fp,&BOUND);notAlreadySet.BOUND=0;}; if (notAlreadySet.DTMIN){fil_flt(fp,&HMIN);notAlreadySet.DTMIN=0;}; if (notAlreadySet.DTMAX){fil_flt(fp,&HMAX);notAlreadySet.DTMIN=0;}; if (notAlreadySet.TOLER){fil_flt(fp,&TOLER);notAlreadySet.TOLER=0;}; if (notAlreadySet.DELAY){fil_flt(fp,&DELAY);notAlreadySet.DELAY=0;}; if (notAlreadySet.XLO){fil_flt(fp,&MY_XLO);notAlreadySet.XLO=0;}; if (notAlreadySet.XHI){fil_flt(fp,&MY_XHI);notAlreadySet.XHI=0;}; if (notAlreadySet.YLO){fil_flt(fp,&MY_YLO);notAlreadySet.YLO=0;}; if (notAlreadySet.YHI){fil_flt(fp,&MY_YHI);notAlreadySet.YHI=0;}; } void fil_flt(fpt,val) FILE *fpt; double *val; { char bob[80]; fgets(bob,80,fpt); *val=atof(bob); } void fil_int(fpt,val) int *val; FILE *fpt; { char bob[80]; fgets(bob,80,fpt); *val=atoi(bob); } /* here is some new code for internal set files: format of the file is a long string of the form: { x=y, z=w, q=p , .... } */ void add_intern_set(name,does) char *name,*does; { char bob[256],ch; int i,n,j=Nintern_set,k=0; if(Nintern_set>=MAX_INTERN_SET){ plintf(" %s not added -- too many must be less than %d \n", name,MAX_INTERN_SET); return; } intern_set[j].use=1; n=strlen(name); intern_set[j].name=(char *)malloc((n+1)); strcpy(intern_set[j].name,name); n=strlen(does); bob[0]='$'; bob[1]=' '; k=2; for(i=0;i0&&strlen(value)>0) do_intern_set(name,value); } } void extract_internset(j) int j; { extract_action(intern_set[j].does); } void do_intern_set(name1,value) char *name1,*value; { int i; char name[20]; convert(name1,name); i=find_user_name(IC,name); if(i>-1){ last_ic[i]=atof(value); } else { i=find_user_name(PARAM,name); if(i>-1){ set_val(name,atof(value)); } else { /* set_option(name,value,0,NULL); */ set_option(name,value,1,NULL); } } alloc_meth(); do_meth(); } /* ODE options stuff here !! */ int msc(s1,s2) char *s1,*s2; { int n=strlen(s1),i; if(strlen(s2)0&&strlen(value)>0) { /* if (strcmp("mwcolor",name)==0) { if (strlen(UserMainWinColor)!=0) { continue; } } if (strcmp("dwcolor",name)==0) { if (strlen(UserDrawWinColor)!=0) { continue; } } if (strcmp("forecolor",name)==0) { if (strlen(UserWhite)!=0) { continue; } } if (strcmp("backcolor",name)==0) { if (strlen(UserBlack)!=0) { continue; } } if (strcmp("backimage",name)==0) { if (strlen(UserBGBitmap)!=0) { continue; } } if (strcmp("smallfont",name)==0) { if (strlen(small_font_name)!=0) { continue; } } if (strcmp("bigfont",name)==0) { if (strlen(big_font_name)!=0) { continue; } } */ set_option(name,value,0,mask); } } } for(i=0;i0&&strlen(value)>0) { set_option(name,value,0,tempNAS); } } } free(tempNAS); /* We leave a fresh start for options specified in the ODE file. */ for(i=0;iMAXOPT){ plintf("WARNING -- to many options set %s ignored\n",s1); return; } interopt[Nopts]=(char *)malloc(n+1); sprintf(interopt[Nopts],"%s",s1); Nopts++; } void set_option(s1,s2,force,mask) char *s1,*s2; int force; OptionsSet *mask; { int i,j,f; char xx[4],yy[4],zz[4]; static char mkey[]="demragvbqsc582y"; static char Mkey[]="DEMRAGVBQSC582Y"; strupr(s1); if(msc("QUIET",s1)){ if(!(msc(s2,"0")||msc(s2,"1"))) { plintf("QUIET option must be 0 or 1.\n"); exit(-1); } if (OVERRIDE_QUIET==0)/*Will be 1 if -quiet was specified on the command line.*/ { XPPVERBOSE=(atoi(s2)==0); } return; } if(msc("LOGFILE",s1)){ if (OVERRIDE_LOGFILE==0) /*Will be 1 if -logfile was specified on the command line.*/ { if (logfile != NULL) { fclose(logfile); } logfile=fopen(s2,"w"); } return; } if(msc("BELL",s1)){ if(!(msc(s2,"0")||msc(s2,"1"))) { plintf("BELL option must be 0 or 1.\n"); exit(-1); } tfBell=atoi(s2); return; } if(msc("BUT",s1)){ add_user_button(s2); return; } if((msc("BIGFONT",s1))||(msc("BIG",s1))){ if ((notAlreadySet.BIG_FONT_NAME||force) || ((mask!=NULL)&&(mask->BIG_FONT_NAME==1))) { strcpy(big_font_name,s2); notAlreadySet.BIG_FONT_NAME=0; } return; } if((msc("SMALLFONT",s1))||(msc("SMALL",s1))){; if ((notAlreadySet.SMALL_FONT_NAME||force) || ((mask!=NULL)&&(mask->SMALL_FONT_NAME==1))) { strcpy(small_font_name,s2); notAlreadySet.SMALL_FONT_NAME=0; } return; } if(msc("FORECOLOR",s1)){ if ((notAlreadySet.UserBlack||force) || ((mask!=NULL)&&(mask->UserBlack==1))) { sprintf(UserBlack,"#%s",s2); notAlreadySet.UserBlack=0; } return; } if(msc("BACKCOLOR",s1)){ if ((notAlreadySet.UserWhite||force) || ((mask!=NULL)&&(mask->UserWhite==1))) { sprintf(UserWhite,"#%s",s2); notAlreadySet.UserWhite=0; } return; } if(msc("MWCOLOR",s1)){ if ((notAlreadySet.UserMainWinColor||force) || ((mask!=NULL)&&(mask->UserMainWinColor==1))) { sprintf(UserMainWinColor,"#%s",s2); notAlreadySet.UserMainWinColor=0; } return; } if(msc("DWCOLOR",s1)){ if ((notAlreadySet.UserDrawWinColor||force) || ((mask!=NULL)&&(mask->UserDrawWinColor==1))) { sprintf(UserDrawWinColor,"#%s",s2); notAlreadySet.UserDrawWinColor=0; } return; } if(msc("GRADS",s1)){ if ((notAlreadySet.UserGradients||force) || ((mask!=NULL)&&(mask->UserGradients==1))) { if(!(msc(s2,"0")||msc(s2,"1"))) { plintf("GRADS option must be 0 or 1.\n"); exit(-1); } UserGradients=atoi(s2); notAlreadySet.UserGradients=0; } return; } if(msc("BACKIMAGE",s1)){ if ((notAlreadySet.UserBGBitmap||force) || ((mask!=NULL)&&(mask->UserBGBitmap==1))) { strcpy(UserBGBitmap,s2); notAlreadySet.UserBGBitmap=0; } return; } if(msc("WIDTH",s1)){ if ((notAlreadySet.UserMinWidth||force)|| ((mask!=NULL)&&(mask->UserMinWidth==1))) { UserMinWidth=atoi(s2); notAlreadySet.UserMinWidth=0; } return; } if(msc("HEIGHT",s1)){ if ((notAlreadySet.UserMinHeight||force) || ((mask!=NULL)&&(mask->UserMinHeight==1))) { UserMinHeight=atoi(s2); notAlreadySet.UserMinHeight=0; } return; } if(msc("YNC",s1)){ if ((notAlreadySet.YNullColor||force) || ((mask!=NULL)&&(mask->YNullColor==1))) { i=atoi(s2); if(i>-1&&i<11) { YNullColor=i; } notAlreadySet.YNullColor=0; } return; } if(msc("XNC",s1)){ if ((notAlreadySet.XNullColor||force) || ((mask!=NULL)&&(mask->XNullColor==1))) { i=atoi(s2); if(i>-1&&i<11) { XNullColor=i; notAlreadySet.XNullColor=0; } } return; } if(msc("SMC",s1)){ if ((notAlreadySet.StableManifoldColor||force) || ((mask!=NULL)&&(mask->StableManifoldColor==1))) { i=atoi(s2); if(i>-1&&i<11) { StableManifoldColor=i; notAlreadySet.StableManifoldColor=0; } } return; } if(msc("UMC",s1)){ if ((notAlreadySet.UnstableManifoldColor||force) || ((mask!=NULL)&&(mask->UnstableManifoldColor==1))) { i=atoi(s2); if(i>-1&&i<11) { UnstableManifoldColor=i; notAlreadySet.UnstableManifoldColor=0; } } return; } if(msc("LT",s1)){ if ((notAlreadySet.START_LINE_TYPE||force) || ((mask!=NULL)&&(mask->START_LINE_TYPE==1))) { i=atoi(s2); if(i<2&&i>-6) { START_LINE_TYPE=i; notAlreadySet.START_LINE_TYPE=0; } } return; } if(msc("SEED",s1)){ if ((notAlreadySet.RandSeed||force) || ((mask!=NULL)&&(mask->RandSeed==1))) { i=atoi(s2); if(i>=0){ RandSeed=i; nsrand48(RandSeed); notAlreadySet.RandSeed=0; } } return; } if(msc("BACK",s1)){ if ((notAlreadySet.PaperWhite||force) || ((mask!=NULL)&&(mask->PaperWhite==1))) { if(s2[0]=='w'||s2[0]=='W') { PaperWhite=1; } else { PaperWhite=0; } notAlreadySet.PaperWhite=0; } return; } if(msc("COLORMAP",s1)){ if ((notAlreadySet.COLORMAP||force) || ((mask!=NULL)&&(mask->COLORMAP==1))) { i=atoi(s2); if(i<6)custom_color=i; notAlreadySet.COLORMAP=0; } return; } if(msc("NPLOT",s1)){ if ((notAlreadySet.NPLOT||force) || ((mask!=NULL)&&(mask->NPLOT==1))) { NPltV=atoi(s2); notAlreadySet.NPLOT=0; } return; } if(msc("DLL_LIB",s1)){ if ((notAlreadySet.DLL_LIB||force) || ((mask!=NULL)&&(mask->DLL_LIB==1))) { sprintf(dll_lib,"%s",s2); dll_flag+=1; notAlreadySet.DLL_LIB=0; } return; } if(msc("DLL_FUN",s1)){ if ((notAlreadySet.DLL_FUN||force) || ((mask!=NULL)&&(mask->DLL_FUN==1))) { sprintf(dll_fun,"%s",s2); dll_flag+=2; notAlreadySet.DLL_FUN=0; } return; } /* can now initialize several plots */ for(j=2;j<=8;j++){ sprintf(xx,"XP%d",j); sprintf(yy,"YP%d",j); sprintf(zz,"ZP%d",j); if(msc(xx,s1)){ find_variable(s2,&i); if(i>-1)IX_PLT[j]=i; return; } if(msc(yy,s1)){ find_variable(s2,&i); if(i>-1)IY_PLT[j]=i; return; } if(msc(zz,s1)){ find_variable(s2,&i); if(i>-1)IZ_PLT[j]=i; return; } } if(msc("XP",s1)){ if ((notAlreadySet.XP||force) || ((mask!=NULL)&&(mask->XP==1))) { find_variable(s2,&i); if(i>-1)IXPLT=i; notAlreadySet.XP=0; notAlreadySet.IXPLT=0; } return; } if(msc("YP",s1)){ if ((notAlreadySet.YP||force) || ((mask!=NULL)&&(mask->YP==1))) { find_variable(s2,&i); if(i>-1)IYPLT=i; notAlreadySet.YP=0; notAlreadySet.IYPLT=0; } return; } if(msc("ZP",s1)){ if ((notAlreadySet.ZP||force) || ((mask!=NULL)&&(mask->ZP==1))) { find_variable(s2,&i); if(i>-1)IZPLT=i; notAlreadySet.ZP=0; notAlreadySet.IZPLT=0; } return; } if(msc("AXES",s1)){ if ((notAlreadySet.AXES||force) || ((mask!=NULL)&&(mask->AXES==1))) { if(s2[0]=='3') { AXES=5; } else { AXES=0; } notAlreadySet.AXES=0; } return; } if(msc("NJMP",s1)){ if ((notAlreadySet.NOUT||force) || ((mask!=NULL)&&(mask->NOUT==1))) { NJMP=atoi(s2); notAlreadySet.NOUT=0; } return; } if(msc("NOUT",s1)){ if ((notAlreadySet.NOUT||force) || ((mask!=NULL)&&(mask->NOUT==1))) { NJMP=atoi(s2); notAlreadySet.NOUT=0; } return; } if(msc("NMESH",s1)){ if ((notAlreadySet.NMESH||force) || ((mask!=NULL)&&(mask->NMESH==1))) { NMESH=atoi(s2); notAlreadySet.NMESH=0; } return; } if(msc("METH",s1)){ if ((notAlreadySet.METHOD||force) || ((mask!=NULL)&&(mask->METHOD==1))) { for(i=0;i<15;i++) if(s2[0]==mkey[i]||s2[0]==Mkey[i]) METHOD=i; notAlreadySet.METHOD=0; } return; } if(msc("VMAXPTS",s1)){ if ((notAlreadySet.VMAXPTS||force) || ((mask!=NULL)&&(mask->VMAXPTS==1))) { MaxPoints=atoi(s2); notAlreadySet.VMAXPTS=0; } return; } if(msc("MAXSTOR",s1)){ if ((notAlreadySet.MAXSTOR||force) || ((mask!=NULL)&&(mask->MAXSTOR==1))) { MAXSTOR=atoi(s2); notAlreadySet.MAXSTOR=0; } return; } if(msc("TOR_PER",s1)){ if ((notAlreadySet.TOR_PER||force) || ((mask!=NULL)&&(mask->TOR_PER==1))) { TOR_PERIOD=atof(s2); TORUS=1; notAlreadySet.TOR_PER=0; } return; } if(msc("JAC_EPS",s1)){ if ((notAlreadySet.JAC_EPS||force) || ((mask!=NULL)&&(mask->JAC_EPS==1))) { NEWT_ERR=atof(s2); notAlreadySet.JAC_EPS=0; } return; } if(msc("NEWT_TOL",s1)){ if ((notAlreadySet.NEWT_TOL||force) || ((mask!=NULL)&&(mask->NEWT_TOL==1))) { EVEC_ERR=atof(s2); notAlreadySet.NEWT_TOL=0; } return; } if(msc("NEWT_ITER",s1)){ if ((notAlreadySet.NEWT_ITER||force) || ((mask!=NULL)&&(mask->NEWT_ITER==1))) { EVEC_ITER=atoi(s2); notAlreadySet.NEWT_ITER=0; } return; } if(msc("FOLD",s1)){ if ((notAlreadySet.FOLD||force) || ((mask!=NULL)&&(mask->FOLD==1))) { find_variable(s2,&i); if(i>0){ itor[i-1]=1; TORUS=1; } } return; } if(msc("TOTAL",s1)){ if ((notAlreadySet.TEND||force) || ((mask!=NULL)&&(mask->TEND==1))) { TEND=atof(s2); notAlreadySet.TEND=0; } return; } if(msc("DTMIN",s1)){ if ((notAlreadySet.DTMIN||force) || ((mask!=NULL)&&(mask->DTMIN==1))) { HMIN=atof(s2); notAlreadySet.DTMIN=0; } return; } if(msc("DTMAX",s1)){ if ((notAlreadySet.DTMAX||force) || ((mask!=NULL)&&(mask->DTMAX==1))) { HMAX=atof(s2); notAlreadySet.DTMAX=0; } return; } if(msc("DT",s1)){ if ((notAlreadySet.DT||force) || ((mask!=NULL)&&(mask->DT==1))) { DELTA_T=atof(s2); notAlreadySet.DT=0; } return; } if(msc("T0",s1)){ if ((notAlreadySet.T0||force) || ((mask!=NULL)&&(mask->T0==1))) { T0=atof(s2); notAlreadySet.T0=0; } return; } if(msc("TRANS",s1)){ if ((notAlreadySet.TRANS||force) || ((mask!=NULL)&&(mask->TRANS==1))) { TRANS=atof(s2); notAlreadySet.TRANS=0; } return; } if(msc("BOUND",s1)){ if ((notAlreadySet.BOUND||force) || ((mask!=NULL)&&(mask->BOUND==1))) { BOUND=atof(s2); notAlreadySet.BOUND=0; } return; } if(msc("ATOL",s1)){ if ((notAlreadySet.ATOLER||force) || ((mask!=NULL)&&(mask->ATOLER==1))) { ATOLER=atof(s2); notAlreadySet.ATOLER=0; } return; } if(msc("TOL",s1)){ if ((notAlreadySet.TOLER||force) || ((mask!=NULL)&&(mask->TOLER==1))) { TOLER=atof(s2); notAlreadySet.TOLER=0; } return; } if(msc("DELAY",s1)){ if ((notAlreadySet.DELAY||force) || ((mask!=NULL)&&(mask->DELAY==1))) { DELAY=atof(s2); notAlreadySet.DELAY=0; } return; } if(msc("BANDUP",s1)){ if ((notAlreadySet.BANDUP||force) || ((mask!=NULL)&&(mask->BANDUP==1))) { cv_bandflag=1; cv_bandupper=atoi(s2); notAlreadySet.BANDUP=0; } return; } if(msc("BANDLO",s1)){ if ((notAlreadySet.BANDLO||force) || ((mask!=NULL)&&(mask->BANDLO==1))) { cv_bandflag=1; cv_bandlower=atoi(s2); notAlreadySet.BANDLO=0; } return; } if(msc("PHI",s1)){ if ((notAlreadySet.PHI||force) || ((mask!=NULL)&&(mask->PHI==1))) { PHI0=atof(s2); notAlreadySet.PHI=0; } return; } if(msc("THETA",s1)){ if ((notAlreadySet.THETA||force) || ((mask!=NULL)&&(mask->THETA==1))) { THETA0=atof(s2); notAlreadySet.THETA=0; } return; } if(msc("XLO",s1)){ if ((notAlreadySet.XLO||force) || ((mask!=NULL)&&(mask->XLO==1))) { MY_XLO=atof(s2); notAlreadySet.XLO=0; } return; } if(msc("YLO",s1)){ if ((notAlreadySet.YLO||force) || ((mask!=NULL)&&(mask->YLO==1))) { MY_YLO=atof(s2); notAlreadySet.YLO=0; } return; } if(msc("XHI",s1)){ if ((notAlreadySet.XHI||force) || ((mask!=NULL)&&(mask->XHI==1))) { MY_XHI=atof(s2); notAlreadySet.XHI=0; } return; } if(msc("YHI",s1)){ if ((notAlreadySet.YHI||force) || ((mask!=NULL)&&(mask->YHI==1))) { MY_YHI=atof(s2); notAlreadySet.YHI=0; } return; } if(msc("XMAX",s1)){ if ((notAlreadySet.XMAX||force) || ((mask!=NULL)&&(mask->XMAX==1))) { x_3d[1]=atof(s2); notAlreadySet.XMAX=0; } return; } if(msc("YMAX",s1)){ if ((notAlreadySet.YMAX||force) || ((mask!=NULL)&&(mask->YMAX==1))) { y_3d[1]=atof(s2); notAlreadySet.YMAX=0; } return; } if(msc("ZMAX",s1)){ if ((notAlreadySet.ZMAX||force) || ((mask!=NULL)&&(mask->ZMAX==1))) { z_3d[1]=atof(s2); notAlreadySet.ZMAX=0; } return; } if(msc("XMIN",s1)){ /* printf("Trying to set XMIN %d =%s\n",notAlreadySet.XMIN,s2); */ if ((notAlreadySet.XMIN||force) || ((mask!=NULL)&&(mask->XMIN==1))) { x_3d[0]=atof(s2); notAlreadySet.XMIN=0; if ((notAlreadySet.XLO||force) || ((mask!=NULL)&&(mask->XLO==1))) { MY_XLO=atof(s2); notAlreadySet.XLO=0; } } return; } if(msc("YMIN",s1)){ if ((notAlreadySet.YMIN||force) || ((mask!=NULL)&&(mask->YMIN==1))) { y_3d[0]=atof(s2); notAlreadySet.YMIN=0; if ((notAlreadySet.YLO||force) || ((mask!=NULL)&&(mask->YLO==1))) { MY_YLO=atof(s2); notAlreadySet.YLO=0; } } return; } if(msc("ZMIN",s1)){ if ((notAlreadySet.ZMIN||force) || ((mask!=NULL)&&(mask->ZMIN==1))) { z_3d[0]=atof(s2); notAlreadySet.ZMIN=0; } return; } if(msc("POIMAP",s1)){ if ((notAlreadySet.POIMAP||force) || ((mask!=NULL)&&(mask->POIMAP==1))) { if(s2[0]=='m'||s2[0]=='M')POIMAP=2; if(s2[0]=='s'||s2[0]=='S')POIMAP=1; if(s2[0]=='p'||s2[0]=='P')POIMAP=3; notAlreadySet.POIMAP=0; } return; } if(msc("POIVAR",s1)){ if ((notAlreadySet.POIVAR||force) || ((mask!=NULL)&&(mask->POIVAR==1))) { find_variable(s2,&i); if(i>-1)POIVAR=i; notAlreadySet.POIVAR=0; } return; } if(msc("OUTPUT",s1)){ if ((notAlreadySet.OUTPUT||force) || ((mask!=NULL)&&(mask->OUTPUT==1))) { strcpy(batchout,s2); notAlreadySet.OUTPUT=0; } return; } if(msc("POISGN",s1)){ if ((notAlreadySet.POISGN||force) || ((mask!=NULL)&&(mask->POISGN==1))) { POISGN=atoi(s2); notAlreadySet.POISGN=0; } return; } if(msc("POISTOP",s1)){ if ((notAlreadySet.POISTOP||force) || ((mask!=NULL)&&(mask->POISTOP==1))) { SOS=atoi(s2); notAlreadySet.POISTOP=0; } return; } if(msc("STOCH",s1)){ if ((notAlreadySet.STOCH||force)|| ((mask!=NULL)&&(mask->STOCH==1))) { STOCH_FLAG=atoi(s2); notAlreadySet.STOCH=0; } return; } if(msc("POIPLN",s1)){ if ((notAlreadySet.POIPLN||force)|| ((mask!=NULL)&&(mask->POIPLN==1))) { POIPLN=atof(s2); notAlreadySet.POIPLN=0; } return; } if(msc("RANGEOVER",s1)){ if ((notAlreadySet.RANGEOVER||force)|| ((mask!=NULL)&&(mask->RANGEOVER==1))) { strcpy(range.item,s2); notAlreadySet.RANGEOVER=0; } return; } if(msc("RANGESTEP",s1)){ if ((notAlreadySet.RANGESTEP||force)|| ((mask!=NULL)&&(mask->RANGESTEP==1))) { range.steps=atoi(s2); notAlreadySet.RANGESTEP=0; } return; } if(msc("RANGELOW",s1)){ if ((notAlreadySet.RANGELOW||force)|| ((mask!=NULL)&&(mask->RANGELOW==1))) { range.plow=atof(s2); notAlreadySet.RANGELOW=0; } return; } if(msc("RANGEHIGH",s1)){ if ((notAlreadySet.RANGEHIGH||force)|| ((mask!=NULL)&&(mask->RANGEHIGH==1))) { range.phigh=atof(s2); notAlreadySet.RANGEHIGH=0; } return; } if(msc("RANGERESET",s1)){ if ((notAlreadySet.RANGERESET||force)|| ((mask!=NULL)&&(mask->RANGERESET==1))) { if(s2[0]=='y'||s2[0]=='Y') range.reset=1; else range.reset=0; notAlreadySet.RANGERESET=0; } return; } if(msc("RANGEOLDIC",s1)){ if ((notAlreadySet.RANGEOLDIC||force)|| ((mask!=NULL)&&(mask->RANGEOLDIC==1))) { if(s2[0]=='y'||s2[0]=='Y') { range.oldic=1; } else { range.oldic=0; } notAlreadySet.RANGEOLDIC=0; } return; } if(msc("RANGE",s1)){ if ((notAlreadySet.RANGE||force)|| ((mask!=NULL)&&(mask->RANGE==1))) { batch_range=atoi(s2); notAlreadySet.RANGE=0; } return; } if(msc("NTST",s1)){ if ((notAlreadySet.NTST||force)|| ((mask!=NULL)&&(mask->NTST==1))) { auto_ntst=atoi(s2); notAlreadySet.NTST=0; } return; } if(msc("NMAX",s1)){ if ((notAlreadySet.NMAX||force)|| ((mask!=NULL)&&(mask->NMAX==1))) { auto_nmx=atoi(s2); notAlreadySet.NMAX=0; } return; } if(msc("NPR",s1)){ if ((notAlreadySet.NPR||force)|| ((mask!=NULL)&&(mask->NPR==1))) { auto_npr=atoi(s2); notAlreadySet.NPR=0; } return; } if(msc("NCOL",s1)){ if ((notAlreadySet.NCOL||force)|| ((mask!=NULL)&&(mask->NCOL==1))) { auto_ncol=atoi(s2); notAlreadySet.NCOL=0; } return; } if(msc("DSMIN",s1)){ if ((notAlreadySet.DSMIN||force)|| ((mask!=NULL)&&(mask->DSMIN==1))) { auto_dsmin=atof(s2); notAlreadySet.DSMIN=0; } return; } if(msc("DSMAX",s1)){ if ((notAlreadySet.DSMAX||force)|| ((mask!=NULL)&&(mask->DSMAX==1))) { auto_dsmax=atof(s2); notAlreadySet.DSMAX=0; } return; } if(msc("DS",s1)){ if ((notAlreadySet.DS||force)|| ((mask!=NULL)&&(mask->DS==1))) { auto_ds=atof(s2); notAlreadySet.DS=0; } return; } if(msc("PARMIN",s1)){ if ((notAlreadySet.XMAX||force)|| ((mask!=NULL)&&(mask->XMAX==1))) { auto_rl0=atof(s2); notAlreadySet.XMAX=0; } return; } if(msc("PARMAX",s1)){ if ((notAlreadySet.PARMAX||force)|| ((mask!=NULL)&&(mask->PARMAX==1))) { auto_rl1=atof(s2); notAlreadySet.PARMAX=0; } return; } if(msc("NORMMIN",s1)){ if ((notAlreadySet.NORMMIN||force)|| ((mask!=NULL)&&(mask->NORMMIN==1))) { auto_a0=atof(s2); notAlreadySet.NORMMIN=0; } return; } if(msc("NORMMAX",s1)){ if ((notAlreadySet.NORMMAX||force)|| ((mask!=NULL)&&(mask->NORMMAX==1))) { auto_a1=atof(s2); notAlreadySet.NORMMAX=0; } return; } if(msc("EPSL",s1)){ if ((notAlreadySet.EPSL||force)|| ((mask!=NULL)&&(mask->EPSL==1))) { auto_epsl=atof(s2); notAlreadySet.EPSL=0; } return; } if(msc("EPSU",s1)){ if ((notAlreadySet.EPSU||force)|| ((mask!=NULL)&&(mask->EPSU==1))) { auto_epsu=atof(s2); notAlreadySet.EPSU=0; } return; } if(msc("EPSS",s1)){ if ((notAlreadySet.EPSS||force)|| ((mask!=NULL)&&(mask->EPSS==1))) { auto_epss=atof(s2); notAlreadySet.EPSS=0; } return; } if(msc("RUNNOW",s1)){ if ((notAlreadySet.RUNNOW||force)|| ((mask!=NULL)&&(mask->RUNNOW==1))) { RunImmediately=atoi(s2); notAlreadySet.RUNNOW=0; } return; } if(msc("SEC",s1)){ if ((notAlreadySet.SEC||force)|| ((mask!=NULL)&&(mask->SEC==1))) { SEc=atoi(s2); notAlreadySet.SEC=0; } return; } if(msc("UEC",s1)){ if ((notAlreadySet.UEC||force)|| ((mask!=NULL)&&(mask->UEC==1))) { UEc=atoi(s2); notAlreadySet.UEC=0; } return; } if(msc("SPC",s1)){ if ((notAlreadySet.SPC||force)|| ((mask!=NULL)&&(mask->SPC==1))) { SPc=atoi(s2); notAlreadySet.SPC=0; } return; } if(msc("UPC",s1)){ if ((notAlreadySet.UPC||force)|| ((mask!=NULL)&&(mask->UPC==1))) { UPc=atoi(s2); notAlreadySet.UPC=0; } return; } if(msc("AUTOEVAL",s1)){ if ((notAlreadySet.AUTOEVAL||force)|| ((mask!=NULL)&&(mask->AUTOEVAL==1))) { f=atoi(s2); set_auto_eval_flags(f); notAlreadySet.AUTOEVAL=0; } return; } if(msc("AUTOXMAX",s1)){ if ((notAlreadySet.AUTOXMAX||force)|| ((mask!=NULL)&&(mask->AUTOXMAX==1))) { auto_xmax=atof(s2); notAlreadySet.AUTOXMAX=0; } return; } if(msc("AUTOYMAX",s1)){ if ((notAlreadySet.AUTOYMAX||force)|| ((mask!=NULL)&&(mask->AUTOYMAX==1))) { auto_ymax=atof(s2); notAlreadySet.AUTOYMAX=0; } return; } if(msc("AUTOXMIN",s1)){ if ((notAlreadySet.AUTOXMIN||force)|| ((mask!=NULL)&&(mask->AUTOXMIN==1))) { auto_xmin=atof(s2); notAlreadySet.AUTOXMIN=0; } return; } if(msc("AUTOYMIN",s1)){ if ((notAlreadySet.AUTOYMIN||force)|| ((mask!=NULL)&&(mask->AUTOYMIN==1))) { auto_ymin=atof(s2); notAlreadySet.AUTOYMIN=0; } return; } if(msc("AUTOVAR",s1)){ if ((notAlreadySet.AUTOVAR||force)|| ((mask!=NULL)&&(mask->AUTOVAR==1))) { find_variable(s2,&i); if(i>0)auto_var=i-1; notAlreadySet.AUTOVAR=0; } return; } /* postscript options */ if(msc("PS_FONT",s1)){ if ((notAlreadySet.PS_FONT||force)|| ((mask!=NULL)&&(mask->PS_FONT==1))) { strcpy(PS_FONT,s2); notAlreadySet.PS_FONT=0; } return; } if(msc("PS_LW",s1)){ if ((notAlreadySet.PS_LW||force)|| ((mask!=NULL)&&(mask->PS_LW==1))) { PS_LW=atof(s2); notAlreadySet.PS_LW=0; } return; } if(msc("PS_FSIZE",s1)){ if ((notAlreadySet.PS_FSIZE||force)|| ((mask!=NULL)&&(mask->PS_FSIZE==1))) { PS_FONTSIZE=atoi(s2); notAlreadySet.PS_FSIZE=0; } return; } if(msc("PS_COLOR",s1)){ if ((notAlreadySet.PS_COLOR||force)|| ((mask!=NULL)&&(mask->PS_COLOR==1))) { PSColorFlag=atoi(s2); PS_Color=PSColorFlag; notAlreadySet.PS_COLOR=0; } return; } plintf("!! Option %s not recognized\n",s1); } lunch-new.c0000644000175000017500000003550711610403677013027 0ustar dumzdejdumzdej#include "lunch-new.h" #include "parserslow.h" #include "edit_rhs.h" #include "browse.h" #include "ggets.h" #include "graf_par.h" #include "volterra2.h" #include "storage.h" #include "init_conds.h" #include "numerics.h" #include #include #include #include #include "arrayplot.h" #include #include #include #include "xpplim.h" #include "struct.h" #include "shoot.h" #include "load_eqn.h" #include "adj2.h" #include "integrate.h" #define READEM 1 #define VOLTERRA 6 #define MAXUFUN 50 double atof(); extern int Xup; extern Window main_win; extern GRAPH *MyGraph; extern BC_STRUCT my_bc[MAXODE]; int set_type=0; extern FIXINFO fixinfo[MAXODE]; extern int FIX_VAR,NFUN; extern int NJMP,NMESH,METHOD,NODE,POIMAP,POIVAR,POISGN,SOS,INFLAG,NMarkov; extern int NUPAR,NEQ,BVP_MAXIT,EVEC_ITER,DelayFlag,MyStart; extern double last_ic[MAXODE],MyData[MAXODE],MyTime,LastTime; extern double TEND,DELTA_T,T0,TRANS,BOUND,HMIN,HMAX,TOLER,ATOLER,DELAY; extern double POIPLN,EVEC_ERR,NEWT_ERR; extern double BVP_TOL,BVP_EPS; extern int MaxPoints; extern char upar_names[MAXPAR][11],this_file[100],delay_string[MAXODE][80]; extern char uvar_names[MAXODE][12]; extern char *ode_names[MAXODE],*fix_names[MAXODE]; void file_inf() { int ok; FILE *fp; char filename[256]; sprintf(filename,"%s.pars",this_file); ping(); if(!file_selector("Save info",filename,"*.pars*"))return; /* if(new_string("Filename: ",filename)==0)return; */ open_write_file(&fp,filename,&ok); if(!ok)return; redraw_params(); do_info(fp); fclose(fp); } void ps_write_pars(FILE *fp) { int div,rem,i,j; double z; fprintf(fp,"\n %%%% %s \n %%%% Parameters ...\n",this_file); div=NUPAR/4; rem=NUPAR%4; for(j=0;j0)strcpy(fstr,"d%s/dT=%s\n"); if(i=NODE)strcpy(fstr,"%s=%s\n"); fprintf(fp,fstr,uvar_names[i],ode_names[i]); } if(FIX_VAR>0){ fprintf(fp,"\nwhere ...\n"); for(i=0;i0){ fprintf(fp, "\nUser-defined functions:\n"); user_fun_info(fp); } fprintf(fp,"\n\n Numerical parameters ...\n"); fprintf(fp,"NJMP=%d NMESH=%d METHOD=%s EVEC_ITER=%d \n", NJMP,NMESH,method[METHOD],EVEC_ITER); fprintf(fp,"BVP_EPS=%g,BVP_TOL=%g,BVP_MAXIT=%d \n", BVP_EPS,BVP_TOL,BVP_MAXIT); fprintf(fp,"DT=%g T0=%g TRANS=%g TEND=%g BOUND=%g DELAY=%g MaxPts=%d\n", DELTA_T,T0,TRANS,TEND,BOUND,DELAY,MaxPoints); fprintf(fp,"EVEC_ERR=%g, NEWT_ERR=%g HMIN=%g HMAX=%g TOLER=%g \n", EVEC_ERR,NEWT_ERR,HMIN,HMAX,TOLER); if(POIVAR==0)strcpy(bob,"T"); else strcpy(bob,uvar_names[POIVAR-1]); fprintf(fp,"POIMAP=%d POIVAR=%s POIPLN=%g POISGN=%d \n", POIMAP,bob,POIPLN,POISGN); fprintf(fp,"\n\n Delay strings ...\n"); for(i=0;i0)strcpy(fstr,"d%s/dT=%s\n"); if(i=NODE)strcpy(fstr,"%s=%s\n"); fprintf(fp,fstr,uvar_names[i],ode_names[i]); } if(FIX_VAR>0){ fprintf(fp,"\nwhere ...\n"); for(i=0;i0){ fprintf(fp, "\nUser-defined functions:\n"); user_fun_info(fp); } } void io_numerics(f,fp) int f; FILE *fp; { char *method[]={"Discrete","Euler","Mod. Euler", "Runge-Kutta","Adams","Gear","Volterra","BackEul", "Qual RK","Stiff","CVode","DorPrin5","DorPri8(3)"}; char *pmap[]={"Poincare None","Poincare Section","Poincare Max","Period"}; char temp[256]; if(f==READEM&&set_type==1){ fgets(temp,255,fp); /* skip a line */} if(f!=READEM) fprintf(fp,"# Numerical stuff\n"); io_int(&NJMP,fp,f," nout"); io_int(&NMESH,fp,f," nullcline mesh"); io_int(&METHOD,fp,f,method[METHOD]); if(f==READEM){do_meth();alloc_meth();} io_double(&TEND,fp,f,"total"); io_double(&DELTA_T,fp,f,"DeltaT"); io_double(&T0,fp,f,"T0"); io_double(&TRANS,fp,f,"Transient"); io_double(&BOUND,fp,f,"Bound"); io_double(&HMIN,fp,f,"DtMin"); io_double(&HMAX,fp,f,"DtMax"); io_double(&TOLER,fp,f,"Tolerance"); /* fix stuff concerning the tolerance */ if(f==READEM){ if(set_type==1) io_double(&ATOLER,fp,f,"Abs. Tolerance"); else ATOLER=TOLER*10; } else io_double(&ATOLER,fp,f,"Abs. Tolerance"); io_double(&DELAY,fp,f,"Max Delay"); io_int(&EVEC_ITER,fp,f,"Eigenvector iterates"); io_double(&EVEC_ERR,fp,f,"Eigenvector tolerance"); io_double(&NEWT_ERR,fp,f,"Newton tolerance"); io_double(&POIPLN,fp,f,"Poincare plane"); io_double(&BVP_TOL,fp,f,"Boundary value tolerance"); io_double(&BVP_EPS,fp,f,"Boundary value epsilon"); io_int(&BVP_MAXIT,fp,f,"Boundary value iterates"); io_int(&POIMAP,fp,f,pmap[POIMAP]); io_int(&POIVAR,fp,f,"Poincare variable"); io_int(&POISGN,fp,f,"Poincare sign"); io_int(&SOS,fp,f,"Stop on Section"); io_int(&DelayFlag,fp,f,"Delay flag"); io_double(&MyTime,fp,f,"Current time"); io_double(&LastTime,fp,f,"Last Time"); io_int(&MyStart,fp,f,"MyStart"); io_int(&INFLAG,fp,f,"INFLAG"); } void io_parameter_file(char *fn,int flag) { char fnx[256],c; int i,j=0; int np; FILE *fp; time_t ttt; for(i=6;irm[k][j]),fp,f,"rm"); for(j=0;jxv[j]),fp,f," "); io_int(&(MyGraph->yv[j]),fp,f," "); io_int(&(MyGraph->zv[j]),fp,f," "); io_int(&(MyGraph->line[j]),fp,f," "); io_int(&(MyGraph->color[j]),fp,f," "); } io_double(&(MyGraph->ZPlane),fp,f," "); io_double(&(MyGraph->ZView),fp,f," "); io_int(&(MyGraph->PerspFlag),fp,f," "); io_int(&(MyGraph->ThreeDFlag),fp,f,"3DFlag"); io_int(&(MyGraph->TimeFlag),fp,f,"Timeflag"); io_int(&(MyGraph->ColorFlag),fp,f,"Colorflag"); io_int(&(MyGraph->grtype),fp,f,"Type"); io_double(&(MyGraph->color_scale),fp,f,"color scale"); io_double(&(MyGraph->min_scale),fp,f," minscale"); io_double(&(MyGraph->xmax),fp,f," xmax"); io_double(&(MyGraph->xmin),fp,f," xmin"); io_double(&(MyGraph->ymax),fp,f," ymax"); io_double(&(MyGraph->ymin),fp,f," ymin"); io_double(&(MyGraph->zmax),fp,f," zmax"); io_double(&(MyGraph->zmin),fp,f," zmin"); io_double(&(MyGraph->xbar),fp,f, " "); io_double(&(MyGraph->dx ),fp,f," "); io_double(&(MyGraph->ybar),fp,f," "); io_double(&(MyGraph->dy ),fp,f," "); io_double(&(MyGraph->zbar),fp,f," "); io_double(&(MyGraph->dz ),fp,f," "); io_double(&(MyGraph->Theta),fp,f," Theta"); io_double(&(MyGraph->Phi),fp,f, " Phi"); io_int(&(MyGraph->xshft),fp,f," xshft"); io_int(&(MyGraph->yshft),fp,f," yshft"); io_int(&(MyGraph->zshft),fp,f," zshft"); io_double(&(MyGraph->xlo),fp,f," xlo"); io_double(&(MyGraph->ylo),fp,f," ylo"); io_double(&(MyGraph->oldxlo),fp,f," "); io_double(&(MyGraph->oldylo),fp,f," "); io_double(&(MyGraph->xhi),fp,f," xhi"); io_double(&(MyGraph->yhi),fp,f," yhi"); io_double(&(MyGraph->oldxhi),fp,f," "); io_double(&(MyGraph->oldyhi),fp,f," "); if(f==READEM&&Xup)redraw_the_graph(); } void io_int(i,fp,f,ss) int *i,f; FILE *fp; char *ss; { char bob[256]; if(f==READEM){ fgets(bob,255,fp); *i=atoi(bob); } else fprintf(fp,"%d %s\n",*i,ss); } void io_double(z,fp,f,ss) int f; FILE *fp; double *z; char *ss; { char bob[256]; if(f==READEM){ fgets(bob,255,fp); *z=atof(bob); } else fprintf(fp,"%.16g %s\n",*z,ss); } void io_float(z,fp,f,ss) int f; FILE *fp; char *ss; float *z; { char bob[256]; if(f==READEM){ fgets(bob,255,fp); *z=(float)atof(bob); } else fprintf(fp,"%.16g %s\n",*z,ss); } /* io_int_array(k,n,fp,f) int n,f,*k; FILE *fp; { int i; for(i=0;i #include "flags.h" #include "main.h" #include "ggets.h" #include "load_eqn.h" #include "dae_fun.h" #include "derived.h" #include "extra.h" #include "browse.h" #include "simplenet.h" #include "integrate.h" #include "newpars.h" #include #include #include #include #ifndef WCTYPE #include #else #include #endif #include #include "xpplim.h" #include "my_pars.h" #include "shoot.h" #include "newpars.h" #define MAXONLY 1000 #define MAXCOMMENTS 500 int IN_INCLUDED_FILE=0; char uvar_names[MAXODE][12]; char *ode_names[MAXODE]; char upar_names[MAXPAR][11]; char *save_eqn[MAXLINES]; double default_val[MAXPAR]; extern int NODE; extern int NUPAR; extern int NLINES; extern int IN_VARS; extern int leng[MAXODE]; extern int NincludedFiles; VAR_INFO *my_varinfo; int start_var_info=0; int *my_ode[MAXODE]; int leng[MAXODE]; typedef struct { char *text,*action; int aflag; } ACTION; char errmsg[256]; extern int XPPBatch; extern int file_selector(); extern int loadincludefile; extern char includefilename[MaxIncludeFiles][100]; extern double initialize_pH(); extern double initialize_ionicstr(); extern void deblank(); char *onlylist[MAXONLY]; int *plotlist; int N_only=0,N_plist; ACTION comments[MAXCOMMENTS]; ACTION *orig_comments; int orig_ncomments=0; int is_a_map=0; int n_comments=0; extern char delay_string[MAXODE][80]; BC_STRUCT my_bc[MAXODE]; double default_ic[MAXODE]; extern double last_ic[]; int NODE,NUPAR,NLINES; int PrimeStart; int NCON_START,NSYM_START; int BVP_NL,BVP_NR,BVP_N; extern int BVP_FLAG; #define cstringmaj MYSTR1 #define cstringmin MYSTR2 extern float xppvermaj,xppvermin; int ConvertStyle=0; FILE *convertf; extern int ERROUT; extern int NTable; #define MAX_TAB 50 int OldStyle=1; int NCON_ORIG,NSYM_ORIG; int IN_VARS; int NMarkov; int FIX_VAR; int ICREATE=0; extern int NEQ,NVAR,NKernel; extern int NFUN; int NEQ_MIN; extern int NCON,NSYM; extern int NWiener; extern char this_file[100]; extern char options[100]; int EqType[MAXODE]; int Naux=0; char aux_names[MAXODE][12]; FIXINFO fixinfo[MAXODE]; extern char cur_dir[]; extern FILEINFO my_ff; char *get_first(/* char *string,char *src */); char *get_next(/* char *src */); char *getsi(); double atof(); int make_eqn() { int okay; NEQ=2; FIX_VAR=0; NMarkov=0; /* initscr(); */ /* pos_prn("*(r)ead or (c)reate:",0,0); ch=getuch(); pos_prn("",0,0); okay=0; switch(ch) { case 'r':okay=read_eqn(); break; case 'c': okay=create_eqn();break; default : read_eqn();break; } */ okay=read_eqn(); plintf("Okay in make_eqn =%d \n",okay); return(okay); } void strip_saveqn() { int i; int j,n; for(i=0;i for directory:",0,0); getsi(string); if(strlen(string)==0) { get_dir(); goto getfile; } if((fptr=fopen(string,"r"))==NULL) { plintf("\n Cannot open %s \n",string); return(0); } strcpy(this_file,string); clrscr(); okay=get_eqn(fptr); close(fptr); for(i=0;i8)ncol=8; k=n/ncol; j=n-ncol*k; sprintf(fmat,"%s%d%s","%",lmax+2,"s"); for(ip=0;ip"); getsi(path); if(strlen(path)==0)strcpy(path,"*.ode"); sprintf(commd,"ls %s",path); system(commd); } */ int get_eqn(fptr) FILE *fptr; { char bob[MAXEXPLEN]; char filename[256]; int done=1,nn,i; int flag; char prim[15]; init_rpn(); NLINES=0; IN_VARS=0; NODE=0; BVP_N=0; BVP_NL=0; BVP_NR=0; NUPAR=0; NWiener=0; /*check_for_xpprc(); This is now done just once and in do_vis_env() */ strcpy(options,"default.opt"); add_var("t",0.0); /* plintf(" NEQ: "); */ fgets(bob,MAXEXPLEN,fptr); nn=strlen(bob)+1; if (NLINES>MAXLINES) { fprintf(stderr,"whoops! NLINES>MAXLINES in form_ode.c ...\n"); exit(1); }; if((save_eqn[NLINES]=(char *)malloc(nn))==NULL){ plintf("Out of memory..."); exit(0); } strncpy(save_eqn[NLINES++],bob,nn); /* plintf("incr NLINE in geteqn %s \n",bob); */ i=atoi(bob); if(i<=0) { /* New parser --- */ OldStyle=0; ConvertStyle=0; flag=do_new_parser(fptr,bob,0); if(flag<0) exit(0); } else{ OldStyle=1; NEQ=i; plintf("NEQ=%d\n",NEQ); if(ConvertStyle){ if(strlen(this_file)==0) sprintf(filename,"convert.ode"); else sprintf(filename,"%s.new",this_file); if((convertf=fopen(filename,"w"))==NULL){ printf(" Cannot open %s - no conversion done \n",filename); ConvertStyle=0; } fprintf(convertf,"# converted %s \n",this_file); } while(done) { fgets(bob,MAXEXPLEN,fptr); nn=strlen(bob)+1; if((save_eqn[NLINES]=(char *)malloc(nn))==NULL)exit(0); strncpy(save_eqn[NLINES++],bob,nn); /* plintf("inc NLINES in geteqn2 %s \n",bob); */ done=compiler(bob,fptr); } if(ConvertStyle){ fprintf(convertf,"done\n"); fclose(convertf); } } if((NODE+NMarkov)==0){ plintf(" Must have at least one equation! \n Probably not an ODE file.\n"); exit(0); } if(BVP_N>IN_VARS ){ plintf("Too many boundary conditions\n"); exit(0); } /* plintf("BVP_N=%d NODE=%d NVAR=%d IN_VARS=%d\n",BVP_N,NODE,NVAR,IN_VARS); */ if(BVP_N0)printf("Warning: Too few boundary conditions\n"); for(i=BVP_N;iNEQ) { plintf(" Too many variables\n"); exit(0); } NODE=IN_VARS; for(i=0; i0) compile_all_markov(); if(compile_flags()==1){ plintf(" Error in compiling a flag \n"); exit(0); } show_flags(); /* add auxiliary variables */ for(i=NODE+NMarkov;i