function pdetool(action,flag) %PDETOOL PDE Toolbox graphical user interface (GUI). % PDETOOL provides the graphical user interface for the % PDE Toolbox. % % Call PDETOOL without arguments to start application. % Magnus Ringh 6-01-94, MR 10-03-95. % Copyright (c) 1994-96 by The MathWorks, Inc. % $Revision: 1.9 $ $Date: 1996/11/15 17:06:16 $ thesis_data; if nargin<1 action='initialize'; end pde_fig=findobj(allchild(0),'flat','Tag','PDETool'); % % case: initialize if strcmp(action,'initialize') clc; ver; thesis_init; if ~isempty(pde_fig), set(0,'CurrentFigure',pde_fig); Figpos = get(pde_fig,'Position'); set(pde_fig,... 'Colormap',gray(20),... 'HandleVisibility','on') % clf: delete(allchild(pde_fig)) refresh(pde_fig) else ScreenUnits = get(0,'Units'); set(0,'Unit','pixels'); ScreenPos = get(0,'ScreenSize'); set(0,'Unit',ScreenUnits); Figpos=[.15 .15 .8 .75].*ScreenPos+[0.1*ScreenPos(3:4) 0 0]; pde_fig=figure(... 'Visible','off',... 'Color','w',... 'Colormap',gray(20),... 'Position',Figpos,... 'IntegerHandle','off',... 'Renderer','painters',... 'Interruptible','on'); end % Set the pointer to a watch: set(pde_fig,'Pointer','watch') drawnow % Set up some default values: % flags=[save_flag mode_flag flag1 flag2 flag3 flag4 flag5] % save_flag: model needs to be saved. % mode_flag: 0=draw mode; 1=boundary mode; 2=mesh mode; % 3=solve mode; 4=pde mode % flag1=Geometry has changed, decomposition needed (flag1=-1 if decsg error) % flag2=Decomposed geometry has changed, mesh initialization needed % flag3=Mesh or boundary condition has changed, need to solve system % flag4=New solution computed % flag5=PDE equation has changed; recompute solution if necessary % % Storage: File menu's UserData flags=zeros(7,1); % PDE coefficients: c='1.0'; a='0.0'; f='10.0'; d='1.0'; tlist='0:10'; u0='0.0';... ut0='0.0'; r='[0 100]'; rtol='0.01'; atol='0.001'; params=str2mat(c,a,f,d); setuprop(pde_fig,'currparam',str2mat(c,a,f,d)) setuprop(pde_fig,'timeeigparam',str2mat(tlist,u0,ut0,r,rtol,atol)) setuprop(pde_fig,'ncafd',ones(1,4)) % Default solve parameters: % Adaptive mode: 0 (=off) % Max number of triangles: 1000 % Max number of refinements: 10 % Triangle selection method: 'pdeadworst' % Function parameter: 0.5 % Local tolerance: 1E-3 % Triangle refinement method - adaption: 'longest' % Nonlinear solver: 0 (=off) % Nonlinear tolerance: 1.0 % Initial solution for nonlinear solver: none (optional argument) % Jacobian: fixed % Nonlinear norm: Inf solveparams=str2mat('0','1000','10','pdeadworst','0.5','longest',... '0','1E-4','','fixed','Inf'); setuprop(pde_fig,'solveparam',solveparams) % % Initialize main PDE figure window and axes: set(pde_fig,... 'Tag','PDETool',... 'NumberTitle','off',... 'Name','PDE Toolbox - [Untitled]',... 'Resize','on',... 'MenuBar','none',... 'Visible','on',... 'KeyPressFcn','pdetool keycall',... 'Units','pixels') axwidth = 0.8*Figpos(3); axheight= axwidth/1.5/Figpos(4); axstdpos = [0.1 0.12 0.8 axheight]; ax=axes(... 'Parent',pde_fig,... 'Position',axstdpos,... 'XColor','k',... 'Box','on',... 'YColor','k',... 'Color','w',... 'DrawMode','fast',... 'Tag','PDEAxes',... 'XLimMode','manual',... 'YLimMode','manual',... 'XLim',[0 2],... 'YLim',[0 2],... 'XGrid','off',... 'YGrid','off',... 'ZGrid','off',... 'XTickMode','auto',... 'YTickMode','auto',... 'Units','normalized',... 'DataAspectRatio',[1 1 1]); % Save axes position: setuprop(ax,'axstdpos',axstdpos) % Save draw mode color map (gray) and solve mode default colormap (cool) set(get(ax,'XLabel'),'UserData',gray(20)) set(get(ax,'YLabel'),'UserData',cool(64)) % Initialize user interface menus and ui controls (buttons etc.) % File menu: [lbl,acc]=menulabel('&File'); file_menu = uimenu(pde_fig,'Accelerator',acc,'Label',lbl,... 'Tag','PDEFileMenu','UserData',flags); [lbl,acc]=menulabel('&New ^n'); uimenu(file_menu,'Accelerator',acc,'Label',lbl,... 'Interruptible','on','CallBack','pdetool(''new'')'); [lbl,acc]=menulabel('&Open... ^o'); uimenu(file_menu,'Accelerator',acc,'Label',lbl,... 'Interruptible','on','CallBack','pdetool(''open'')'); [lbl,acc]=menulabel('&Save ^s'); uimenu(file_menu,'Accelerator',acc,'Label',lbl,... 'Tag','PDESave','Enable','off','CallBack','pdetool(''save'')'); [lbl,acc]=menulabel('Save &As...'); uimenu(file_menu,'Accelerator',acc,'Label',lbl,... 'CallBack','pdetool(''save_as''),'); [lbl,acc]=menulabel('&Print...'); uimenu(file_menu,'Accelerator',acc,'Label',lbl,'Separator','on',... 'CallBack','pdetool(''print'')'); [lbl,acc]=menulabel('E&xit ^w'); uimenu(file_menu,'Accelerator',acc,'Label',lbl,... 'Interruptible','on', 'Separator','on','CallBack','pdetool(''exit'')'); % Edit menu: [lbl,acc]=menulabel('&Edit'); edit_menu = uimenu(pde_fig,'Accelerator',acc,'Label',lbl,... 'Tag','PDEEditMenu','UserData',[]); [lbl,acc]=menulabel('&Undo ^z'); uimenu(edit_menu,'Accelerator',acc,'Label',lbl,'Enable','off',... 'Tag','PDEUndo','CallBack','pdetool(''undo'')'); [lbl,acc]=menulabel('Cu&t ^x'); uimenu(edit_menu,'Accelerator',acc,'Label',lbl,'Separator','on',... 'Tag','PDECut','CallBack','pdetool(''cut'',1)'); [lbl,acc]=menulabel('&Copy ^c'); uimenu(edit_menu,'Accelerator',acc,'Label',lbl,'Tag','PDECopy',... 'CallBack','pdetool(''cut'',2)'); [lbl,acc]=menulabel('&Paste... ^v'); uimenu(edit_menu,'Accelerator',acc,'Label',lbl,'Enable','off',... 'Tag','PDEPaste','CallBack','pdepsdlg'); [lbl,acc]=menulabel('Clea&r ^r'); uimenu(edit_menu,'Accelerator',acc,'Label',lbl,'Enable','off',... 'Separator','on','Tag','PDEClear','CallBack','pdetool(''clear'')'); [lbl,acc]=menulabel('Select &All ^a'); uimenu(edit_menu,'Label',lbl,'Accelerator',acc,'Separator','on',... 'Tag','PDESelall','CallBack','pdeselect(''select'',1)'); % Options menu: [lbl,acc]=menulabel('&Options'); opt_menu = uimenu(pde_fig,'Accelerator',acc,'Label',lbl,... 'Tag','PDEOptMenu'); [lbl,acc]=menulabel('&Grid'); uimenu(opt_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEGrid',... 'CallBack','pdetool gridon'); [lbl,acc]=menulabel('Gr&id Spacing...'); uimenu(opt_menu,'Label',lbl,'Accelerator',acc,'Tag','PDESpace',... 'CallBack','pdetool spacing'); [lbl,acc]=menulabel('&Snap'); uimenu(opt_menu,'Label',lbl,'Accelerator',acc,'Tag','PDESnap',... 'CallBack','pdetool(''snapon'')'); [lbl,acc]=menulabel('&Axes Limits...'); uimenu(opt_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEAxMenu',... 'Separator','on','CallBack','pdetool axlim'); [lbl,acc]=menulabel('Axes &Equal'); uimenu(opt_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEAxeq',... 'CallBack','pdetool axeq'); [lbl,acc]=menulabel('&Turn off Toolbar Help'); uimenu(opt_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEHelpoff',... 'Separator','on','CallBack','pdetool helponoff'); [lbl,acc]=menulabel('&Zoom'); uimenu(opt_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEZoom',... 'Separator','on','CallBack','pdetool zoom'); [lbl,acc]=menulabel('A&pplication'); appl_menu=uimenu(opt_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEAppMenu','Separator','on'); uimenu(appl_menu,'Label','Liquid Sloshing','Checked','on',... 'CallBack','pdetool(''appl_cb'',1)','UserData',1); uimenu(appl_menu,'Label','Generic System',... 'CallBack','pdetool(''appl_cb'',2)','UserData',2); uimenu(appl_menu,'Label','Structural Mechanics, Plane Stress',... 'CallBack','pdetool(''appl_cb'',3)','UserData',3); uimenu(appl_menu,'Label','Structural Mechanics, Plane Strain',... 'CallBack','pdetool(''appl_cb'',4)','UserData',4); uimenu(appl_menu,'Label','Electrostatics',... 'CallBack','pdetool(''appl_cb'',5)','UserData',5); uimenu(appl_menu,'Label','Magnetostatics',... 'CallBack','pdetool(''appl_cb'',6)','UserData',6); uimenu(appl_menu,'Label','AC Power Electromagnetics',... 'CallBack','pdetool(''appl_cb'',7)','UserData',7); uimenu(appl_menu,'Label','Conductive Media DC',... 'CallBack','pdetool(''appl_cb'',8)','UserData',8); uimenu(appl_menu,'Label','Heat Transfer',... 'CallBack','pdetool(''appl_cb'',9)','UserData',9); uimenu(appl_menu,'Label','Diffusion',... 'CallBack','pdetool(''appl_cb'',10)','UserData',10); [lbl,acc]=menulabel('C&avity Type'); appl_menu=uimenu(opt_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEAppMenu'); % uimenu(appl_menu,'Label','Elliptic','Checked','on',... uimenu(appl_menu,'Label','Elliptic',... 'CallBack','pdetool(''cb_1'',1)'); uimenu(appl_menu,'Label','Regular',... 'CallBack','pdetool(''cb_1'',2)'); uimenu(appl_menu,'Label','Axis',... 'CallBack','pdetool(''cb_1'',3)'); [lbl,acc]=menulabel('&Method'); appl_menu=uimenu(opt_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEAppMenu'); % uimenu(appl_menu,'Label','Component','Checked','on',... uimenu(appl_menu,'Label','Component',... 'CallBack','pdetool(''cb_2'',1)'); uimenu(appl_menu,'Label','Separate',... 'CallBack','pdetool(''cb_2'',2)'); uimenu(appl_menu,'Label','Miles',... 'CallBack','pdetool(''cb_2'',3)'); [lbl,acc]=menulabel('&Refresh'); uimenu(opt_menu,'Label',lbl,'Accelerator',acc,'Tag','PDERefresh',... 'Separator','on','CallBack','pdetool refresh'); % Draw menu: [lbl,acc]=menulabel('D&raw'); draw_menu = uimenu(pde_fig,'Accelerator',acc,'Label',lbl,... 'Tag','PDEDrawMenu'); [lbl,acc]=menulabel('&Draw Mode'); uimenu(draw_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEDrawMode','Interruptible','on',... 'CallBack','pdetool(''changemode'',1)'); [lbl,acc]=menulabel('&Rectangle/square'); draw_hndl(1)=uimenu(draw_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDERect','Interruptible','on',... 'CallBack','pdetool(''drawrect'',1)'); [lbl,acc]=menulabel('Rectangle/&square (centered)'); draw_hndl(2)=uimenu(draw_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDERectc','Interruptible','on',... 'CallBack','pdetool(''drawrect'',2)'); [lbl,acc]=menulabel('&Ellipse/circle'); draw_hndl(3)=uimenu(draw_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEEllip','Interruptible','on',... 'CallBack','pdetool(''drawellipse'',1)'); [lbl,acc]=menulabel('Ellipse/&circle (centered)'); draw_hndl(4)=uimenu(draw_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEEllipc','Interruptible','on',... 'CallBack','pdetool(''drawellipse'',2)'); [lbl,acc]=menulabel('&Polygon'); draw_hndl(5)=uimenu(draw_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEPoly','Interruptible','on',... 'CallBack','pdetool drawline'); [lbl,acc]=menulabel('R&otate...'); uimenu(draw_menu,'Label',lbl,'Accelerator',acc,'Separator','on',... 'Tag','PDERotate','CallBack','pdertdlg'); set(draw_menu,'UserData',draw_hndl); [lbl,acc]=menulabel('E&xport Geometry Description, Set Formula, Labels...'); uimenu(draw_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEExpGD',... 'Separator','on','CallBack','pdetool(''export'',1)','Enable','off'); % Boundary menu: [lbl,acc]=menulabel('&Boundary'); bound_menu=uimenu(pde_fig,'Label',lbl,'Accelerator',acc,... 'Tag','PDEBoundMenu'); [lbl,acc]=menulabel('&Boundary Mode ^b'); uimenu(bound_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEBoundMode','CallBack','pdetool(''boundmode'')'); [lbl,acc]=menulabel('&Specify Boundary Conditions...'); uimenu(bound_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEBoundSpec','CallBack',... ['h=get(findobj(get(gcf,''Children''),''flat'',''Tag'','... '''PDEBoundMenu''),''UserData''); if isempty(h),'... ' pdetool(''error'','' No boundary selected.''), else,'... ' pdetool(''set_bounds''), end']); [lbl,acc]=menulabel('Show &Edge Labels'); uimenu(bound_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEShowEdge','CallBack','pdetool(''edgelbl'')'); [lbl,acc]=menulabel('Show S&ubdomain Labels'); uimenu(bound_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEShowSub','CallBack','pdetool(''sublbl'')'); [lbl,acc]=menulabel('&Remove Subdomain Border'); uimenu(bound_menu,'Label',lbl,'Accelerator',acc,'Tag','PDERemBord',... 'Enable','off','Separator','on','CallBack','pdetool(''removeb'')'); [lbl,acc]=menulabel('Re&move All Subdomain Borders'); uimenu(bound_menu,'Label',lbl,'Accelerator',acc,'Tag','PDERemAllBord',... 'Enable','off','CallBack','pdetool(''removeb'',1)'); [lbl,acc]=menulabel('E&xport Decomposed Geometry, Boundary Cond''s...'); uimenu(bound_menu,'Label',lbl,'Accelerator',acc,'Enable','off',... 'Separator','on','Tag','PDEExpBound','CallBack','pdetool(''export'',2)'); % PDE menu: [lbl,acc]=menulabel('P&DE'); pde_menu=uimenu(pde_fig,'Label',lbl,'Accelerator',acc,... 'Tag','PDEPDEMenu','UserData',params); [lbl,acc]=menulabel('&PDE Mode'); uimenu(pde_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEMode',... 'CallBack','pdetool(''pdemode'')'); [lbl,acc]=menulabel('&Show Subdomain Labels'); uimenu(pde_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEShowPDESub',... 'CallBack','pdetool(''pdesublbl'')'); [lbl,acc]=menulabel('P&DE Specification...'); uimenu(pde_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEParam',... 'CallBack','pdetool(''set_param'')'); [lbl,acc]=menulabel('E&xport PDE Coefficients...'); uimenu(pde_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEExpParam',... 'Separator','on','CallBack','pdetool(''export'',4)'); % Mesh menu: [lbl,acc]=menulabel('&Mesh'); mesh_menu=uimenu(pde_fig,'Label',lbl,'Accelerator',acc,... 'Tag','PDEMeshMenu'); [lbl,acc]=menulabel('&Mesh Mode'); uimenu(mesh_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEMeshMenu',... 'CallBack','pdetool(''meshmode'')'); [lbl,acc]=menulabel('&Initialize Mesh ^i'); uimenu(mesh_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEInitMesh',... 'CallBack','pdetool(''initmesh'')'); [lbl,acc]=menulabel('&Refine Mesh ^m'); uimenu(mesh_menu,'Label',lbl,'Accelerator',acc,'Tag','PDERefine',... 'CallBack','pdetool(''refine'')'); [lbl,acc]=menulabel('&Jiggle Mesh'); uimenu(mesh_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEJiggle',... 'CallBack','pdetool(''jiggle'')'); [lbl,acc]=menulabel('&Undo Mesh Change'); uimenu(mesh_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEUnrefine',... 'Enable','off','CallBack','pdetool(''unrefine'')'); [lbl,acc]=menulabel('&Display Triangle Quality'); uimenu(mesh_menu,'Label',lbl,'Accelerator',acc,'Tag','PDETriQual',... 'CallBack','pdetool(''triqual'')'); [lbl,acc]=menulabel('Show &Node Labels'); uimenu(mesh_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEShowNode','CallBack','pdetool(''pdenodelbl'')'); [lbl,acc]=menulabel('Show &Triangle Labels'); uimenu(mesh_menu,'Label',lbl,'Accelerator',acc,... 'Tag','PDEShowTriangles','CallBack','pdetool(''pdetrilbl'')'); [lbl,acc]=menulabel('&Parameters...'); uimenu(mesh_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEMeshParam',... 'Separator','on','CallBack','pdemhdlg'); [lbl,acc]=menulabel('E&xport Mesh...'); uimenu(mesh_menu,'Label',lbl,'Accelerator',acc,'Enable','off',... 'Separator','on','Tag','PDEExpMesh','CallBack','pdetool(''export'',3)'); % Solve menu: [lbl,acc]=menulabel('&Solve'); solve_menu=uimenu(pde_fig,'Label',lbl,'Accelerator',acc,... 'Tag','PDESolveMenu'); [lbl,acc]=menulabel('&Solve PDE ^e'); uimenu(solve_menu,'Label',lbl,'Accelerator',acc,'Tag','PDESolve',... 'CallBack','pdetool(''solve'')'); [lbl,acc]=menulabel('&Parameters...'); uimenu(solve_menu,'Label',lbl,'Accelerator',acc,'Separator','on',... 'CallBack','pdetool(''solve_param'')','Tag','PDESolveParam'); [lbl,acc]=menulabel('E&xport Solution...'); uimenu(solve_menu,'Label',lbl,'Accelerator',acc,'Separator','on',... 'Enable','off','CallBack','pdetool(''export'',5)','Tag','PDEExpSol'); % Plot menu: [lbl,acc]=menulabel('&Plot'); plot_menu =uimenu(pde_fig,'Label',lbl,'Accelerator',acc,... 'Tag','PDEPlotMenu'); [lbl,acc]=menulabel('&Plot Solution ^p'); uimenu(plot_menu,'Label',lbl,'Accelerator',acc,'Tag','PDEPlot',... 'CallBack',['pdeptdlg(''initialize'',2),pdeptdlg(''plot''),',... 'pdeinfo(''PDE solution plotted.'')']); uimenu(plot_menu,'Label','Parameters...','Tag','PDEPlotParam',... 'CallBack','pdeptdlg(''initialize'',0,getuprop(gcf,''plotstrings''))'); [lbl,acc]=menulabel('E&xport Movie...'); uimenu(plot_menu,'Label',lbl,'Accelerator',acc,'Separator','on',... 'Tag','PDEExpMovie','Enable','off','CallBack','pdetool(''export'',6)'); % Window menu: [lbl,acc]=menulabel('&Window'); uimenu(pde_fig,'Label',lbl,'Accelerator',acc',... 'CallBack','winmenu; drawnow',... 'Tag','winmenu'); % Help menu: [lbl,acc]=menulabel(' &Help'); help_menu=uimenu(pde_fig,'Label',lbl,'Accelerator',acc,... 'Tag','PDEHelpMenu','UserData',1); [lbl,acc]=menulabel('&Help... ^h'); uimenu(help_menu,'Label',lbl,'Accelerator',acc,... 'CallBack','helpwin({pdehelp},''PDE Toolbox help'');'); [lbl,acc]=menulabel('&About...'); uimenu(help_menu,'Label',lbl,'Accelerator',acc,... 'CallBack','pdetool about'); drawnow; %========================================================= %Button info and definitions % load button icons % 1st group of buttons: drawing tools iconFcns1 = str2mat('pdeicon(''rect'');', ... 'pdeicon(''rectc'');', ... 'pdeicon(''ellip'');', ... 'pdeicon(''ellipc'');', ... 'pdeicon(''polygon'');'); buttonId=str2mat('rect','rectc','ellip','ellipc','poly'); callBacks=str2mat('pdetool(''drawrect'',1)',... 'pdetool(''drawrect'',2)',... 'pdetool(''drawellipse'',1)',... 'pdetool(''drawellipse'',2)',... 'pdetool(''drawline'')'); btn_grp1=btngroup(pde_fig,'Iconfunctions',iconFcns1,'GroupID','draw',... 'ButtonID',buttonId,'Callbacks',callBacks,'Groupsize',[1 5],... 'Position',[0 0.96 .20 .04]); % 2nd group of buttons: PDE solution tools iconFcns2 = str2mat('pdeicon(''DeltaOmega'');', ... 'pdeicon(''pde'');', ... 'pdeicon(''triangle'');', ... 'pdeicon(''triangle2'');',... 'pdeicon(''equal'');', ... 'pdeicon(''plot'');'); buttonId2=str2mat('bounds','spec','init','refine','solve','plot'); callBacks2=str2mat('pdetool(''boundmode'')','pdetool(''set_param'')',... 'pdetool(''initmesh'')','pdetool(''refine'')','pdetool(''solve'')',... ['pdeptdlg(''initialize'',0,getuprop(findobj(get(0,''Children''),',... '''flat'',''Tag'',''PDETool''),''plotstrings''))']); btn_grp2=btngroup(pde_fig,'Iconfunctions',iconFcns2,'GroupID','solve',... 'ButtonID',buttonId2,'Callbacks',callBacks2,'Groupsize',[1 6],... 'PressType','flash','Position',[0.20 0.96 .24 .04]); zoomicon = str2mat('pdeicon(''zoom'');'); zoom_btn=btngroup(pde_fig,'Iconfunctions',zoomicon,'GroupID','zoom',... 'ButtonID','zoom','Callbacks','pdetool(''zoom'')','Groupsize',[1 1],... 'Position',[0.44 0.96 .04 .04]); % Application indicator: uicontrol(pde_fig,'Style','frame','Units','normalized',... 'Position',[0.48 0.96 .28 .04]); uicontrol(pde_fig,'Style','popup','Units','normalized',... 'HorizontalAlignment','left','String',... ['Liquid Sloshing|Generic System|Structural Mech., Plane Stress|',... 'Structural Mech., Plane Strain|Electrostatics|Magnetostatics|',... 'AC Power Electromagnetics|Conductive Media DC|',... 'Heat Transfer|Diffusion'],... 'Position',[0.485 0.965 .27 .03],'Tag','PDEAppl','UserData',1,... 'Callback','pdetool(''appl_cb'',0)'); % X and Y positions: uicontrol(pde_fig,'Style','frame','Units','normalized',... 'Position',[0.76 0.96 .24 .04]); uicontrol(pde_fig,'Style','text',... 'Units','normalized',... 'Position',[.77 .965 .03 .03],... 'ForegroundColor','k','String','X:'); xh=uicontrol(pde_fig,'Style','text','Units','normalized',... 'HorizontalAlignment','left','Tag','PDEXField',... 'Position',[.8 .965 .075 .03],'String','0.0'); uicontrol(pde_fig,'Style','text',... 'Units','normalized',... 'Position',[.89 .965 .03 .03],... 'ForegroundColor','k','String','Y:'); yh=uicontrol(pde_fig,'Style','text','Units','normalized',... 'HorizontalAlignment','left','Tag','PDEYField',... 'Position',[.92 .965 .075 .03],'String','0.0'); % Set formula: uicontrol(pde_fig,'Style','frame','Units','normalized',... 'Position',[0 0.9 1 .06]); uicontrol(pde_fig,'Style','text',... 'Units','normalized', 'HorizontalAlignment','left',... 'Position',[.03 .91 .12 .04],... 'String','Set formula:'); uicontrol(pde_fig,... 'Style','edit',... 'Units','normalized',... 'Position',[.15 .91 .8 .04],... 'HorizontalAlignment','left',... 'BackgroundColor','w',... 'Enable','on',... 'Tag','PDEEval',... 'Callback','pdetool formchk',... 'String','',... 'UserData',''); % Info string display: uicontrol(pde_fig,'Style','frame','Units','normalized',... 'Position',[0 0 .86 .06]); uicontrol(pde_fig,'Style','text',... 'Units','normalized','HorizontalAlignment','right',... 'Position',[.02 .01 .1 .04],... 'String','Info:'); uicontrol(pde_fig,'Style','text','Units','normalized',... 'Position',[.14 .01 .7 .04],'HorizontalAlignment','left',... 'Value',1,'Tag','PDEInfo','String','Draw 2-D geometry.',... 'Callback','Draw 2-D geometry.',... 'UserData','Draw 2-D geometry.'); % Exit button uicontrol(pde_fig,'Style','frame','Units','normalized',... 'Position',[0.86 0 .14 .06]); uicontrol(pde_fig,'Style','pushbutton',... 'Interruptible','on','Units','normalized',... 'Position',[.88 .01 .1 .04],... 'Callback','pdetool(''exit'')','String','Exit'); % Initialize property containers: setuprop(pde_fig,'toolhelp',1); setuprop(pde_fig,'stick',zeros(6,1)); setuprop(pde_fig,'application',1); setuprop(pde_fig,'equation','-div(c*grad(u))+a*u=f'); setuprop(pde_fig,'params',str2mat('c','a','f','d')); setuprop(pde_fig,'description',str2mat([],[],[],[])); setuprop(pde_fig,'bounddescr',str2mat([],[],[],[])); setuprop(pde_fig,'boundeq',... str2mat('n*c*grad(u)+qu=g','h*u=r',[])) setuprop(pde_fig,'objnames',[]); setuprop(pde_fig,'showsublbl',0); setuprop(pde_fig,'showpdesublbl',0); setuprop(pde_fig,'showedgelbl',0); setuprop(pde_fig,'shownodelbl',0); setuprop(pde_fig,'showtrilbl',0); setuprop(pde_fig,'trisize',[]) setuprop(pde_fig,'Hgrad',1.3) setuprop(pde_fig,'refinemethod','regular') setuprop(pde_fig,'jiggle',str2mat('on','mean',[])) setuprop(pde_fig,'meshstat',[]) setuprop(pde_fig,'bl',[]) setuprop(pde_fig,'animparam',[6 5 0]) setuprop(pde_fig,'colstring','') setuprop(pde_fig,'arrowstring','') setuprop(pde_fig,'deformstring','') setuprop(pde_fig,'heightstring','') setuprop(pde_fig,'plotflags',[1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 0 1]) % [colvar colstyle heightvar heightstyle vectorvar vectorstyle % colval doplot xyplot showmesh animationflag popupvalue % colflag contflag heightflag vectorflag deformflag deformvar] str1='u|abs(grad(u))|abs(c*grad(u))|user entry'; str2=' -grad(u)| -c*grad(u)| user entry'; strmtx=str2mat(str1,str2); setuprop(pde_fig,'plotstrings',strmtx) setuprop(ax,'snap',0); setuprop(ax,'subsel',[]); setuprop(ax,'bordsel',[]); setuprop(ax,'extraspacex',''); setuprop(ax,'extraspacey',''); setuprop(ax,'selinit',0); winmenu(pde_fig); pde_i=0; % PDETool figure's UserData contains the following: % 1-2: handles to X and Y position text objects % 3-4: pde_xc: circle center coordinates % 5: pde_i: counter: number of lines drawn when drawing a polygon. % 6..6+3*pde_i-2: pde_x: x data for lines (1:pde_i), y data for % lines (1:pde_i), handles to line objects (1:pde_i-1) user_data=[xh yh 0.0 0.0 pde_i 0.0 0.0]; set(pde_fig,'WindowButtonMotionFcn','pdemtncb(0)',... 'WindowButtonDownFcn','pdeselect select',... 'Pointer','arrow',... 'HandleVisibility','callback',... 'UserData',user_data) set(findobj(allchild(pde_fig),'flat','Type','axes'),... 'HandleVisibility','callback') drawnow; % End of initialization activities % % case: save geometry in m-file (save as...) elseif strcmp(action,'save_as') [outfile,outpath]=uiputfile('*.m','Save As',100,100); if outfile~=0 n=length(outfile); if n>3 if ~strcmp(lower(outfile(n-1:n)),'.m') outfile=[outfile '.m']; end else outfile=[outfile '.m']; end outfilefull=[outpath outfile]; fid=fopen(outfilefull,'w'); if fid>0, pdetool('write',fid); set(pde_fig,'Name',['PDE Toolbox - ' upper(outfile)]); h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); flags(1)=0; % need_save=0. set(h,'UserData',flags) set(findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'),... 'UserData',outfilefull) filemenu=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); hndl=findobj(get(filemenu,'Children'),'flat','Tag','PDESave'); set(hndl,'Enable','on'); else pdetool('error',' Can''t open file'); end end % % case: save geometry in m-file (save to current file) elseif strcmp(action,'save') curr_file=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEEditMenu'),'UserData'); fid=fopen(curr_file,'w'); if fid>0 pdetool('write',fid); h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); flags(1)=0; % need_save=0. set(h,'UserData',flags) else pdetool('error',' Can''t open file'); end % % case: write geometry to m-file elseif strcmp(action,'write') pde_circ=1; pde_poly=2; pde_rect=3; pde_ellip=4; fid=flag; fprintf(fid,'function pdemodel\n'); fprintf(fid,'[pde_fig,ax]=pdeinit;\n'); ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); % application parameters: appl=getuprop(pde_fig,'application'); if (appl>1 & appl<5), mode=2; else mode=1; end fprintf(fid,'pdetool(''appl_cb'',%i);\n',appl); % scaling, grid etc. ... if getuprop(ax,'snap') fprintf(fid,'pdetool(''snapon'',''on'');\n'); end xmax=get(ax,'XLim'); ymax=get(ax,'YLim'); dasp=get(ax,'DataAspectRatio'); pasp=get(ax,'PlotBoxAspectRatio'); xtck=get(ax,'XTick'); ytck=get(ax,'YTick'); n=length(xtck); tmps=setstr(ones(n,1)*' %.17g,...\n'); tmps=tmps'; tmps=reshape(tmps,1,12*n); tmpx=sprintf(tmps,xtck); n=length(ytck); tmps=setstr(ones(n,1)*' %.17g,...\n'); tmps=tmps'; tmps=reshape(tmps,1,12*n); tmpy=sprintf(tmps,ytck); fprintf(fid,'set(ax,''DataAspectRatio'',[%.17g %.17g %.17g]);\n',dasp); fprintf(fid,'set(ax,''PlotBoxAspectRatio'',[%.17g %.17g %.17g]);\n',pasp); if strcmp(get(ax,'XLimMode'),'auto') fprintf(fid,'set(ax,''XLimMode'',''auto'');\n'); else fprintf(fid,'set(ax,''XLim'',[%.17g %.17g]);\n',xmax); end if strcmp(get(ax,'YLimMode'),'auto') fprintf(fid,'set(ax,''YLimMode'',''auto'');\n'); else fprintf(fid,'set(ax,''YLim'',[%.17g %.17g]);\n',ymax); end if strcmp(get(ax,'XTickMode'),'auto') fprintf(fid,'set(ax,''XTickMode'',''auto'');\n'); else fprintf(fid,'set(ax,''XTick'',[%s]);\n',tmpx); end if strcmp(get(ax,'YTickMode'),'auto') fprintf(fid,'set(ax,''YTickMode'',''auto'');\n'); else fprintf(fid,'set(ax,''YTick'',[%s]);\n',tmpy); end extrax=pdequote(getuprop(ax,'extraspacex')); extray=pdequote(getuprop(ax,'extraspacey')); if ~isempty(extrax), fprintf(fid,'setuprop(ax,''extraspacex'',''%s'');\n',extrax); end if ~isempty(extray), fprintf(fid,'setuprop(ax,''extraspacey'',''%s'');\n',extray); end opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); gridhndl=findobj(get(opthndl,'Children'),'flat','Tag','PDEGrid'); if strcmp(get(gridhndl,'Checked'),'on') fprintf(fid,'pdetool(''gridon'',''on'');\n'); end pdegd=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEMeshMenu'),'UserData'); labels=pdequote(getuprop(pde_fig,'objnames')); fprintf(fid,'\n%% Geometry description:\n'); for i=1:size(pdegd,2), if pdegd(1,i)==pde_circ fprintf(fid,'pdecirc(%.17g,%.17g,%.17g,''%s'');\n',... pdegd(2:4,i),deblank(labels(:,i)')); elseif pdegd(1,i)==pde_ellip fprintf(fid,['pdeellip(%.17g,%.17g,%.17g,%.17g,...\n',... '%.17g,''%s'');\n'],... pdegd(2:6,i),deblank(labels(:,i)')); elseif pdegd(1,i)==pde_rect tmp=[pdegd(3:4,i)', pdegd(7,i), pdegd(9,i)]; fprintf(fid,'pderect([%.17g %.17g %.17g %.17g],''%s'');\n',... tmp,deblank(labels(:,i)')); elseif pdegd(1,i)==pde_poly n=pdegd(2,i); tmps=setstr(ones(n,1)*' %.17g,...\n'); tmps=tmps'; tmps=reshape(tmps,1,12*n); tmpx=sprintf(tmps,pdegd(3:2+n,i)); tmpy=sprintf(tmps,pdegd(3+n:2*n+2,i)); fprintf(fid,'pdepoly([%s],...\n[%s],...\n ''%s'');\n',... tmpx,tmpy,deblank(labels(:,i)')); end end evalhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEval'); evalstring=pdequote(get(evalhndl,'String')); fprintf(fid,['set(findobj(get(pde_fig,''Children''),'... '''Tag'',''PDEEval''),''String'',''%s'')\n'],evalstring); % non-empty boundary condition matrix and compatible geometry needed menuhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); hbound=findobj(get(menuhndl,'Children'),'flat','Tag','PDEBoundMode'); pdebound=get(hbound,'UserData'); h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); if ~isempty(pdebound) & ~abs(flags(3)), ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); bndlines=findobj(get(ax,'Children'),'flat','Tag','PDEBoundLine'); nb=length(bndlines); % extract column in pdebound from external boundary lines' user data % column no is first user data entry for i=1:nb, ud=get(bndlines(i),'UserData'); bndcol(i)=ud(1); end fprintf(fid,'\n%% Boundary conditions:\n'); fprintf(fid,'pdetool(''changemode'',0)\n'); bl=getuprop(pde_fig,'bl'); n=size(bl,1); for i=1:n, blrow=bl(i,:); blines=blrow(1:max(find(blrow))); tmps=sprintf('%i ',blines); tmps=['[', tmps, ']']; fprintf(fid,'pdetool(''removeb'',%s);\n',tmps); end outbnds=find(pdebound(1,:)~=0); n=length(outbnds); for i=1:n, j=bndcol(i); nn=pdebound(1,j); mm=pdebound(2,j); if nn==1, if mm==0, type='neu'; ql=pdebound(3,j); gl=pdebound(4,j); qstr=sprintf('''%s''',pdequote(setstr(pdebound(5:4+ql,j))')); gstr=sprintf('''%s''',... pdequote(setstr(pdebound(5+ql:4+ql+gl,j))')); fprintf(fid,['pdesetbd(%i,...\n',... '''%s'',...\n',... '%i,...\n',... '%s,...\n',... '%s)\n'],... j,type,mode,qstr,gstr); elseif mm==1, type='dir'; hl=pdebound(5,j); rl=pdebound(6,j); hstr=sprintf('''%s''',pdequote(setstr(pdebound(9:8+hl,j))')); rstr=sprintf('''%s''',... pdequote(setstr(pdebound(9+hl:8+hl+rl,j))')); fprintf(fid,['pdesetbd(%i,...\n',... '''%s'',...\n',... '%i,...\n',... '%s,...\n',... '%s)\n'],... j,type,mode,hstr,rstr); end elseif nn==2, if mm==0, type='neu'; ql=pdebound(3:6,j); gl=pdebound(7:8,j); qstr=sprintf('str2mat(''%s'',''%s'',''%s'',''%s'')',... pdequote(setstr(pdebound(9:8+ql(1),j))'),... pdequote(setstr(pdebound(9+ql(1):8+sum(ql(1:2)),j))'),... pdequote(setstr(pdebound(9+sum(ql(1:2)):8+sum(ql(1:3)),j))'),... pdequote(setstr(pdebound(9+sum(ql(1:3)):8+sum(ql),j))')); gstr=sprintf('str2mat(''%s'',''%s'')',... pdequote(setstr(pdebound(9+sum(ql):8+sum(ql)+gl(1),j))'),... pdequote(setstr(... pdebound(9+sum(ql)+gl(1):8+sum(ql)+sum(gl),j))')); fprintf(fid,['pdesetbd(%i,...\n',... '''%s'',...\n',... '%i,...\n',... '%s,...\n',... '%s)\n'],... j,type,mode,qstr,gstr); elseif mm==1, type='mix'; ql=pdebound(3:6,j); gl=pdebound(7:8,j); hl=pdebound(9:10,j); rl=pdebound(11,j); qstr=sprintf('str2mat(''%s'',''%s'',''%s'',''%s'')',... pdequote(setstr(pdebound(12:11+ql(1),j))'),... pdequote(setstr(pdebound(12+ql(1):11+sum(ql(1:2)),j))'),... pdequote(setstr(... pdebound(12+sum(ql(1:2)):11+sum(ql(1:3)),j))'),... pdequote(setstr(pdebound(12+sum(ql(1:3)):11+sum(ql),j))')); gstr=sprintf('str2mat(''%s'',''%s'')',... pdequote(setstr(pdebound(12+sum(ql):11+sum(ql)+gl(1),j))'),... pdequote(setstr(... pdebound(12+sum(ql)+gl(1):11+sum(ql)+sum(gl),j))')); hstr=sprintf('str2mat(''%s'',''%s'')',... pdequote(setstr(pdebound(12+sum(ql)+sum(gl):... 11+sum(ql)+sum(gl)+hl(1),j))'),... pdequote(setstr(... pdebound(12+sum(ql)+sum(gl)+hl(1):... 11+sum(ql)+sum(gl)+sum(hl),j))')); rstr=pdequote(setstr(pdebound(12+sum(ql)+sum(gl)+sum(hl):... 11+sum(ql)+sum(gl)+sum(hl)+rl,j))'); fprintf(fid,['pdesetbd(%i,...\n',... '''%s'',...\n',... '%i,...\n',... '%s,...\n',... '%s,...\n',... '%s,...\n',... '''%s'')\n'],... j,type,mode,qstr,gstr,hstr,rstr); elseif mm==2, type='dir'; hl=pdebound(9:12,j); rl=pdebound(13:14,j); hstr=sprintf('str2mat(''%s'',''%s'',''%s'',''%s'')',... pdequote(setstr(pdebound(21:20+hl(1),j))'),... pdequote(setstr(pdebound(21+hl(1):20+sum(hl(1:2)),j))'),... pdequote(setstr(pdebound(21+sum(hl(1:2)):... 20+sum(hl(1:3)),j))'),... pdequote(setstr(pdebound(21+sum(hl(1:3)):20+sum(hl),j))')); rstr=sprintf('str2mat(''%s'',''%s'')',... pdequote(setstr(pdebound(21+sum(hl):20+sum(hl)+rl(1),j))'),... pdequote(setstr(... pdebound(21+sum(hl)+rl(1):20+sum(hl)+sum(rl),j))')); fprintf(fid,['pdesetbd(%i,...\n',... '''%s'',...\n',... '%i,...\n',... '%s,...\n',... '%s)\n'],... j,type,mode,hstr,rstr); end end end meshstat=getuprop(pde_fig,'meshstat'); n=length(meshstat); if n>0, fprintf(fid,'\n%% Mesh generation:\n'); trisize=getuprop(pde_fig,'trisize'); if ~isempty(trisize), if isstr(trisize), fprintf(fid,'setuprop(pde_fig,''trisize'',''%s'');\n',... trisize); else fprintf(fid,... 'setuprop(pde_fig,''trisize'',%.17g);\n', trisize); end end Hgrad=getuprop(pde_fig,'Hgrad'); fprintf(fid,'setuprop(pde_fig,''Hgrad'',%.17g);\n', Hgrad); refmet=getuprop(pde_fig,'refinemethod'); fprintf(fid,'setuprop(pde_fig,''refinemethod'',''%s'');\n',... refmet); for i=1:n, if meshstat(i)==1, fprintf(fid,'pdetool(''initmesh'')\n'); elseif meshstat(i)==2, fprintf(fid,'pdetool(''refine'')\n'); elseif meshstat(i)==3, fprintf(fid,'pdetool(''jiggle'')\n'); elseif meshstat(i)==4, % mesh change from adaptive solver break; end end end end fprintf(fid,'\n%% PDE coefficients:\n'); % Unpack parameters: params=pdequote(get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEPDEMenu'),'UserData')); timeeigpar=pdequote(getuprop(pde_fig,'timeeigparam')); ncafd=getuprop(pde_fig,'ncafd'); nc=ncafd(1); na=ncafd(2); nf=ncafd(3); nd=ncafd(4); c=params(1:nc,:); a=params(nc+1:nc+na,:); f=params(nc+na+1:nc+na+nf,:); d=params(nc+na+nf+1:nc+na+nf+nd,:); cstr=['''', deblank(c(1,:)), '''']; if nc>1, if nc<12, for i=2:nc, cstr=[cstr, ',''' deblank(c(i,:)), '''']; end cp=sprintf('str2mat(%s)',cstr); else for i=2:11, cstr=[cstr, ',''' deblank(c(i,:)), '''']; end cstr2=['''', deblank(c(12,:)), '''']; for i=13:nc, cstr2=[cstr2, ',''' deblank(c(i,:)), '''']; end cp=sprintf('str2mat(str2mat(%s),%s)',cstr,cstr2); end else cp=cstr; end astr=['''', deblank(a(1,:)), '''']; if na>1, for i=2:na, astr=[astr, ',''' deblank(a(i,:)), '''']; end ap=sprintf('str2mat(%s)',astr); else ap=astr; end fstr=['''', deblank(f(1,:)), '''']; if nf>1, for i=2:nf, fstr=[fstr, ',''' deblank(f(i,:)), '''']; end fp=sprintf('str2mat(%s)',fstr); else fp=fstr; end dstr=['''', deblank(d(1,:)), '''']; if nd>1, for i=2:nd, dstr=[dstr, ',''' deblank(d(i,:)), '''']; end dp=sprintf('str2mat(%s)',dstr); else dp=dstr; end pde_type=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEHelpMenu'),'UserData'); fprintf(fid,['pdeseteq(%i,...\n',... '%s,...\n',... '%s,...\n',... '%s,...\n',... '%s,...\n',... '''%s'',...\n',... '''%s'',...\n',... '''%s'',...\n',... '''%s'')\n'],... pde_type,cp,ap,fp,dp,deblank(timeeigpar(1,:)),... deblank(timeeigpar(2,:)),deblank(timeeigpar(3,:)),... deblank(timeeigpar(4,:))); [currparams,I]=pdequote(getuprop(pde_fig,'currparam')); nc=size(currparams,1); if ~isempty(I) cpstr=sprintf('[''%s'';...\n', currparams(1,1:I(1))); for i=2:nc-1, cpstr=sprintf('%s''%s'';...\n', cpstr, currparams(i,1:I(i))); end cpstr=sprintf('%s''%s'']',cpstr, currparams(nc,1:I(nc))); fprintf(fid,['setuprop(pde_fig,''currparam'',...\n',... '%s)\n'],cpstr); end fprintf(fid,'\n%% Solve parameters:\n'); % Unpack parameters: solveparams=pdequote(getuprop(pde_fig,'solveparam')); adapt=deblank(solveparams(1,:)); maxtri=deblank(solveparams(2,:)); maxref=deblank(solveparams(3,:)); tripick=deblank(solveparams(4,:)); param=deblank(solveparams(5,:)); refmet=deblank(solveparams(6,:)); nonlin=deblank(solveparams(7,:)); nonlintol=deblank(solveparams(8,:)); nonlininit=deblank(solveparams(9,:)); jac=deblank(solveparams(10,:)); nonlinnorm=deblank(solveparams(11,:)); fprintf(fid,['setuprop(pde_fig,''solveparam'',...\n',... 'str2mat(''%s'',''%s'',''%s'',''%s'',...\n',... '''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s''))\n'],... adapt,maxtri,maxref,tripick,param,refmet,... nonlin,nonlintol,nonlininit,jac,nonlinnorm); fprintf(fid,'\n%% Plotflags and user data strings:\n'); plotflags=getuprop(pde_fig,'plotflags'); fprintf(fid,... ['setuprop(pde_fig,''plotflags'',', mat2str(plotflags), ');\n']); colstring=pdequote(getuprop(pde_fig,'colstring')); fprintf(fid,... ['setuprop(pde_fig,''colstring'',''', colstring, ''');\n']); arrowstring=pdequote(getuprop(pde_fig,'arrowstring')); fprintf(fid,... ['setuprop(pde_fig,''arrowstring'',''', arrowstring, ''');\n']); deformstring=pdequote(getuprop(pde_fig,'deformstring')); fprintf(fid,... ['setuprop(pde_fig,''deformstring'',''', deformstring, ''');\n']); heightstring=pdequote(getuprop(pde_fig,'heightstring')); fprintf(fid,... ['setuprop(pde_fig,''heightstring'',''', heightstring, ''');\n']); if ~abs(flags(3)) & flags(6), fprintf(fid,'\n%% Solve PDE:\n'); fprintf(fid,'pdetool(''solve'')\n'); end fclose(fid); % % case: load geometry through m-file elseif strcmp(action,'open') [infile,inpath]=uigetfile('*.m','Open',100,100); figure(pde_fig); set(pde_fig,'Pointer','watch') drawnow if infile~=0 instring=[inpath infile]; fid = fopen(instring,'r'); n=length(infile); if fid==-1 | n<2 pdetool('error',' File not found.'); elseif ~strcmp(lower(infile(n-1:n)),'.m') pdetool('error',' File is not an m-file.'); fclose(fid); else h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); need_save=flags(1); if need_save curr_file=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEEditMenu'),'UserData'); if isempty(curr_file) tmp=' Save changes in ''Untitled'' ?'; else tmp=[' Save changes in ' pdebasnm(curr_file) '?']; end answr=questdlg(tmp,'New','Yes','No','Cancel','Yes'); else answr = 'No'; end if strcmp(answr,'Cancel'), set(pde_fig,'Pointer','arrow') drawnow return; end if strcmp(answr,'Yes') if isempty(curr_file) pdetool('save_as'); else pdetool('save'); end end flags(1)=0; set(h,'UserData',flags) currdir=pwd; if strcmp(computer,'PCWIN'), % If PC Windows, strip '\' at end (ASCII 92) if abs(inpath(length(inpath)))==92, inpath=inpath(1:length(inpath)-1); end end cd(inpath); modelerror=0; eval(infile(1:n-2),'modelerror=1;') if modelerror, pdetool('error',sprintf(' Error executing Model M-file %s',infile)); set(pde_fig,'Pointer','arrow') drawnow fclose(fid); cd(currdir) return; end name=['PDE Toolbox - ', upper(infile)]; set(findobj(get(pde_fig,'Children'),'Tag','PDESave'),... 'Enable','on') set(findobj(get(pde_fig,'Children'),... 'flat','Tag','PDEEditMenu'),'UserData',instring) set(pde_fig,'Name',name) flags=get(h,'UserData'); flags(1)=0; set(h,'UserData',flags) fclose(fid); cd(currdir) end end set(pde_fig,'Pointer','arrow') drawnow % % case: new geometry elseif strcmp(action,'new') thesis_init; % H_mesh=findobj(get(pde_fig,'Parent'),'Name','有限元网格'); % if H_mesh close(findobj(get(pde_fig,'Parent'),'Name','有限元网格')); % end % H_spectrum=findobj(get(pde_fig,'Parent'),'Name','自振频谱'); % if H_spectrum close(findobj(get(pde_fig,'Parent'),'Name','自振频谱')); % end h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); need_save=flags(1); % A flag value is sent from PDEINIT to prevent % question dialog when starting from the command line % using a model M-file. if need_save, curr_file=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEEditMenu'),'UserData'); if isempty(curr_file) queststr=' Save changes in ''Untitled'' ?'; else queststr=[' Save changes in ' pdebasnm(curr_file) '?']; end answr=questdlg(queststr,'New','Yes','No','Cancel','Yes'); else answr = 'No'; end if strcmp(answr,'Cancel'), return, end if strcmp(answr,'Yes') if isempty(curr_file) pdetool('save_as'); else pdetool('save'); end end pdeinfo('Draw 2-D geometry.'); % Reset PDEGD matrix meshhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); set(meshhndl,'UserData',[]); bndhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); % Reset PDEDL matrix set(bndhndl,'UserData',[]); % Reset PDEBOUND matrix: set(findobj(get(bndhndl,'Children'),'flat','Tag','PDEBoundMode'),... 'UserData',[]); % Set current file name to an empty string set(findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'),... 'UserData',[]); % Disable export of boundary data set(findobj(get(bndhndl,'Children'),'flat','Tag','PDEExpBound'),... 'Enable','off') % Disable export of mesh set(findobj(get(meshhndl,'Children'),'flat','Tag','PDEExpMesh'),... 'Enable','off') % Turn off zoom if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'out') pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end ax=findobj(allchild(pde_fig),'flat','Tag','PDEAxes'); flagh=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flagh,'UserData'); mode_flag=flags(2); % some extra restoration job if New is invoked when in solve mode: if mode_flag, hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEval'); set(hndl,'Enable','on'); set(pde_fig,'Colormap',get(get(ax,'XLabel'),'UserData')) % delete colorbar and solution plot delete(findobj(get(pde_fig,'Children'),'flat','Tag','PDESolBar')) h=get(ax,'UserData'); delete(h) set(ax,'UserData',[],'Position',getuprop(ax,'axstdpos')) % clear boundary selection vector bndhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); set(findobj(get(bndhndl,'Children'),'flat','Tag','PDEBoundSpec'),... 'UserData',[]); % turn off labeling if needed if getuprop(pde_fig,'showsublbl'), pdetool sublbl end if getuprop(pde_fig,'showpdesublbl'), pdetool pdesublbl end if getuprop(pde_fig,'showedgelbl'), pdetool edgelbl end if getuprop(pde_fig,'showtrilbl'), pdetool pdetrilbl end if getuprop(pde_fig,'shownodelbl'), pdetool pdenodelbl end end % reset all flags set(flagh,'UserData',zeros(7,1)); filehndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); hndl=findobj(get(filehndl,'Children'),'flat','Tag','PDESave'); edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); hndl=[hndl findobj(get(edithndl,'Children'),'flat','Tag','PDEUndo')... findobj(get(edithndl,'Children'),'flat','Tag','PDECut')... findobj(get(edithndl,'Children'),'flat','Tag','PDECopy')... findobj(get(edithndl,'Children'),'flat','Tag','PDEClear')]; drawhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEDrawMenu'); hndl=[hndl findobj(get(drawhndl,'Children'),'flat','Tag','PDEExpGD')]; set(hndl,'Enable','off'); set(edithndl,'Enable','on') set(findobj(get(edithndl,'Children'),'flat','Tag','PDESelall'),... 'Enable','on','CallBack','pdeselect(''select'',1)') set(pde_fig,'name','PDE Toolbox - [Untitled]'); hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEval'); set(hndl,'String','','UserData',''); snap=getuprop(ax,'snap'); hndl=[findobj(get(ax,'Children'),'flat','Type','line')',... findobj(get(ax,'Children'),'flat','Type','text','Tag','PDELabel')',... findobj(get(ax,'Children'),'flat','Type','text','Tag','PDELblSel')',... findobj(get(ax,'Children'),'flat','Type','patch')']; delete(hndl) set(get(ax,'Title'),'String',''); user_data=get(pde_fig,'UserData'); user_data(5)=0; % pde_i user_data(6:7)=[0 0]; user_data=user_data(1:7); set(pde_fig,'UserData',user_data) set(get(ax,'ZLabel'),'UserData',[]) % un-select all draw features for i=1:5, btnup(pde_fig,'draw',i); end h=findobj(get(drawhndl,'Children'),'flat','Checked','on'); set(h,'Checked','off') % enable 'Rotate...': set(findobj(get(drawhndl,'Children'),'flat','Tag','PDERotate'),... 'Enable','on'); % reset property containers set(pde_fig,'WindowButtonDownFcn','pdeselect select'); setuprop(pde_fig,'objnames',[]); setuprop(pde_fig,'nodehandles',[]); setuprop(pde_fig,'trihandles',[]); setuprop(pde_fig,'meshstat',[]) setuprop(pde_fig,'bl',[]) setuprop(ax,'snap',snap); setuprop(ax,'subsel',[]); setuprop(ax,'bordsel',[]); setuprop(ax,'selinit',0); % Restore max no of triangles for adaptive solver to 1000 solveparams=getuprop(pde_fig,'solveparam'); setuprop(pde_fig,'solveparam',... str2mat(solveparams(1,:),'1000',solveparams(3:11,:))) set(pde_fig,'CurrentAxes',ax) refresh(pde_fig) % % case: exit elseif strcmp(action,'exit') h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); need_save=flags(1); if need_save curr_file=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEEditMenu'),'UserData'); if isempty(curr_file) queststr=' Save changes in ''Untitled'' ?'; else queststr=[' Save changes in ' pdebasnm(curr_file) '?']; end answr=questdlg(queststr,'Exit','Yes','No','Cancel','Yes'); else answr = 'No'; end if ~strcmp(answr,'Cancel') if strcmp(answr,'Yes') if isempty(curr_file) pdetool('save_as'); else pdetool('save'); end end % Close main PDETOOL figure and all open dialog boxes figs=get(0,'Children'); for i=1:length(figs), figlbl=lower(get(figs(i),'Tag')); if ~isempty(findstr(figlbl,'pde')) close(figs(i)) end end end whos; clear; % % case: print pde toolbox figure elseif strcmp(action,'print') kids=get(pde_fig,'Children'); btnaxes=[findobj(kids,'flat','Type','axes','Tag','draw'),... findobj(kids,'flat','Type','axes','Tag','solve'),... findobj(kids,'flat','Type','axes','Tag','zoom')]; uictrls = findobj(kids,'flat','Type','uicontrol'); hideme = [btnaxes(:); uictrls]; pdeprintdlg(pde_fig,[0 0.08 1 0.79],[0.05 0.05 .9 .9],hideme) % % case: handle callback from key presses elseif strcmp(action,'keycall') char=get(pde_fig,'CurrentCharacter'); if ~isempty(char) & (abs(char)==127 | abs(char)==8), % case: backspace or delete pdetool('clear') end % % case: change axes limits elseif strcmp(action,'axlim') pdeinfo('Enter axes limits.'); ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); xmax=get(ax,'XLim'); xmin=xmax(1); xmax=xmax(2); ymax=get(ax,'YLim'); ymin=ymax(1); ymax=ymax(2); PromptString = str2mat('X-axis range:','Y-axis range:'); OptFlags=[1, 0; 1, 0]; DefLim = [xmin xmax; ymin ymax]; figh=axlimdlg('Axes Limits',OptFlags,PromptString,[ax NaN ax],['x'; 'y'],DefLim,'pdetool(''applyaxlim''); '); set(figh,'Tag','PDEAxLimDlg') % % case: apply new axes limits (callback via AXLIMDLG) elseif strcmp(action,'applyaxlim') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); hndls=get(gcf,'UserData'); hndls=hndls(:,2); % EditField handles is 2nd column xlim=get(hndls(1),'UserData'); ylim=get(hndls(2),'UserData'); set(ax,'XLim',xlim, 'YLim',ylim,... 'DataAspectRatio',[1 1.5*diff(ylim)/diff(xlim) 1]); set(get(ax,'ZLabel'),'UserData',[]); opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); h=findobj(get(opthndl,'Children'),'flat','Tag','PDEAxeq'); set(h,'Checked','off') pdeinfo; % % case: set axes equal on/off elseif strcmp(action,'axeq') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax); opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); h=findobj(get(opthndl,'Children'),'flat','Tag','PDEAxeq'); if umtoggle(h), axpos = axis; dar = get(ax,'DataAspectRatio'); setuprop(ax,'axval',[axpos, dar]) axis equal else axval = getuprop(ax,'axval'); axpos = axval(1:4); dar = axval(5:7); axis(axpos); set(ax,'DataAspectRatio',dar) end set(get(ax,'ZLabel'),'UserData',[]); % % case: spacing elseif strcmp(action,'spacing') pdeinfo('Set x and y spacing. Separate entries using spaces, commas, semi-colons, or brackets.'); pdespdlg pdeinfo; % % case: draw line (polygon) elseif strcmp(action,'drawline') h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); mode_flag=flags(2); if mode_flag, pdetool('changemode',0) end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end btst=btnstate(pde_fig,'draw',1:5); if strcmp(get(pde_fig,'SelectionType'),'open'), btndown(pde_fig,'draw',5); sticks=zeros(6,1); sticks(5)=1; setuprop(pde_fig,'stick',sticks); return; else drawhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEDrawMenu'); ghndls=get(drawhndl,'UserData'); my_hndl=findobj(get(drawhndl,'Children'),'flat','Tag','PDEPoly'); if umtoggle(my_hndl), ghndls=ghndls(find(ghndls~=my_hndl)); set(ghndls,'Checked','off') if ~btst(5), btndown(pde_fig,'draw',5) btst(5)=1; end if btst(5), btst(5)=0; if any(btst), btnup(pde_fig,'draw',find(btst)); end end else btnup(pde_fig,'draw',5) ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); axKids=get(ax,'Children'); lines=findobj(axKids,'flat','Tag','PDELine'); % Erase any unfinished polygon lines if ~isempty(lines), set(lines,'Erasemode','normal'), set(lines,'Erasemode','xor') delete(lines) user_data=get(pde_fig,'UserData'); user_data=[user_data(1:4) zeros(1,4)]; set(pde_fig,'UserData',user_data) end set(pde_fig,'WindowButtonDownFcn','pdeselect select',... 'WindowButtonUpFcn','') setuprop(pde_fig,'stick',zeros(6,1)); pdeinfo('Draw and edit 2-D geometry by using the Draw and Edit menu options.'); return; end end drawhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEDrawMenu'); ghndls=get(drawhndl,'UserData'); pdeinfo(['Click to create lines.'... ' Click at starting point to close polygon.']); set(pde_fig,'WindowButtonDownFcn','pdetool lineclk',... 'WindowButtonUpFcn',''); user_data=get(pde_fig,'UserData'); i=user_data(5); if i>0, % If unfinished polygon on screen, enable undo: edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); hndl=findobj(get(edithndl,'Children'),'flat','Tag','PDEUndo'); set(hndl,'Enable','on'); end % % case: draw rectangle/square % % (flag=1 = drag from corner, flag=2 = drag from center) elseif strcmp(action,'drawrect') h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); mode_flag=flags(2); if mode_flag, pdetool('changemode',0) end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end btst=btnstate(pde_fig,'draw',1:5); if strcmp(get(pde_fig,'SelectionType'),'open'), btndown(pde_fig,'draw',flag); sticks=zeros(6,1); sticks(flag)=1; setuprop(pde_fig,'stick',sticks); return; else drawhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEDrawMenu'); ghndls=get(drawhndl,'UserData'); if flag==1, my_hndl=findobj(get(drawhndl,'Children'),'flat','Tag','PDERect'); elseif flag==2, my_hndl=findobj(get(drawhndl,'Children'),'flat','Tag','PDERectc'); end if umtoggle(my_hndl), ghndls=ghndls(find(ghndls~=my_hndl)); set(ghndls,'Checked','off') if ~btst(flag), btndown(pde_fig,'draw',flag) btst(flag)=1; end if btst(flag), btst(flag)=0; if any(btst), btnup(pde_fig,'draw',find(btst)); ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); axKids=get(ax,'Children'); lines=findobj(axKids,'flat','Tag','PDELine'); % Erase any unfinished polygon lines if ~isempty(lines), set(lines,'Erasemode','normal'), set(lines,'Erasemode','xor') delete(lines) user_data=get(pde_fig,'UserData'); user_data=[user_data(1:4) zeros(1,4)]; set(pde_fig,'UserData',user_data) end end end if flag==1, pdeinfo('Click at corner and drag to create rectangle/square.'); set(pde_fig,'WindowButtonDownFcn','pdetool(''rectstart'',1)',... 'WindowButtonUpFcn',''); elseif flag==2, pdeinfo('Click at center and drag to create rectangle/square.'); set(pde_fig,'WindowButtonDownFcn','pdetool(''rectstart'',2)',... 'WindowButtonUpFcn',''); end else btnup(pde_fig,'draw',flag) set(pde_fig,'WindowButtonDownFcn','pdeselect select') setuprop(pde_fig,'stick',zeros(6,1)); pdeinfo('Draw and edit 2-D geometry by using the Draw and Edit menu options.'); return; end end edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); hndl=findobj(get(edithndl,'Children'),'flat','Tag','PDEUndo'); set(hndl,'Enable','off'); % % case: draw ellipse/circle % % (flag=1 = drag from corner, flag=2 = drag from center) elseif strcmp(action,'drawellipse') h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); mode_flag=flags(2); if mode_flag, pdetool('changemode',0) end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end btst=btnstate(pde_fig,'draw',1:5); if strcmp(get(pde_fig,'SelectionType'),'open'), btndown(pde_fig,'draw',flag+2); sticks=zeros(6,1); sticks(flag+2)=1; setuprop(pde_fig,'stick',sticks); return; else drawhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEDrawMenu'); ghndls=get(drawhndl,'UserData'); if flag==1, my_hndl=findobj(get(drawhndl,'Children'),'flat','Tag','PDEEllip'); elseif flag==2, my_hndl=findobj(get(drawhndl,'Children'),'flat',... 'Tag','PDEEllipc'); end if umtoggle(my_hndl), ghndls=ghndls(find(ghndls~=my_hndl)); set(ghndls,'Checked','off') if ~btst(flag+2), btndown(pde_fig,'draw',flag+2) btst(flag+2)=1; end if btst(flag+2), btst(flag+2)=0; if any(btst), btnup(pde_fig,'draw',find(btst)); ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); axKids=get(ax,'Children'); lines=findobj(axKids,'flat','Tag','PDELine'); % Erase any unfinished polygon lines if ~isempty(lines), set(lines,'Erasemode','normal'), set(lines,'Erasemode','xor') delete(lines) user_data=get(pde_fig,'UserData'); user_data=[user_data(1:4) zeros(1,4)]; set(pde_fig,'UserData',user_data) end end end else btnup(pde_fig,'draw',flag+2) set(pde_fig,'WindowButtonDownFcn','pdeselect select',... 'WindowButtonUpFcn',''); setuprop(pde_fig,'stick',zeros(6,1)); pdeinfo('Draw and edit 2-D geometry by using the Draw and Edit menu options.'); return; end end if flag==1, pdeinfo('Click on perimeter and drag to create ellipse/circle.'); set(pde_fig,'WindowButtonDownFcn','pdetool(''circlecntr'',1)',... 'WindowButtonUpFcn',''); elseif flag==2, pdeinfo('Click at center and drag to create ellipse/circle.'); set(pde_fig,'WindowButtonDownFcn','pdetool(''circlecntr'',2)',... 'WindowButtonUpFcn',''); end edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); hndl=findobj(get(edithndl,'Children'),'flat','Tag','PDEUndo'); set(hndl,'Enable','off'); % % case: click to draw line (lineclk) elseif strcmp(action,'lineclk') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); if ~pdeonax(ax), return, end user_data=get(pde_fig,'UserData'); i=user_data(5); x=user_data(6:6+i-1); y=user_data(6+i:6+2*i-1); line_hndls=user_data(6+2*i:6+3*i-2); i=i+1; set(pde_fig,'CurrentAxes',ax) if strcmp(get(pde_fig,'SelectionType'),'alt') & i>1, x(i)=x(1); y(i)=y(1); else pv=get(ax,'CurrentPoint'); [x(i),y(i)]=pdesnap(ax,pv,getuprop(ax,'snap')); end if i==1, user_data=[user_data(1:4) i x y line_hndls]; set(pde_fig,'UserData',user_data); i=1+1; x(i)=x(i-1); y(i)=y(i-1); end hold on; hndl=line([x(i-1) x(i)],[y(i-1) y(i)],'color','r',... 'linestyle','-','Erasemode','xor'); hold off; set(ax,'UserData',hndl) set(pde_fig,'WindowButtonMotionFcn','pdemtncb(10)',... 'WindowButtonUpFcn','pdetool linedraw') % % case: button up function to draw line or completed polygon elseif strcmp(action,'linedraw') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); if ~pdeonax(ax), return, end user_data=get(pde_fig,'UserData'); i=user_data(5); x=user_data(6:6+i-1); y=user_data(6+i:6+2*i-1); line_hndls=user_data(6+2*i:6+3*i-2); i=i+1; if strcmp(get(pde_fig,'SelectionType'),'alt') & i>1, x(i)=x(1); y(i)=y(1); else pv=get(ax,'CurrentPoint'); [x(i),y(i)]=pdesnap(ax,pv,getuprop(ax,'snap')); end set(pde_fig,'WindowButtonMotionFcn','pdemtncb(0)','CurrentAxes',ax) delete(get(ax,'UserData')); set(ax,'UserData',[]); edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); undo_hndl=findobj(get(edithndl,'Children'),'flat','Tag','PDEUndo'); set(undo_hndl,'Enable','on'); xlim=get(ax,'Xlim'); ylim=get(ax,'Ylim'); gobj=[2, length(x), x, y]'; % Check polygon: polystat=csgchk(gobj,diff(xlim),diff(ylim)); if polystat>1, % Self-intersecting open or closed polygon pdetool('error',' Polygon lines must not overlap or intersect.'); if i==2, i=0; x=[]; y=[]; else i=i-1; x=x(1:i); y=y(1:i); end elseif polystat==1, % OK open polygon line_hndls(i-1)=line(x(i-1:i),... y(i-1:i),... 'Tag','PDELine',... 'Color','r',... 'EraseMode','background'); elseif polystat==0, % OK closed polygon set(pde_fig,'WindowButtonUpFcn',''); sticks=getuprop(pde_fig,'stick'); if ~any(sticks), set(pde_fig,'WindowButtonDownFcn','pdeselect select') end % polygon (lines): hndls=findobj(get(ax,'Children'),'flat',... 'Tag','PDELine'); delete(hndls) pdepoly(x(1:i-1),y(1:i-1)); if ~any(sticks), drawnow; btst=btnstate(pde_fig,'draw'); if any(btst) btnup(pde_fig,'draw',... find(btst)) end drawhndl=findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEDrawMenu'); h=findobj(get(drawhndl,'Children'),'flat','Checked','on'); set(h,'Checked','off') pdeinfo('Draw and edit 2-D geometry by using the Draw and Edit menu options.'); end set(undo_hndl,'Enable','off'); i=0; x=[]; y=[]; % polygon done; restart. end user_data=[user_data(1:4) i x y line_hndls]; set(pde_fig,'UserData',user_data) % % case: undo last line elseif strcmp(action,'undo') user_data=get(pde_fig,'UserData'); i=user_data(5); x=user_data(6:6+i-1); y=user_data(6+i:6+2*i-1); line_hndls=user_data(6+2*i:6+3*i-2); %lines ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); if i>1, set(line_hndls(i-1),'Erasemode','normal') set(line_hndls(i-1),'Erasemode','xor','Visible','off'); i=i-1; end if i==1 edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); hndl=findobj(get(edithndl,'Children'),'flat','Tag','PDEUndo'); set(hndl,'Enable','off'); i=0; end user_data=[user_data(1:4) i x(1:i) y(1:i) line_hndls(1:i-1)]; set(pde_fig,'UserData',user_data); % % case: cut selected object(s) out (flag=1) or copy to 'clipboard' (flag=2) elseif strcmp(action,'cut') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); selected=findobj(get(ax,'Children'),'flat','Tag','PDELblSel','Visible','on'); if ~isempty(selected) edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); hndl=findobj(get(edithndl,'Children'),'flat','Tag','PDEPaste'); set(hndl,'Enable','on') h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); pdegd=get(h,'UserData'); n=length(selected); for i=1:n, column=get(selected(i),'UserData'); clipboard(:,i)=pdegd(:,column); end set(findobj(get(edithndl,'Children'),'flat','Tag','PDECut'),... 'UserData',clipboard); if flag==1, % case: cut selected objects out pdetool('clear') end end % % case: click to draw circle elseif strcmp(action,'circlecntr') if ~pdeonax, return, end user_data=get(pde_fig,'UserData'); % flag: 1=drag from perimeter, 2=drag from center if flag==1, if strcmp(get(pde_fig,'SelectionType'),'alt'), %circle set(pde_fig,'WindowButtonMotionFcn','pdemtncb(-3)'); set(pde_fig,'WindowButtonUpFcn','pdetool(''circledraw'',1)'); else % ellipse set(pde_fig,'WindowButtonMotionFcn','pdemtncb(3)'); set(pde_fig,'WindowButtonUpFcn','pdetool(''circledraw'',2)'); end elseif flag==2, % circle if strcmp(get(pde_fig,'SelectionType'),'alt'), set(pde_fig,'WindowButtonMotionFcn','pdemtncb(-4)'); set(pde_fig,'WindowButtonUpFcn','pdetool(''circledraw'',3)'); else % ellipse set(pde_fig,'WindowButtonMotionFcn','pdemtncb(4)'); set(pde_fig,'WindowButtonUpFcn','pdetool(''circledraw'',4)'); end end ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax) pv=get(ax,'CurrentPoint'); [xc(1),xc(2)]=pdesnap(ax,pv,getuprop(ax,'snap')); t=0:pi/50:2*pi; radius=0; xt=sin(t)*radius+xc(1); yt=cos(t)*radius+xc(2); hold on; hndl=line(xt,yt,'Color','r','EraseMode','xor'); hold off; set(ax,'UserData',hndl) user_data(3:4)=xc; set(pde_fig,'UserData',user_data) % % case: mouse down to draw rectangle elseif strcmp(action,'rectstart') if ~pdeonax, return, end set(pde_fig,'WindowButtonUpFcn','pdetool(''rectdraw'')'); ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax) pv=get(ax,'CurrentPoint'); [tmp(1),tmp(2)]=pdesnap(ax,pv,getuprop(ax,'snap')); hold on; hndl=line([tmp(1) tmp(1) tmp(1) tmp(1) tmp(1)],... [tmp(2) tmp(2) tmp(2) tmp(2) tmp(2)],... 'Color','r','EraseMode','xor'); hold off; set(ax,'UserData',hndl) if flag==1, if strcmp(get(pde_fig,'SelectionType'),'alt'), set(pde_fig,'WindowButtonMotionFcn','pdemtncb(-1)') else set(pde_fig,'WindowButtonMotionFcn','pdemtncb(1)') end elseif flag==2, if strcmp(get(pde_fig,'SelectionType'),'alt'), set(pde_fig,'WindowButtonMotionFcn','pdemtncb(-2)') else set(pde_fig,'WindowButtonMotionFcn','pdemtncb(2)') end end % % case: mouse button up to draw ellipse/circle elseif strcmp(action,'circledraw') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); hndl=get(ax,'UserData'); if isempty(hndl) return; end user_data=get(pde_fig,'UserData'); origin=user_data(3:4); set(pde_fig,'WindowButtonMotionFcn','pdemtncb(0)',... 'WindowButtonUpFcn',''); sticks=getuprop(pde_fig,'stick'); pv=get(ax,'CurrentPoint'); [xcurr,ycurr]=pdesnap(ax,pv,getuprop(ax,'snap')); delete(hndl); set(ax,'UserData',[]); if ~isempty(origin) if flag==1, % circle - perimeter dif=max(abs(xcurr-origin(1)),abs(ycurr-origin(2))); xsign=sign(pv(1,1)-origin(1)); ysign=sign(pv(1,2)-origin(2)); if xsign==0, xsign=1; end if ysign==0, ysign=1; end xc=0.5*(dif*xsign+2*origin(1)); yc=0.5*(dif*ysign+2*origin(2)); radius=0.5*dif; if radius==0, return; end if ~any(sticks), set(pde_fig,'WindowButtonDownFcn','pdeselect select') end pdecirc(xc,yc,radius); elseif flag==2, % ellipse - perimeter origin=0.5*(origin+[xcurr, ycurr]); radiusx=sqrt((origin(1)-xcurr)*(origin(1)-xcurr)); radiusy=sqrt((origin(2)-ycurr)*(origin(2)-ycurr)); if (radiusx==0 | radiusy==0), return; end if ~any(sticks), set(pde_fig,'WindowButtonDownFcn','pdeselect select') end small=100*eps*min(diff(get(ax,'Xlim')),diff(get(ax,'Ylim'))); if abs(radiusx-radiusy)<small, pdecirc(origin(1),origin(2),radiusx); else pdeellip(origin(1),origin(2),radiusx,radiusy); end elseif flag==3, % circle - center dif=max(abs(xcurr-origin(1)),abs(ycurr-origin(2))); radius=dif; if radius==0, return; end if ~any(sticks), set(pde_fig,'WindowButtonDownFcn','pdeselect select') end pdecirc(origin(1),origin(2),radius); elseif flag==4, % ellipse - center radiusx=sqrt((origin(1)-xcurr)*(origin(1)-xcurr)); radiusy=sqrt((origin(2)-ycurr)*(origin(2)-ycurr)); if (radiusx==0 | radiusy==0), return; end if ~any(sticks), set(pde_fig,'WindowButtonDownFcn','pdeselect select') end small=100*eps*min(diff(get(ax,'Xlim')),diff(get(ax,'Ylim'))); if abs(radiusx-radiusy)<small, pdecirc(origin(1),origin(2),radiusx); else pdeellip(origin(1),origin(2),radiusx,radiusy); end end if ~any(sticks), drawnow; btst=btnstate(pde_fig,'draw'); if any(btst) btnup(pde_fig,'draw',... find(btst)) end drawhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEDrawMenu'); h=findobj(get(drawhndl,'Children'),'flat','Checked','on'); set(h,'Checked','off') pdeinfo('Draw and edit 2-D geometry by using the Draw and Edit menu options.'); end end % % case: mouse button up to draw rectangle elseif strcmp(action,'rectdraw') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); hndl=get(ax,'UserData'); if isempty(hndl), return; end set(pde_fig,'WindowButtonMotionFcn','pdemtncb(0)',... 'WindowButtonUpFcn',''); x=get(hndl,'Xdata'); y=get(hndl,'Ydata'); delete(hndl); set(ax,'UserData',[]); if y(3)~=y(1) & x(3)~=x(1), sticks=getuprop(pde_fig,'stick'); if ~any(sticks), set(pde_fig,'WindowButtonDownFcn','pdeselect select') end pderect([x(1:2) y([1 3])]); if ~any(sticks), drawnow; btst=btnstate(pde_fig,'draw'); if any(btst) btnup(pde_fig,'draw',... find(btst)) end drawhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEDrawMenu'); h=findobj(get(drawhndl,'Children'),'flat','Checked','on'); set(h,'Checked','off') pdeinfo('Draw and edit 2-D geometry by using the Draw and Edit menu options.'); end end % % case: clear patch elseif strcmp(action,'clear') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); selected=findobj(get(ax,'Children'),'flat','Tag','PDESelFrame',... 'Visible','on'); if isempty(selected), return; end n=length(selected); geom_cols=zeros(1,n); for i=1:n, geom_cols(i)=get(selected(i),'UserData'); end h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); pdegd=get(h,'UserData'); objmtx=getuprop(pde_fig,'objnames'); m=size(pdegd,2); if n>1 & m>1, ind=find(~sum(~(ones(n,1)*(1:m)-(ones(m,1)*geom_cols)'))); else ind=find(~(~(ones(n,1)*(1:m)-(ones(m,1)*geom_cols)'))); end pdegd=pdegd(:,ind); set(h,'UserData',pdegd); objmtx=objmtx(:,ind); setuprop(pde_fig,'objnames',objmtx) set(pde_fig,'Pointer','watch'); drawnow % First call DECSG to decompose geometry; [dl1,bt1,pdedl,bt,msb]=decsg(pdegd); pdepatch(pdedl,bt,msb); boundh=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); set(boundh,'UserData',pdedl) set(get(ax,'Title'),'UserData',bt) setuprop(pde_fig,'dl1',dl1) setuprop(pde_fig,'bt1',bt1) set(pde_fig,'Pointer','arrow'); drawnow evalhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEval'); if isempty(pdegd), pdeinfo('Draw 2-D geometry.'); h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); flags(1)=0; flags(3)=0; set(h,'UserData',flags) set(evalhndl,'String','') drawhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEDrawMenu'); hndl=findobj(get(drawhndl,'Children'),'flat','Tag','PDEExpGD'); set(hndl,'Enable','off') else m=size(pdegd,2); for i=1:m, lbl=deblank(setstr(objmtx(:,i)')); if i==1, evalstr=lbl; else evalstr=[evalstr '+' lbl]; end end % update set formula string set(evalhndl,'String',evalstr,'UserData',evalstr) end edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); hndl=findobj(get(edithndl,'Children'),'flat','Tag','PDEClear'); set(hndl,'Enable','off'); % % case: grid on/off elseif strcmp(action,'gridon') pde_kids = allchild(pde_fig); ax=findobj(pde_kids,'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax); opthndl=findobj(pde_kids,'flat','Tag','PDEOptMenu'); gridhndl=findobj(get(opthndl,'Children'),'flat','Tag','PDEGrid'); if nargin==2 set(ax,'XGrid',flag,'YGrid',flag) set(gridhndl,'Checked',flag) else if umtoggle(gridhndl), set(ax,'XGrid','on','YGrid','on') else set(ax,'XGrid','off','YGrid','off') snaphndl=findobj(get(opthndl,'Children'),'flat','Tag','PDESnap'); set(snaphndl,'Checked','off'); setuprop(ax,'snap',0); end end % % case: snap to grid on/off elseif strcmp(action,'snapon') pde_kids = allchild(pde_fig); ax=findobj(pde_kids,'flat','Tag','PDEAxes'); opthndl=findobj(pde_kids,'flat','Tag','PDEOptMenu'); snaphndl=findobj(get(opthndl,'Children'),'flat','Tag','PDESnap'); if nargin==2 % flag contains 'on' or 'off' if strcmp(flag,'on') setuprop(ax,'snap',1) else setuprop(ax,'snap',0) end set(snaphndl,'Checked',flag) else % toggle state setuprop(ax,'snap',umtoggle(snaphndl)); end % % case: enter boundary mode (define boundary conditions, alter subdomains) elseif strcmp(action,'boundmode') % if no geometry, create a default L-shape: pdegd=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEMeshMenu'),'UserData'); if isempty(pdegd), pdetool('membrane'), end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end flg_hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); flag1=flags(3); if abs(flag1), pdetool('changemode',0) end flags=get(flg_hndl,'UserData'); if flags(3)==-1, % error in decsg return; elseif ~flags(2), pdetool('cleanup') end ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax,... 'WindowButtonDownFcn','',... 'WindowButtonUpFcn','') flags=get(flg_hndl,'UserData'); if flags(2)~=1 flags(2)=1; % mode_flag=1 set(flg_hndl,'UserData',flags) pdetool('clearsol') % turn off everything else, light up boundary and subdomain lines kids=get(ax,'Children'); set(kids,'Erasemode','normal'); set(kids,'Erasemode','xor','Visible','off') hh=[findobj(get(ax,'Children'),'flat','Tag','PDEBoundLine')'... findobj(get(ax,'Children'),'flat','Tag','PDEBorderLine')']; if isempty(hh), pdetool('drawbounds') else bndhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); selecth=findobj(get(bndhndl,'Children'),'flat','Tag','PDEBoundSpec'); selbounds=get(selecth,'UserData'); set(selecth,'UserData',[]) for i=1:length(selbounds), col=get(selbounds(i),'UserData'); set(selbounds(i),'color',col(2:4)) end set(hh,'Erasemode','background','Visible','on') end end pdeinfo('Click to select boundaries. Double-click to open boundary condition dialog box.'); edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); set(edithndl,'Enable','on') set(findobj(get(edithndl,'Children'),'flat','Tag','PDESelall'),... 'Enable','on','CallBack','pdetool(''boundclk'',1)') % enable removal of interior subdomain boundaries menuhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); hbound(1)=findobj(get(menuhndl,'Children'),'flat','Tag','PDERemBord'); hbound(2)=findobj(get(menuhndl,'Children'),'flat','Tag','PDERemAllBord'); set(hbound,'Enable','on') % if requested, label subdomains and/or edges: if getuprop(pde_fig,'showsublbl'), pdetool('showsublbl',1) end if getuprop(pde_fig,'showedgelbl'), pdetool('showedgelbl',1) end % % case: enter PDE mode (enter PDE coefficients per subdomain) elseif strcmp(action,'pdemode') % if no geometry, create a default L-shape: pdegd=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEMeshMenu'),'UserData'); if isempty(pdegd), pdetool('membrane'), end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end flg_hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); flag1=flags(3); if abs(flag1), pdetool('changemode',0) end flags=get(flg_hndl,'UserData'); if flags(3)==-1, % error in decsg return; elseif ~flags(2), pdetool('cleanup') end flags(2)=4; % mode_flag=4 set(flg_hndl,'UserData',flags) pdeinfo('Click on subdomains to select. Double-click to open PDE Specification dialog box.'); edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); set(edithndl,'Enable','on') set(findobj(get(edithndl,'Children'),'flat','Tag','PDESelall'),... 'Enable','on','CallBack','pdetool(''subclk'',1)') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax,... 'WindowButtonDownFcn','pdetool(''subclk'')',... 'WindowButtonUpFcn','') pdetool('clearsol') % turn off everything else kids=get(ax,'Children'); set(kids,'Erasemode','normal'); set(kids,'Erasemode','xor','Visible','off') boundh=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); dl=get(boundh,'UserData'); bt=get(get(ax,'Title'),'UserData'); msb=getuprop(pde_fig,'msb'); h=findobj(get(ax,'Children'),'flat','Tag','PDESubDom'); if isempty(h), pdepatch(dl,bt,msb,1) else set(h,'Erasemode','none','Visible','on'); end % reset selection array and display the subdomain borders: setuprop(ax,'subsel',[]) h=findobj(get(ax,'Children'),'flat','Tag','PDESelRegion'); if ~isempty(h), delete(h); end dl1=getuprop(pde_fig,'dl1'); pdebddsp(dl1) % if requested, label subdomains: if getuprop(pde_fig,'showpdesublbl'), pdetool('showsublbl',1) end % disable removal of interior subdomain boundaries menuhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); hbound(1)=findobj(get(menuhndl,'Children'),'flat','Tag','PDERemBord'); hbound(2)=findobj(get(menuhndl,'Children'),'flat','Tag','PDERemAllBord'); set(hbound,'Enable','off') % % case: manage edge labeling flags and indication elseif strcmp(action,'edgelbl') h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); mode_flag=flags(2); h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); edgeh=findobj(get(h,'Children'),'flat','Tag','PDEShowEdge'); if umtoggle(edgeh), setuprop(pde_fig,'showedgelbl',1); if mode_flag==1, pdetool('showedgelbl',1) end else setuprop(pde_fig,'showedgelbl',0); if mode_flag==1, pdetool('showedgelbl',0) end end % % case: manage subdomain labeling flags and indication elseif strcmp(action,'sublbl') h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); mode_flag=flags(2); h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); subh=findobj(get(h,'Children'),'flat','Tag','PDEShowSub'); if umtoggle(subh), setuprop(pde_fig,'showsublbl',1); if mode_flag==1, pdetool('showsublbl',1) end else setuprop(pde_fig,'showsublbl',0); if mode_flag==1, pdetool('showsublbl',0) end end % % case: manage pde mode subdomain labeling flags and indication elseif strcmp(action,'pdesublbl') h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); mode_flag=flags(2); h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEPDEMenu'); subh=findobj(get(h,'Children'),'flat','Tag','PDEShowPDESub'); if umtoggle(subh), setuprop(pde_fig,'showpdesublbl',1); if mode_flag==4, pdetool('showsublbl',1) end else setuprop(pde_fig,'showpdesublbl',0); if mode_flag==4, pdetool('showsublbl',0) end end % % case: manage mesh node labeling flags and indication elseif strcmp(action,'pdenodelbl') h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); mode_flag=flags(2); h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); nodeh=findobj(get(h,'Children'),'flat','Tag','PDEShowNode'); if umtoggle(nodeh), setuprop(pde_fig,'shownodelbl',1); if mode_flag==2, pdetool('shownodelbl',1) end else setuprop(pde_fig,'shownodelbl',0); if mode_flag==2, pdetool('shownodelbl',0) end end % % case: manage mesh triangle labeling flags and indication elseif strcmp(action,'pdetrilbl') h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); mode_flag=flags(2); h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); trih=findobj(get(h,'Children'),'flat','Tag','PDEShowTriangles'); if umtoggle(trih) setuprop(pde_fig,'showtrilbl',1); if mode_flag==2, pdetool('showtrilbl',1) end else setuprop(pde_fig,'showtrilbl',0); if mode_flag==2, pdetool('showtrilbl',0) end end % % case: display subdomain labels for decomposed geometry elseif strcmp(action,'showsublbl') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax) h=findobj(get(ax,'Children'),'flat','Tag','PDESubLabel'); set(h,'Erasemode','normal'), set(h,'Erasemode','xor') delete(h) if flag, % flag is set: display labels bt1=getuprop(pde_fig,'bt1'); p1=getuprop(pde_fig,'pinit2'); t1=getuprop(pde_fig,'tinit2'); A=pdetrg(p1,t1); small=100*eps*min(diff(get(ax,'Xlim')),diff(get(ax,'Ylim'))); n=size(bt1,1); for i=1:n, tri=find(t1(4,:)==i); Amax=find(A(tri)==max(A(tri))); Amax=Amax(1); xm=mean(p1(1,t1(1:3,tri(Amax)))); ym=mean(p1(2,t1(1:3,tri(Amax)))); text('String',int2str(i),'Units','data',... 'Clipping','on','EraseMode','background',... 'Tag','PDESubLabel','HorizontalAlignment','center',... 'pos',[xm ym 1],'color','k'); end end % % case: display edge labels for decomposed geometry elseif strcmp(action,'showedgelbl') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax) h=findobj(get(ax,'Children'),'flat','Tag','PDEEdgeLabel'); set(h,'Erasemode','normal'), set(h,'Erasemode','xor') delete(h) if flag, % flag is set: display labels dl1=getuprop(pde_fig,'dl1'); n=size(dl1,2); for i=1:n, if dl1(1,i)==1, % circle th1=atan2(dl1(4,i)-dl1(9,i),dl1(2,i)-dl1(8,i)); th2=atan2(dl1(5,i)-dl1(9,i),dl1(3,i)-dl1(8,i)); if th2<th1, th2=th2+2*pi; end arg=(th2+th1)/2; xm=dl1(8,i)+cos(arg)*dl1(10,i); ym=dl1(9,i)+sin(arg)*dl1(10,i); elseif dl1(1,i)==4, % ellipse ca=cos(dl1(12,i)); sa=sin(dl1(12,i)); xd=dl1(2,i)-dl1(8,i); yd=dl1(4,i)-dl1(9,i); x1=ca*xd+sa*yd; y1=-sa*xd+ca*yd; th1=atan2(y1./dl1(11,i),x1./dl1(10,i)); xd=dl1(3,i)-dl1(8,i); yd=dl1(5,i)-dl1(9,i); x1=ca*xd+sa*yd; y1=-sa*xd+ca*yd; th2=atan2(y1./dl1(11,i),x1./dl1(10,i)); if th2<th1, th2=th2+2*pi; end arg=(th2+th1)/2; x1=dl1(10,i)*cos(arg); y1=dl1(11,i)*sin(arg); xm=dl1(8,i)+ca*x1-sa*y1; ym=dl1(9,i)+sa*x1+ca*y1; else xm=0.5*(dl1(2,i)+dl1(3,i)); ym=0.5*(dl1(4,i)+dl1(5,i)); end text('String',int2str(i),'Units','data',... 'Clipping','on','EraseMode','background',... 'Tag','PDEEdgeLabel','HorizontalAlignment','center',... 'pos',[xm ym 1],'color','k'); end end % % case: display mesh node labels elseif strcmp(action,'shownodelbl') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax) set(pde_fig,'Pointer','watch') drawnow h=getuprop(pde_fig,'nodehandles'); set(h,'Erasemode','normal'), set(h,'Erasemode','xor') delete(h) if flag, % flag is set: display labels % get node data for the current mesh h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); hp=findobj(get(h,'Children'),'flat','Tag','PDEInitMesh'); ht=findobj(get(h,'Children'),'flat','Tag','PDEMeshParam'); p=get(hp,'UserData'); t=get(ht,'UserData'); scale=min(diff(get(ax,'Xlim')),diff(get(ax,'Ylim'))); ind=t(:,1)'; ind=[ind(1:3), ind(1)]; trilength=max(mean(abs(diff(p(1,ind)))),mean(abs(diff(p(2,ind))))); if trilength/scale>0.06, fsize=10; elseif trilength/scale>0.04, fsize=8; elseif trilength/scale>0.02 fsize=6; elseif trilength/scale>0.01 fsize=5; elseif trilength/scale>0.005 fsize=4; else fsize=3; end n=size(p,2); for i=1:n, txt(i)=text('String',int2str(i),'Units','data',... 'Clipping','on','EraseMode','background',... 'Tag','PDENodeLabel','HorizontalAlignment','center',... 'FontSize',fsize,'pos',[p(1,i) p(2,i) 1],'color','k'); end setuprop(pde_fig,'nodehandles',txt); else setuprop(pde_fig,'nodehandles',[]); end set(pde_fig,'Pointer','arrow') drawnow % % case: display mesh triangle labels elseif strcmp(action,'showtrilbl') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax) set(pde_fig,'Pointer','watch') drawnow h=getuprop(pde_fig,'trihandles'); set(h,'Erasemode','normal'), set(h,'Erasemode','xor') delete(h) if flag, % flag is set: display labels % get node data for the current mesh h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); hp=findobj(get(h,'Children'),'flat','Tag','PDEInitMesh'); ht=findobj(get(h,'Children'),'flat','Tag','PDEMeshParam'); p=get(hp,'UserData'); t=get(ht,'UserData'); scale=min(diff(get(ax,'Xlim')),diff(get(ax,'Ylim'))); ind=t(:,1)'; ind=[ind(1:3), ind(1)]; trilength=max(mean(abs(diff(p(1,ind)))),mean(abs(diff(p(2,ind))))); if trilength/scale>0.06, fsize=10; elseif trilength/scale>0.04, fsize=8; elseif trilength/scale>0.02 fsize=6; elseif trilength/scale>0.01 fsize=5; elseif trilength/scale>0.005 fsize=4; else fsize=3; end n=size(t,2); for i=1:n, xm=mean(p(1,t(1:3,i))); ym=mean(p(2,t(1:3,i))); txt(i)=text('String',int2str(i),'Units','data',... 'Clipping','on','EraseMode','background',... 'Tag','PDETriLabel','HorizontalAlignment','center',... 'FontSize',fsize,'pos',[xm ym 1],'color','k'); end setuprop(pde_fig,'trihandles',txt) else setuprop(pde_fig,'trihandles',[]) end set(pde_fig,'Pointer','arrow') drawnow % % case: enter mesh mode (display mesh, create if non-existent) elseif strcmp(action,'meshmode') % if no geometry, create a default L-shape: pdegd=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEMeshMenu'),'UserData'); if isempty(pdegd), pdetool('membrane'), end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end ax=findobj(allchild(pde_fig),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax,'WindowButtonDownFcn','') flg_hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); flag1=flags(3); if abs(flag1), pdetool('changemode',0) end flags=get(flg_hndl,'UserData'); if flags(3)==-1, % error in decsg return; elseif ~flags(2), pdetool('cleanup') end flags=get(flg_hndl,'UserData'); flag2=flags(4); if flag2, pdetool('initmesh') else % Hide decomposition lines (=subdomain boundaries), boundary lines, % labels, and subdomains: hKids=get(ax,'Children'); h=[findobj(hKids,'flat','Tag','PDEBoundLine')'... findobj(hKids,'flat','Tag','PDESubLabel')'... findobj(hKids,'flat','Tag','PDEEdgeLabel')'... findobj(hKids,'flat','Tag','PDESubDom')'... findobj(hKids,'flat','Tag','PDEBorderLine')'... findobj(hKids,'flat','Tag','PDESelRegion')']; set(h,'Erasemode','normal') set(h,'Erasemode','xor','Visible','off') flags=get(flg_hndl,'UserData'); flags(2)=2; % mode_flag=2 set(flg_hndl,'UserData',flags) pdetool('clearsol') drawnow h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); hp=findobj(get(h,'Children'),'flat','Tag','PDEInitMesh'); he=findobj(get(h,'Children'),'flat','Tag','PDERefine'); ht=findobj(get(h,'Children'),'flat','Tag','PDEMeshParam'); p=get(hp,'UserData'); e=get(he,'UserData'); t=get(ht,'UserData'); % erase old mesh h=findobj(get(ax,'Children'),'flat','Tag','PDEMeshLine'); set(h,'Erasemode','normal'); set(h,'Erasemode','xor'); delete(h) % create and plot the mesh h=pdeplot(p,e,t,'intool','on'); set(h,'Erasemode','none','Tag','PDEMeshLine'); % if requested, label nodes and/or triangles: if getuprop(pde_fig,'shownodelbl'), pdetool('shownodelbl',1) end if getuprop(pde_fig,'showtrilbl'), pdetool('showtrilbl',1) end end edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); set([edithndl findobj(get(edithndl,'Children'),'flat','Tag','PDESelall')],... 'Enable','off') % Enable clicking on mesh to get info about triangle and node no's: set(pde_fig,'WindowButtonDownFcn','pdeinfclk(1)',... 'WindowButtonUpFcn','if pdeonax, pdeinfo; end') pdeinfo('Refine or jiggle mesh, label mesh nodes and triangles, display mesh quality plot.'); % % case: initialize mesh elseif strcmp(action,'initmesh') appl=getuprop(pde_fig,'application'); pde_type=get(findobj(get(pde_fig,'Children'),'flat','Tag','PDEHelpMenu'),'UserData'); % if no geometry, create a default L-shape: pdegd=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEMeshMenu'),'UserData'); if isempty(pdegd), pdetool('membrane'), end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end flg_hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); flag1=flags(3); if abs(flag1), pdetool('changemode',0) end flags=get(flg_hndl,'UserData'); if flags(3)==-1, % error in decsg return; elseif ~flags(2), pdetool('cleanup') end flags=get(flg_hndl,'UserData'); flags(2)=2; % mode_flag=2 set(flg_hndl,'UserData',flags) ax=findobj(allchild(pde_fig),'flat','Tag','PDEAxes'); pdeinfo('Initializing mesh...',0); set(pde_fig,'CurrentAxes',ax,'Pointer','watch','WindowButtonDownFcn','') drawnow dl1=getuprop(pde_fig,'dl1'); pdetool('clearsol') % Hide decomposition lines (=subdomain boundaries), boundary lines, % labels, and subdomains: hKids=get(ax,'Children'); h=[findobj(hKids,'flat','Tag','PDEBoundLine')'... findobj(hKids,'flat','Tag','PDESubLabel')'... findobj(hKids,'flat','Tag','PDEEdgeLabel')'... findobj(hKids,'flat','Tag','PDESubDom')'... findobj(hKids,'flat','Tag','PDEBorderLine')'... findobj(hKids,'flat','Tag','PDESelRegion')']; set(h,'Erasemode','normal') set(h,'Erasemode','xor','Visible','off') drawnow trisize=getuprop(pde_fig,'trisize'); Hgrad=getuprop(pde_fig,'Hgrad'); jiggleparam=getuprop(pde_fig,'jiggle'); jiggle=deblank(jiggleparam(1,:)); if strcmp(jiggle,'on'), jiggle=deblank(jiggleparam(2,:)); end jiggleiter=deblank(jiggleparam(3,:)); if appl==1 & pde_type==4 & RegularMesh==1 p=t_p; e=t_e; t=t_t; else if isempty(trisize), if isempty(jiggleiter), [p,e,t]=initmesh(dl1,'jiggle',jiggle,'Hgrad',Hgrad); else [p,e,t]=initmesh(dl1,'jiggle',jiggle,'Hgrad',Hgrad,'jiggleiter',str2num(jiggleiter)); end else if isempty(jiggleiter), [p,e,t]=initmesh(dl1,'hmax',trisize,'jiggle',jiggle,'Hgrad',Hgrad); else [p,e,t]=initmesh(dl1,'hmax',trisize,'jiggle',jiggle,'Hgrad','Hgrad','jiggleiter',str2num(jiggleiter)); end end end meshhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); h=findobj(get(meshhndl,'Children'),'flat','Tag','PDERefine'); set(h,'Enable','on'); h=findobj(get(meshhndl,'Children'),'flat','Tag','PDEUnrefine'); set(h,'Enable','off'); % erase old mesh h=findobj(get(ax,'Children'),'flat','Tag','PDEMeshLine'); set(h,'Erasemode','normal'); set(h,'Erasemode','xor'); delete(h) % create and plot the mesh h=pdeplot(p,e,t,'intool','on'); set(h,'Erasemode','none','Tag','PDEMeshLine'); % save p, e, t set(findobj(get(meshhndl,'Children'),'flat','Tag','PDEInitMesh'),... 'UserData',p) set(findobj(get(meshhndl,'Children'),'flat','Tag','PDERefine'),... 'UserData',e) set(findobj(get(meshhndl,'Children'),'flat','Tag','PDEMeshParam'),... 'UserData',t) % if requested, label nodes and/or triangles: if getuprop(pde_fig,'shownodelbl'), pdetool('shownodelbl',1) end if getuprop(pde_fig,'showtrilbl'), pdetool('showtrilbl',1) end % enable export set(findobj(get(meshhndl,'Children'),'flat','Tag','PDEExpMesh'),... 'Enable','on') set(pde_fig,'Pointer','arrow') drawnow infostr=sprintf('Initialized mesh consists of %i nodes and %i triangles.',... size(p,2),size(t,2)); pdeinfo(infostr); flags=get(flg_hndl,'UserData'); flags(1)=1; % need_save=1 flags(4)=0; % flag2=0 flags(5)=1; % flag3=1 flags(6)=0; % flag4=0 set(flg_hndl,'UserData',flags) setuprop(pde_fig,'meshstat',1) % save this generation of the mesh for unrefine purposes setuprop(pde_fig,'p1',p); setuprop(pde_fig,'e1',e); setuprop(pde_fig,'t1',t); % Update max no of triangle default for adaptive solver % Double the current no, or 1000, whichever is greatest: solveparams=getuprop(pde_fig,'solveparam'); tristr=int2str(max(1.5*size(t,2),1000)); setuprop(pde_fig,'solveparam',... str2mat(solveparams(1,:),tristr,solveparams(3:11,:))) % disable removal of interior subdomain boundaries menuhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); hbound(1)=findobj(get(menuhndl,'Children'),'flat','Tag','PDERemBord'); hbound(2)=findobj(get(menuhndl,'Children'),'flat','Tag','PDERemAllBord'); set(hbound,'Enable','off') edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); set([edithndl findobj(get(edithndl,'Children'),'flat','Tag','PDESelall')],... 'Enable','off') % Enable clicking on mesh to get info about triangle and node no's: set(pde_fig,'WindowButtonDownFcn','pdeinfclk(1)',... 'WindowButtonUpFcn','if pdeonax, pdeinfo; end') % % case: refine mesh elseif strcmp(action,'refine') % if no geometry, create a default L-shape: pdegd=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEMeshMenu'),'UserData'); if isempty(pdegd), pdetool('membrane'), end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end flg_hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); flag1=flags(3); if abs(flag1), pdetool('changemode',0) end flags=get(flg_hndl,'UserData'); if flags(3)==-1, % error in decsg return; elseif ~flags(2), pdetool('cleanup') end flags=get(flg_hndl,'UserData'); flag2=flags(4); if flag2, pdetool('initmesh') end flags=get(flg_hndl,'UserData'); flags(2)=2; % mode_flag=2 set(flg_hndl,'UserData',flags) ax=findobj(allchild(pde_fig),'flat','Tag','PDEAxes'); pdeinfo('Refining mesh...',0); set(pde_fig,'CurrentAxes',ax,'Pointer','watch','WindowButtonDownFcn','') drawnow pdetool('clearsol') % Hide decomposition lines (=subdomain boundaries), boundary lines, % labels, and subdomains: hKids=get(ax,'Children'); h=[findobj(hKids,'flat','Tag','PDEBoundLine')'... findobj(hKids,'flat','Tag','PDESubLabel')'... findobj(hKids,'flat','Tag','PDEEdgeLabel')'... findobj(hKids,'flat','Tag','PDESubDom')'... findobj(hKids,'flat','Tag','PDEBorderLine')'... findobj(hKids,'flat','Tag','PDESelRegion')']; set(h,'Erasemode','normal') set(h,'Erasemode','xor','Visible','off') drawnow h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); hp=findobj(get(h,'Children'),'flat','Tag','PDEInitMesh'); he=findobj(get(h,'Children'),'flat','Tag','PDERefine'); ht=findobj(get(h,'Children'),'flat','Tag','PDEMeshParam'); p=get(hp,'UserData'); e=get(he,'UserData'); t=get(ht,'UserData'); % erase old mesh h=findobj(get(ax,'Children'),'flat','Tag','PDEMeshLine'); set(h,'Erasemode','normal'); set(h,'Erasemode','xor'); delete(h) % refine the mesh dl1=getuprop(pde_fig,'dl1'); refmet=getuprop(pde_fig,'refinemethod'); [p,e,t]=refinemesh(dl1,p,e,t,refmet); meshhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); h=findobj(get(meshhndl,'Children'),'flat','Tag','PDEUnrefine'); set(h,'Enable','on'); % plot the new mesh h=pdeplot(p,e,t,'intool','on'); set(h,'Erasemode','none','Tag','PDEMeshLine'); set(hp,'UserData',p), set(he,'UserData',e), set(ht,'UserData',t) % if requested, label nodes and/or triangles: if getuprop(pde_fig,'shownodelbl'), pdetool('shownodelbl',1) end if getuprop(pde_fig,'showtrilbl'), pdetool('showtrilbl',1) end flags=get(flg_hndl,'UserData'); flags(1)=1; % need_save=1 flags(5)=1; % flag3=1 flags(6)=0; % flag4=0 set(flg_hndl,'UserData',flags) meshstat=getuprop(pde_fig,'meshstat'); meshstat=[meshstat 2]; n=length(meshstat); setuprop(pde_fig,'meshstat',meshstat); % save this generation of the mesh for unrefine purposes setuprop(pde_fig,['p' int2str(n)],p); setuprop(pde_fig,['e' int2str(n)],e); setuprop(pde_fig,['t' int2str(n)],t); % Update max no of triangle default for adaptive solver % Double the current no, or 1000, whichever is greatest: solveparams=getuprop(pde_fig,'solveparam'); tristr=int2str(max(1.5*size(t,2),1000)); setuprop(pde_fig,'solveparam',... str2mat(solveparams(1,:),tristr,solveparams(3:11,:))) set(pde_fig,'Pointer','arrow') drawnow infostr=sprintf('Refined mesh consists of %i nodes and %i triangles.',... size(p,2),size(t,2)); pdeinfo(infostr); edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); set([edithndl findobj(get(edithndl,'Children'),'flat','Tag','PDESelall')],... 'Enable','off') % Enable clicking on mesh to get info about triangle and node no's: set(pde_fig,'WindowButtonDownFcn','pdeinfclk(1)',... 'WindowButtonUpFcn','if pdeonax, pdeinfo; end') % % case: jiggle mesh elseif strcmp(action,'jiggle') % if no geometry, create a default L-shape: pdegd=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEMeshMenu'),'UserData'); if isempty(pdegd), pdetool('membrane'), end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end flg_hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); flag1=flags(3); if abs(flag1), pdetool('changemode',0) end flags=get(flg_hndl,'UserData'); if flags(3)==-1, % error in decsg return; elseif ~flags(2), pdetool('cleanup') end flags=get(flg_hndl,'UserData'); flag2=flags(4); if flag2, pdetool('initmesh') end flags=get(flg_hndl,'UserData'); flags(2)=2; % mode_flag=2 set(flg_hndl,'UserData',flags) ax=findobj(allchild(pde_fig),'flat','Tag','PDEAxes'); pdeinfo('Jiggling mesh...',0); set(pde_fig,'CurrentAxes',ax,'Pointer','watch','WindowButtonDownFcn','') drawnow pdetool('clearsol') % Hide decomposition lines (=subdomain boundaries), boundary lines, % labels, and subdomains: hKids=get(ax,'Children'); h=[findobj(hKids,'flat','Tag','PDEBoundLine')'... findobj(hKids,'flat','Tag','PDESubLabel')'... findobj(hKids,'flat','Tag','PDEEdgeLabel')'... findobj(hKids,'flat','Tag','PDESubDom')'... findobj(hKids,'flat','Tag','PDEBorderLine')'... findobj(hKids,'flat','Tag','PDESelRegion')']; set(h,'Erasemode','normal') set(h,'Erasemode','xor','Visible','off') drawnow h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); hp=findobj(get(h,'Children'),'flat','Tag','PDEInitMesh'); he=findobj(get(h,'Children'),'flat','Tag','PDERefine'); ht=findobj(get(h,'Children'),'flat','Tag','PDEMeshParam'); p=get(hp,'UserData'); e=get(he,'UserData'); t=get(ht,'UserData'); % erase old mesh plot h=findobj(get(ax,'Children'),'flat','Tag','PDEMeshLine'); set(h,'Erasemode','normal'); set(h,'Erasemode','xor'); delete(h) % jiggle the mesh jiggleparam=getuprop(pde_fig,'jiggle'); jiggleopt=deblank(jiggleparam(2,:)); if strcmp(jiggleopt,'on'), jiggleopt='off'; end jiggleiter=deblank(jiggleparam(3,:)); if isempty(jiggleiter), p=jigglemesh(p,e,t,'opt',jiggleopt); else p=jigglemesh(p,e,t,'opt',jiggleopt,'iter',str2num(jiggleiter)); end meshhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); h=findobj(get(meshhndl,'Children'),'flat','Tag','PDEUnrefine'); set(h,'Enable','on'); % plot the new mesh h=pdeplot(p,e,t,'intool','on'); set(h,'Erasemode','none','Tag','PDEMeshLine'); set(hp,'UserData',p) % if requested, label nodes and/or triangles: if getuprop(pde_fig,'shownodelbl'), pdetool('shownodelbl',1) end if getuprop(pde_fig,'showtrilbl'), pdetool('showtrilbl',1) end flags=get(flg_hndl,'UserData'); flags(1)=1; % need_save=1 flags(5)=1; % flag3=1 flags(6)=0; % flag4=0 set(flg_hndl,'UserData',flags) meshstat=getuprop(pde_fig,'meshstat'); meshstat=[meshstat 3]; n=length(meshstat); setuprop(pde_fig,'meshstat',meshstat); % save this generation of the mesh for unrefine purposes setuprop(pde_fig,['p' int2str(n)],p); setuprop(pde_fig,['e' int2str(n)],e); setuprop(pde_fig,['t' int2str(n)],t); set(pde_fig,'Pointer','arrow') drawnow infostr=sprintf('Jiggled mesh consists of %i nodes and %i triangles.',... size(p,2),size(t,2)); pdeinfo(infostr); edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); set([edithndl findobj(get(edithndl,'Children'),'flat','Tag','PDESelall')],... 'Enable','off') % Enable clicking on mesh to get info about triangle and node no's: set(pde_fig,'WindowButtonDownFcn','pdeinfclk(1)',... 'WindowButtonUpFcn','if pdeonax, pdeinfo; end') % % case: unrefine mesh - undo last mesh change elseif strcmp(action,'unrefine') if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end flg_hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); flag1=flags(3); if abs(flag1), pdetool('changemode',0) end flags=get(flg_hndl,'UserData'); if flags(3)==-1, % error in decsg return; elseif ~flags(2), pdetool('cleanup') end flags=get(flg_hndl,'UserData'); flag2=flags(4); if flag2, pdetool('initmesh') end flags=get(flg_hndl,'UserData'); flags(2)=2; % mode_flag=2 set(flg_hndl,'UserData',flags) ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); pdeinfo('Unrefining the mesh...'); set(pde_fig,'CurrentAxes',ax,'Pointer','watch','WindowButtonDownFcn','') drawnow pdetool('clearsol') % Hide decomposition lines (=subdomain boundaries), boundary lines, % labels, and subdomains: hKids=get(ax,'Children'); h=[findobj(hKids,'flat','Tag','PDEBoundLine')'... findobj(hKids,'flat','Tag','PDESubLabel')'... findobj(hKids,'flat','Tag','PDEEdgeLabel')'... findobj(hKids,'flat','Tag','PDESubDom')'... findobj(hKids,'flat','Tag','PDEBorderLine')'... findobj(hKids,'flat','Tag','PDESelRegion')']; set(h,'Erasemode','normal') set(h,'Erasemode','xor','Visible','off') drawnow h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); hp=findobj(get(h,'Children'),'flat','Tag','PDEInitMesh'); he=findobj(get(h,'Children'),'flat','Tag','PDERefine'); ht=findobj(get(h,'Children'),'flat','Tag','PDEMeshParam'); % erase old mesh h=findobj(hKids,'flat','Tag','PDEMeshLine'); set(h,'Erasemode','normal'); set(h,'Erasemode','xor'); delete(h) meshstat=getuprop(pde_fig,'meshstat'); n=length(meshstat); % get previous generation of the mesh p=getuprop(pde_fig,['p' int2str(n-1)]); e=getuprop(pde_fig,['e' int2str(n-1)]); t=getuprop(pde_fig,['t' int2str(n-1)]); % plot the unrefined mesh h=pdeplot(p,e,t,'intool','on'); set(h,'Erasemode','none','Tag','PDEMeshLine'); set(hp,'UserData',p), set(he,'UserData',e), set(ht,'UserData',t) % if requested, label nodes and/or triangles: if getuprop(pde_fig,'shownodelbl'), pdetool('shownodelbl',1) end if getuprop(pde_fig,'showtrilbl'), pdetool('showtrilbl',1) end flags=get(flg_hndl,'UserData'); flags(1)=1; % need_save=1 flags(5)=1; % flag3=1 flags(6)=0; % flag4=0 set(flg_hndl,'UserData',flags) meshstat=meshstat(1:length(meshstat)-1); setuprop(pde_fig,'meshstat',meshstat) if length(meshstat)==1, % Back to initial mesh; % no more undo possible meshhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); h=findobj(get(meshhndl,'Children'),'flat','Tag','PDEUnrefine'); set(h,'Enable','off'); end % Update max no of triangle default for adaptive solver % Double the current no, or 1000, whichever is greatest: solveparams=getuprop(pde_fig,'solveparam'); tristr=int2str(max(1.5*size(t,2),1000)); setuprop(pde_fig,'solveparam',... str2mat(solveparams(1,:),tristr,solveparams(3:11,:))) set(pde_fig,'Pointer','arrow') drawnow infostr=sprintf('Current mesh consists of %i nodes and %i triangles.',... size(p,2),size(t,2)); pdeinfo(infostr); edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); set([edithndl findobj(get(edithndl,'Children'),'flat','Tag','PDESelall')],... 'Enable','off') % Enable clicking on mesh to get info about triangle and node no's: set(pde_fig,'WindowButtonDownFcn','pdeinfclk(1)',... 'WindowButtonUpFcn','if pdeonax, pdeinfo; end') % % case: display triangle quality measure elseif strcmp(action,'triqual') if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end flg_hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); flag1=flags(3); if abs(flag1), pdetool('changemode',0) end flags=get(flg_hndl,'UserData'); if flags(3)==-1, % error in decsg return; elseif ~flags(2), pdetool('cleanup') end flags=get(flg_hndl,'UserData'); flag2=flags(4); if flag2, pdetool('initmesh') end flags=get(flg_hndl,'UserData'); flags(2)=2; % mode_flag=2 set(flg_hndl,'UserData',flags) ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax,'Pointer','watch','WindowButtonDownFcn','') drawnow pdeinfo('Triangle quality plot.'); drawnow % Clean up axes h=get(ax,'UserData'); if ~isempty(h), set(h,'Erasemode','xor') delete(h) set(ax,'UserData',[]); end set(get(ax,'Children'),'Visible','off') cmap=get(get(ax,'YLabel'),'UserData'); hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); p=get(findobj(get(hndl,'Children'),'flat','Tag','PDEInitMesh'),... 'UserData'); t=get(findobj(get(hndl,'Children'),'flat','Tag','PDEMeshParam'),... 'UserData'); q=pdetriq(p,t); h=pdeplot(p,[],t,'xydata',q,'xystyle','flat','intool','on','mesh','on',... 'colorbar','off','colormap',cmap,'title','Triangle quality'); % Store handles to all solution plot patches in PDE Toolbox' axes' UserData. set(ax,'UserData',h) set(0,'CurrentFigure',pde_fig); cmin=min(min(real(q)),0.7); cmax=max(max(real(q)),1); caxis([cmin cmax]); h=colorbar; set(h,'Tag','PDESolBar') % if requested, label nodes and/or triangles: if getuprop(pde_fig,'shownodelbl'), pdetool('shownodelbl',1) end if getuprop(pde_fig,'showtrilbl'), pdetool('showtrilbl',1) end set(pde_fig,'Pointer','arrow') drawnow pdeinfo; edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); set([edithndl findobj(get(edithndl,'Children'),'flat','Tag','PDESelall')],... 'Enable','off') % Enable clicking on mesh to get info about triangle and node no's: set(pde_fig,'WindowButtonDownFcn','pdeinfclk(1)',... 'WindowButtonUpFcn','if pdeonax, pdeinfo; end') % % case: solve PDE elseif strcmp(action,'solve') appl=getuprop(pde_fig,'application'); pde_type=get(findobj(get(pde_fig,'Children'),'flat','Tag','PDEHelpMenu'),'UserData'); % if no geometry, create a default L-shape: pdegd=get(findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'),'UserData'); if isempty(pdegd), pdetool('membrane'), end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end flg_hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); flag1=flags(3); if abs(flag1), pdetool('changemode',0) end flags=get(flg_hndl,'UserData'); if flags(3)==-1, % error in decsg return; elseif ~flags(2), pdetool('cleanup') end flags=get(flg_hndl,'UserData'); flag2=flags(4); if flag2, pdetool('initmesh') end flags=get(flg_hndl,'UserData'); oldmode=flags(2); flags(2)=3; % mode_flag=3 set(flg_hndl,'UserData',flags) pdeinfo('Solving PDE...'); set(pde_fig,'Pointer','watch') drawnow bndhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); bl=get(findobj(get(bndhndl,'Children'),'flat',... 'Tag','PDEBoundMode'),'UserData'); dl1=getuprop(pde_fig,'dl1'); % Unpack parameters: params=get(findobj(get(pde_fig,'Children'),'flat','Tag','PDEPDEMenu'),... 'UserData'); ns=getuprop(pde_fig,'ncafd'); nc=ns(1); na=ns(2); nf=ns(3); nd=ns(4); c=params(1:nc,:); a=params(nc+1:nc+na,:); f=params(nc+na+1:nc+na+nf,:); d=params(nc+na+nf+1:nc+na+nf+nd,:); if pde_type>1, timepar=getuprop(pde_fig,'timeeigparam'); tlist=str2num(deblank(timepar(1,:))); u0=deblank(timepar(2,:)); ut0=deblank(timepar(3,:)); r=str2num(deblank(timepar(4,:))); rtol=str2num(deblank(timepar(5,:))); atol=str2num(deblank(timepar(6,:))); end h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); hp=findobj(get(h,'Children'),'flat','Tag','PDEInitMesh'); p=get(hp,'UserData'); he=findobj(get(h,'Children'),'flat','Tag','PDERefine'); e=get(he,'UserData'); ht=findobj(get(h,'Children'),'flat','Tag','PDEMeshParam'); t=get(ht,'UserData'); solveparams=getuprop(pde_fig,'solveparam'); adaptflag=str2num(deblank(solveparams(1,:))); nonlinflag=str2num(deblank(solveparams(7,:))); nltol=str2num(deblank(solveparams(8,:))); nlinit=deblank(solveparams(9,:)); jac=deblank(solveparams(10,:)); nlinnorm=lower(deblank(solveparams(11,:))); if ~strcmp(nlinnorm,'energy'), nlinnorm=str2num(nlinnorm); end err=0; % Solve PDE and catch error: if pde_type==1, % solve elliptic problem: if adaptflag, maxt=str2num(deblank(solveparams(2,:))); ngen=str2num(deblank(solveparams(3,:))); tselmet=deblank(solveparams(4,:)); par=str2num(deblank(solveparams(5,:))); refmet=deblank(solveparams(6,:)); if ~nonlinflag, nlin='off'; else nlin='on'; end if isempty(nlinit), eval(['[u,p,e,t]=adaptmesh(dl1,bl,c,a,f,''mesh'',p,e,t,',... '''par'',par,''ngen'',ngen,''maxt'',maxt,''nonlin'',nlin,',... '''toln'',nltol,''tripick'',tselmet,''rmethod'',refmet,',... '''jac'',jac,''norm'',nlinnorm);'],'err=1;'); else eval(['[u,p,e,t]=adaptmesh(dl1,bl,c,a,f,''mesh'',p,e,t,',... '''par'',par,''ngen'',ngen,''maxt'',maxt,''nonlin'',nlin,',... '''toln'',nltol,''init'',nlinit,''tripick'',tselmet,',... '''rmethod'',refmet,''jac'',jac,''norm'',nlinnorm);'],'err=1;'); end if ~err, set(hp,'UserData',p), set(he,'UserData',e) set(ht,'UserData',t) % Update max no of triangle default for adaptive solver % Double the current no, or 1000, whichever is greatest: tristr=int2str(max(1.5*size(t,2),1000)); setuprop(pde_fig,'solveparam',... str2mat(solveparams(1,:),tristr,solveparams(3:11,:))) meshstat=getuprop(pde_fig,'meshstat'); meshstat=[meshstat 4]; n=length(meshstat); setuprop(pde_fig,'meshstat',meshstat); % save this generation of the mesh for unrefine purposes setuprop(pde_fig,['p' int2str(n)],p); setuprop(pde_fig,['e' int2str(n)],e); setuprop(pde_fig,['t' int2str(n)],t); % Enable 'undo mesh change' option: meshhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); h=findobj(get(meshhndl,'Children'),'flat','Tag','PDEUnrefine'); set(h,'Enable','on'); end elseif nonlinflag, if isempty(nlinit) eval(['[u,res]=pdenonlin(bl,p,e,t,c,a,f,''jacobian'',jac,',... '''tol'',nltol,''norm'',nlinnorm,''report'',''on'');'],'err=1;'); else eval(['[u,res]=pdenonlin(bl,p,e,t,c,a,f,''jacobian'',jac,',... '''tol'',nltol,''U0'',nlinit,''norm'',nlinnorm,',... '''report'',''on'');'],'err=1;'); end else eval('u=assempde(bl,p,e,t,c,a,f);','err=1;'); end if ~err, if any(isnan(u)) & nonlinflag, % u contains NaN's if problem is nonlinear and assembled % using 'assempde' pdeinfo('Switching to nonlinear solver...',0); nltol=str2num(deblank(solveparams(8,:))); eval('[u,res]=pdenonlin(bl,p,e,t,c,a,f,nltol);','err=1;'); end if any(isnan(u)), % if u still contains NaN's, problem is probably time dependent pdetool('error','Unable to solve elliptic PDE. Problem may be time dependent or nonlinear.') u=[]; l=[]; set(pde_fig,'Pointer','arrow') drawnow pdeinfo; return; end end l=[]; pdeinfo('PDE solution computed.'); elseif pde_type==2, % solve parabolic problem: eval('u=parabolic(u0,tlist,bl,p,e,t,c,a,f,d,rtol,atol);','err=1;'); l=[]; pdeinfo('PDE solution computed.'); elseif pde_type==3, % solve hyperbolic problem: eval('u=hyperbolic(u0,ut0,tlist,bl,p,e,t,c,a,f,d,rtol,atol);','err=1;'); l=[]; pdeinfo('PDE solution computed.'); elseif pde_type==4, % solve eigenvalue problem: if appl==1 t_p = p; t_e = e; t_t = t; init_data; init_solve; %init_result(); if MethodChoice==1, u = e_vector(1:size(t_p,2),:); l = diag(e_value); elseif MethodChoice==2, u = s_mode; l = s_freq; %u = u_mode; %l = u_freq; else u = e_vector(1:size(t_p,2),:); l = diag(e_value); end p = t_p; e = t_e; t = t_t; set(hp,'UserData',p); set(he,'UserData',e); set(ht,'UserData',t); else eval('[u,l]=pdeeig(bl,p,e,t,c,a,d,r);','err=1;'); end if ~err, if isempty(l), plthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEPlotMenu'); set(plthndl,'UserData',u); winhndl=findobj(get(pde_fig,'Children'),'flat','Tag','winmenu'); set(winhndl,'UserData',l); pdetool('error',' No eigenvalues in specified range.') set(pde_fig,'Pointer','arrow') drawnow pdeinfo('PDE solution computed.'); else pdeinfo(sprintf('%i eigenvalues found. Use Plot Selection dialog box to select higher eigenmodes.',length(l))); end end end % Check if error: if err, errstr=lasterr; % Remove disturbing newlines: nl=find(abs(errstr)==10); if ~isempty(nl), rmnl=[]; if nl(1)==1, rmnl=1; end nonl=length(nl); if nonl>1, if nl(nonl)==length(errstr) & nl(nonl-1)==length(errstr)-1, rmnl=[rmnl nl(nonl)]; end end errstr(rmnl)=[]; end pdetool('error',errstr); set(pde_fig,'Pointer','arrow') drawnow % Restore old mode flags=get(flg_hndl,'UserData'); flags(2)=oldmode; set(flg_hndl,'UserData',flags) return; end % Save solution: plothndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEPlotMenu'); set(plothndl,'UserData',u); % save eigenvalues: winhndl=findobj(get(pde_fig,'Children'),'flat','Tag','winmenu'); set(winhndl,'UserData',l); % Enable export: solvehndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDESolveMenu'); set(findobj(get(solvehndl,'Children'),'flat','Tag','PDEExpSol'),... 'Enable','on') % Set flags flags=get(flg_hndl,'UserData'); flags(5)=0; flags(6)=1; flags(7)=0; % flag3=0, flag4=1, flag5=0 set(flg_hndl,'UserData',flags) plotflags=getuprop(pde_fig,'plotflags'); if pde_type==2 | pde_type==3, plotflags(12)=size(u,2); else plotflags(12)=1; end setuprop(pde_fig,'plotflags',plotflags) % Turn off replay of movie animparams=getuprop(pde_fig,'animparam'); animparams(3)=0; setuprop(pde_fig,'animparam',animparams) % Update plot dialog box: pdeptdlg('initialize',1,getuprop(pde_fig,'plotstrings')); % flag is set if we're solving from PDEPTDLG. The solution plot % will be handled from PDEPTDLG. if plotflags(8) & ~isempty(u) & nargin==1, % do plot solution automatically: pdeptdlg('plot') elseif adaptflag & (oldmode==2) & pde_type==1, % We're still displaying the old mesh; update it pdetool meshmode else % Restore old mode since we are not plotting solution nor updating: flags=get(flg_hndl,'UserData'); flags(2)=oldmode; set(flg_hndl,'UserData',flags) end set(pde_fig,'Pointer','arrow') drawnow if pde_type~=4, pdeinfo('Select a new plot, or change mode to alter PDE, mesh, or boundaries.'); end % % case: set PDE solution parameters % (adaption algorithm/time step/eigenvalue range) elseif strcmp(action,'solve_param') pde_type=get(findobj(get(pde_fig,'Children'),'flat','Tag','PDEHelpMenu'),... 'UserData'); if pde_type==1, % elliptic PDE pdesldlg elseif pde_type==2, % parabolic PDE pdetrdlg('parabolic') elseif pde_type==3, % hyperbolic PDE pdetrdlg('hyperbolic') elseif pde_type==4, % eigenvalue PDE pdetrdlg('eigenvalue') end % % case: membrane (create L-shaped geometry as default if no % geometry created; solution in the elliptic case will % then resemble MATLAB's 'membrane' logo). elseif strcmp(action,'membrane') appl=getuprop(pde_fig,'application'); pde_type=get(findobj(get(pde_fig,'Children'),'flat','Tag','PDEHelpMenu'),'UserData'); if appl==1 & pde_type==4 init_mesh; pdepoly(t_x,t_y); %setuprop(pde_fig,'dl1',t_g); else ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); mx=max(max(get(ax,'XLim')),max(get(ax,'YLim'))); l=10^(floor(log10(mx))); %pdepoly([-l, l, l,-l],[-l,-l, l, l]); pdepoly([0, l, l, 0],[0, 0, l, l]); end % % case: zoom elseif strcmp(action,'zoom') drawhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEDrawMenu'); opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); zoomhndl=findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'); if btnstate(pde_fig,'zoom',1) & strcmp(get(zoomhndl,'Checked'),'off'), set(zoomhndl,'Checked','on'); elseif btnstate(pde_fig,'zoom',1) & strcmp(get(zoomhndl,'Checked'),'on'), set(zoomhndl,'Checked','off'); btnup(pde_fig,'zoom',1) elseif ~btnstate(pde_fig,'zoom',1) & strcmp(get(zoomhndl,'Checked'),'on'), set(zoomhndl,'Checked','off'); elseif ~btnstate(pde_fig,'zoom',1) & strcmp(get(zoomhndl,'Checked'),'off'), set(zoomhndl,'Checked','on'); btndown(pde_fig,'zoom',1) end ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); if btnstate(pde_fig,'zoom',1), pdeinfo('Click (+drag) to zoom. Double-click to restore.'); % save WindowButtonDownFcn and WindowButtonUpFcn before invoking zoom: setuprop(pde_fig,'WinBtnDownFcn',get(pde_fig,'WindowButtonDownFcn')) setuprop(pde_fig,'WinBtnUpFcn',get(pde_fig,'WindowButtonUpFcn')) setuprop(ax,'armodes',... {get(ax,'DataAspectRatioMode'), get(ax,'PlotBoxAspectRatioMode')}) set(ax,'DataAspectRatioMode','auto',... 'PlotBoxAspectRatioMode','auto'); pdezoom(pde_fig,'on') else armodes = getuprop(ax,'armodes'); set(ax,'DataAspectRatioMode',armodes{1},... 'PlotBoxAspectRatioMode',armodes{2}); pdezoom(pde_fig,'off') % restore WindowButtonDownFcn and WindowButtonUpFcn: set(pde_fig,'WindowButtonDownFcn',getuprop(pde_fig,'WinBtnDownFcn'),... 'WindowButtonUpFcn',getuprop(pde_fig,'WinBtnUpFcn')) pdeinfo('Zoom turned off.'); end % % case: change mode elseif strcmp(action,'changemode') pde_kids = allchild(pde_fig); flg_hndl=findobj(pde_kids,'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); mode_flag=flags(2); % case: draw mode --> draw mode. Do nothing. if flag==1 & mode_flag==0, return; end pdegd=get(findobj(pde_kids,'flat',... 'Tag','PDEMeshMenu'),'UserData'); % if no geometry, alert user and return: if isempty(pdegd), pdetool('error',' No geometry data.'), return, end if btnstate(pde_fig,'zoom',1), pdezoom(pde_fig,'off') btnup(pde_fig,'zoom',1) pde_kids=get(pde_fig,'Children'); opthndl=findobj(pde_kids,'flat','Tag','PDEOptMenu'); set(findobj(get(opthndl,'Children'),'flat','Tag','PDEZoom'),... 'Checked','off') end pde_kids=get(pde_fig,'Children'); ax=findobj(pde_kids,'flat','Tag','PDEAxes'); axKids=get(ax,'Children'); set(pde_fig,'Currentaxes',ax) if ~mode_flag, % transition: draw mode -> boundary mode flg_hndl=findobj(pde_kids,'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); mode_flag=1; flag1=flags(3); if abs(flag1), % delete mesh lines, decomposition lines, and subdomains: hndl=[findobj(axKids,'flat','Tag','PDEBorderLine')'... findobj(axKids,'flat','Tag','PDEBoundLine')'... findobj(axKids,'flat','Tag','PDEMeshLine')'... findobj(axKids,'flat','Tag','PDESubDom')'... findobj(axKids,'flat','Tag','PDESelRegion')']; delete(hndl) end axKids=get(ax,'Children'); objects=[findobj(axKids,'flat',... 'Tag','PDELabel','Visible','on')'... findobj(axKids,'flat','Tag','PDELblSel',... 'Visible','on')']; n=length(objects); ns=getuprop(pde_fig,'objnames'); pdetool formchk evalhndl=findobj(pde_kids,'flat','Tag','PDEEval'); evalstring=get(evalhndl,'String'); set(pde_fig,'Pointer','watch'); drawnow % first call DECSG to decompose geometry; % reject if evaluation string is bad [dl1,bt1,dl,bt,msb]=decsg(pdegd,evalstring,ns); setuprop(pde_fig,'msb',msb); % error out here if 'eval string'-error (decsg then returns a NaN) if isnan(dl), set(pde_fig,'Pointer','arrow'); drawnow pdetool('error',' Unable to evaluate set formula') pdetool('changemode',1) flags=get(flg_hndl,'UserData'); flags(3)=-1; set(flg_hndl,'UserData',flags) return; elseif isempty(dl), set(pde_fig,'Pointer','arrow'); drawnow pdetool('error',' Set formula results in empty geometry') pdetool('changemode',1) flags=get(flg_hndl,'UserData'); flags(3)=-1; set(flg_hndl,'UserData',flags) return; end set(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEBoundMenu'),'UserData',dl); setuprop(pde_fig,'dl1',dl1) setuprop(pde_fig,'bt1',bt1) % compute new coarse initmesh for labeling purposes [pinit2,einit2,tinit2]=initmesh(dl1,'hmax',Inf,'init','on'); setuprop(pde_fig,'pinit2',pinit2) setuprop(pde_fig,'tinit2',tinit2) pdetool('cleanup') pdeinfo('Click to select boundaries. Double-click to open boundary condition dialog box.'); pdetool('drawbounds') bndhndl=findobj(pde_kids,'flat','Tag','PDEBoundMenu'); set(findobj(get(bndhndl,'Children'),'flat','Tag','PDEExpBound'),... 'Enable','on'); % Reset PDE coefficients: currcoeff=getuprop(pde_fig,'currparam'); newcoeff=strtok(currcoeff(1,:),'!'); for j=2:size(currcoeff,1), newcoeff=str2mat(newcoeff,strtok(currcoeff(j,:),'!')); end setuprop(pde_fig,'currparam',newcoeff); appl=getuprop(pde_fig,'application'); stdparam=pdetrans(newcoeff,appl); coeffh=findobj(pde_kids,'flat','Tag','PDEPDEMenu'); set(coeffh,'UserData',stdparam) set(pde_fig,'WindowButtonDownFcn','',... 'WindowButtonMotionFcn','pdemtncb(0)',... 'WindowButtonUpFcn','',... 'Pointer','arrow'); drawnow % enable removal of interior subdomain boundaries menuhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); hbound(1)=findobj(get(menuhndl,'Children'),'flat','Tag','PDERemBord'); hbound(2)=findobj(get(menuhndl,'Children'),'flat','Tag','PDERemAllBord'); set(hbound,'Enable','on') if abs(flag1), flag1=0; flag2=1; flag4=0; flag6=1; flags=[flags(1) mode_flag flag1 flag2 flags(5) flag4 flags(7)]'; else flags=[flags(1) mode_flag flag1 flags(4:7)']'; end set(flg_hndl,'UserData',flags) elseif mode_flag, % transition: 'solve modes' -> draw mode mode_flag=0; set(pde_fig,'Pointer','watch') drawnow pdeinfo('Continue drawing or edit set formula.'); hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEval'); set(hndl,'Enable','on'); % hide mesh lines, decomposition lines, and subdomains: hndl=[findobj(axKids,'flat','Tag','PDEBorderLine')'... findobj(axKids,'flat','Tag','PDEBoundLine')'... findobj(axKids,'flat','Tag','PDEMeshLine')'... findobj(axKids,'flat','Tag','PDESubDom')'... findobj(axKids,'flat','Tag','PDESelRegion')']; set(hndl,'Erasemode','xor','Visible','off') set(pde_fig,'WindowButtonDownFcn','pdeselect select'); delete(getuprop(pde_fig,'trihandles')) delete(getuprop(pde_fig,'nodehandles')) setuprop(pde_fig,'trihandles',[]) setuprop(pde_fig,'nodehandles',[]) delete(findobj(get(pde_fig,'Children'),'flat','Tag','PDESolBar')) h=get(ax,'UserData'); if ~isempty(h), set(h,'Erasemode','xor') delete(h) set(ax,'UserData',[]); end set(get(ax,'Title'),'String',''); axKids=get(ax,'Children'); h=findobj(axKids,'Visible','on'); % Anything left to cleanup? if ~isempty(h), set(h,'Erasemode','xor') delete(h) end set(ax,'Position',getuprop(ax,'axstdpos')); set(pde_fig,'Colormap',get(get(ax,'Xlabel'),'UserData')); % turn the geometry objects back on axKids=get(ax,'Children'); hndl=findobj(axKids,'flat','Tag','PDEMinReg'); set(hndl,'Erasemode','none','Visible','on') hndl=[findobj(axKids,'flat','Tag','PDELine')'... findobj(axKids,'flat','Tag','PDESelFrame')'... findobj(axKids,'flat','Tag','PDELabel')'... findobj(axKids,'flat','Tag','PDELblSel')']; set(hndl,'Erasemode','background','Visible','on') edithndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEditMenu'); set(edithndl,'Enable','on') set(findobj(get(edithndl,'Children'),'flat','Tag','PDESelall'),... 'Enable','on','CallBack','pdeselect(''select'',1)') bndhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); set(findobj(get(bndhndl,'Children'),'flat','Tag','PDEBoundSpec'),... 'UserData',[]); % enable edit menu items: editkids=get(edithndl,'Children'); hndls=[findobj(editkids,'flat','Tag','PDECut')... findobj(editkids,'flat','Tag','PDECopy')... findobj(editkids,'flat','Tag','PDEClear')]; set(hndls,'Enable','on') % enable 'Rotate...': drawhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEDrawMenu'); set(findobj(get(drawhndl,'Children'),'flat','Tag','PDERotate'),... 'Enable','on') clipboard=get(findobj(editkids,'flat','Tag','PDECut'),'UserData'); if ~isempty(clipboard), set(findobj(editkids,'flat','Tag','PDEPaste'),'Enable','on') end flags=[flags(1) mode_flag flags(3:7)']'; set(flg_hndl,'UserData',flags) pdetool refresh set(pde_fig,'Pointer','arrow') drawnow else pdetool('error',' No 2-D geometry available'); end % % case: clean up draw-mode features. Called from 'changemode' and % when entering a solve mode action through a short-cut path. elseif strcmp(action,'cleanup') pde_kids = allchild(pde_fig); ax=findobj(pde_kids,'flat','Tag','PDEAxes'); % reset pushed draw button at mode change btst=btnstate(pde_fig,'draw'); drawhndl=findobj(pde_kids,'flat','Tag','PDEDrawMenu'); h=[findobj(get(drawhndl,'Children'),'flat','Tag','PDERect')... findobj(get(drawhndl,'Children'),'flat','Tag','PDERectc')... findobj(get(drawhndl,'Children'),'flat','Tag','PDEEllip')... findobj(get(drawhndl,'Children'),'flat','Tag','PDEEllipc')... findobj(get(drawhndl,'Children'),'flat','Tag','PDEPoly')]; for i=find(btst), btnup(pde_fig,'draw',i), set(h(i),'Checked','off'), end axKids=get(ax,'Children'); lines=findobj(axKids,'flat','Tag','PDELine'); % Erase any unfinished polygon lines if ~isempty(lines), set(lines,'Erasemode','normal'), set(lines,'Erasemode','xor') delete(lines) user_data=get(pde_fig,'UserData'); user_data=[user_data(1:4) zeros(1,4)]; set(pde_fig,'UserData',user_data) end % disable 'Rotate...': set(findobj(get(drawhndl,'Children'),'flat','Tag','PDERotate'),... 'Enable','off') evalhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEval'); set(evalhndl,'Enable','off'); % disable edit menu items: edithndl=findobj(pde_kids,'flat','Tag','PDEEditMenu'); hndls=[findobj(get(edithndl,'Children'),'flat','Tag','PDEUndo')... findobj(get(edithndl,'Children'),'flat','Tag','PDECut')... findobj(get(edithndl,'Children'),'flat','Tag','PDECopy')... findobj(get(edithndl,'Children'),'flat','Tag','PDEPaste')... findobj(get(edithndl,'Children'),'flat','Tag','PDEClear')]; set(hndls,'Enable','off') % turn off the drawing objects: axKids=get(ax,'Children'); hndl=[findobj(axKids,'flat','Tag','PDEMinReg')'... findobj(axKids,'flat','Tag','PDELine')'... findobj(axKids,'flat','Tag','PDESelFrame')'... findobj(axKids,'flat','Tag','PDELabel')'... findobj(axKids,'flat','Tag','PDELblSel')']; set(hndl,'Erasemode','xor','Visible','off') % change colormap: set(pde_fig,'Colormap',get(get(ax,'Ylabel'),'UserData')) % turn off WindowButtonDownFcn set(pde_fig,'WindowButtonDownFcn',''); % % % case: draw the internal and external boundary segments elseif strcmp(action,'drawbounds') flg_hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(flg_hndl,'UserData'); flag1=flags(3); pde_kids = allchild(pde_fig); ax=findobj(pde_kids,'flat','Tag','PDEAxes'); dl1=getuprop(pde_fig,'dl1'); bounds=[find(dl1(7,:)==0) find(dl1(6,:)==0)]; pde_circ=1; pde_poly=2; pde_ellip=4; % Allright, if pdebound empty or if the geometry has changed (flag1=1), % initialize the boundary conditions to % dirichlet cond, u=0.0 on all boundaries: bndhndl=findobj(pde_kids,'flat','Tag','PDEBoundMenu'); h=findobj(get(bndhndl,'Children'),'flat','Tag','PDEBoundMode'); pdebound=get(h,'UserData'); appl=getuprop(pde_fig,'application'); scalarflag=any(appl<2 | appl>4); if isempty(pdebound) | flag1, pdetool('initbounds',scalarflag) pdebound=get(h,'UserData'); end % draw the decomposed boundaries: set(pde_fig,'CurrentAxes',ax) polys=find(dl1(1,:)==pde_poly); if ~isempty(polys), n1=length(polys); n2=length(bounds); col=0.5*ones(n1,3); tmp1=bounds(find(max(~(ones(n1,1)*bounds-(ones(n2,1)*polys)')))); n3=length(tmp1); if n3==0 tmp=[]; elseif n3==1 tmp=find(polys==tmp1); else tmp=find(max(~(ones(n3,1)*polys-(ones(n1,1)*tmp1)'))); end if scalarflag, dir=find(pdebound(2,polys(tmp))==1); m=length(dir); col(tmp(dir),:)=[ones(m,1) zeros(m,2)]; neu=find(pdebound(2,polys(tmp))==0); m=length(neu); col(tmp(neu),:)=[zeros(m,2) ones(m,1)]; mix=[]; else dir=find(pdebound(2,polys(tmp))==2); m=length(dir); col(tmp(dir),:)=[ones(m,1) zeros(m,2)]; neu=find(pdebound(2,polys(tmp))==0); m=length(neu); col(tmp(neu),:)=[zeros(m,2) ones(m,1)]; mix=find(pdebound(2,polys(tmp))==1); m=length(mix); col(tmp(mix),:)=[zeros(m,1) ones(m,1) zeros(m,1)]; end for i=1:n1, if isempty(find(bounds==polys(i))), line(dl1(2:3,polys(i)),... dl1(4:5,polys(i)),'Tag','PDEBorderLine',... 'ButtonDownFcn','pdetool(''bordclk'')',... 'Parent',ax,... 'Color',col(i,:),'EraseMode','background','UserData',polys(i)); else % make the boundary lines into arrows to indicate direction xl = get(ax,'xlim'); yl = get(ax,'ylim'); xd = xl(2)-xl(1); % this sets the scale for the arrow size yd = yl(2)-yl(1); % thus enabling the arrow to appear in correct scale = (xd + yd) / 2; % proportion to the current axis start(1)=dl1(2,polys(i)); start(2)=dl1(4,polys(i)); stop(1)=dl1(3,polys(i)); stop(2)=dl1(5,polys(i)); xdif = stop(1) - start(1); ydif = stop(2) - start(2); theta = atan2(ydif,xdif); % the angle has to point according to % the slope xx = [start(1),stop(1),... (stop(1)+0.02*scale*cos(theta+3*pi/4)),NaN,stop(1),... (stop(1)+0.02*scale*cos(theta-3*pi/4))]'; yy = [start(2),stop(2),... (stop(2)+0.02*scale*sin(theta+3*pi/4)),NaN,stop(2),... (stop(2)+0.02*scale*sin(theta-3*pi/4))]'; line(xx,yy,'Tag','PDEBoundLine',... 'Parent',ax,... 'Color',col(i,:),'EraseMode','background',... 'ButtonDownFcn','pdetool(''boundclk'')',... 'UserData',[polys(i) col(i,:)]); end end end % draw the decomposed geometry 2 (circles) circles=find(dl1(1,:)==pde_circ); if ~isempty(circles), n1=length(circles); n2=length(bounds); col=0.5*ones(n1,3); if n1==1, tmp1=find(bounds==circles); else tmp1=bounds(find(max(~(ones(n1,1)*bounds-(ones(n2,1)*circles)')))); end n3=length(tmp1); if n3==0 tmp=[]; elseif n3==1, if n1==1, tmp=1; else tmp=find(circles==tmp1); end else tmp=find(max(~(ones(n3,1)*circles-(ones(n1,1)*tmp1)'))); end if scalarflag, dir=find(pdebound(2,circles(tmp))==1); m=length(dir); col(tmp(dir),:)=[ones(m,1) zeros(m,2)]; neu=find(pdebound(2,circles(tmp))==0); m=length(neu); col(tmp(neu),:)=[zeros(m,2) ones(m,1)]; mix=[]; else dir=find(pdebound(2,circles(tmp))==2); m=length(dir); col(tmp(dir),:)=[ones(m,1) zeros(m,2)]; neu=find(pdebound(2,circles(tmp))==1); m=length(neu); col(tmp(neu),:)=[zeros(m,2) ones(m,1)]; mix=find(pdebound(2,circles(tmp))==0); m=length(mix); col(tmp(mix),:)=[zeros(m,1) ones(m,1) zeros(m,1)]; end delta=2*pi/100; for i=1:n1, arg1=atan2(dl1(4,circles(i))-dl1(9,circles(i)),... dl1(2,circles(i))-dl1(8,circles(i))); arg2=atan2(dl1(5,circles(i))-dl1(9,circles(i)),... dl1(3,circles(i))-dl1(8,circles(i))); if arg2<0 & arg1>0, arg2=arg2+2*pi; end darg=abs(arg2-arg1); ns=max(2,ceil(darg/delta)); arc=linspace(arg1,arg2,ns); x(1:ns)=(dl1(8,circles(i))+dl1(10,circles(i))*cos(arc))'; y(1:ns)=(dl1(9,circles(i))+dl1(10,circles(i))*sin(arc))'; if isempty(find(bounds==circles(i))), line(x(1:ns),y(1:ns),'Tag','PDEBorderLine',... 'Color',col(i,:),'EraseMode','background',... 'Parent',ax,... 'ButtonDownFcn','pdetool(''bordclk'')',... 'UserData',circles(i)); else % make the boundary lines into arrows to indicate direction xl = get(ax,'xlim'); yl = get(ax,'ylim'); xd = xl(2)-xl(1); % this sets the scale for the arrow size yd = yl(2)-yl(1); % thus enabling the arrow to appear in correct scale = (xd + yd) / 2; % proportion to the current axis start(1)=x(ns-1); start(2)=y(ns-1); stop(1)=x(ns); stop(2)=y(ns); xdif = stop(1) - start(1); ydif = stop(2) - start(2); theta = atan2(ydif,xdif); % the angle has to point % according to the slope xx = [x(1:ns),(stop(1)+0.02*scale*cos(theta+3*pi/4)),NaN,... stop(1),(stop(1)+0.02*scale*cos(theta-3*pi/4))]'; yy = [y(1:ns), (stop(2)+0.02*scale*sin(theta+3*pi/4)),NaN,... stop(2),(stop(2)+0.02*scale*sin(theta-3*pi/4))]'; line(xx,yy,'Tag','PDEBoundLine',... 'Color',col(i,:),'EraseMode','background',... 'Parent',ax,... 'ButtonDownFcn','pdetool(''boundclk'')',... 'UserData',[circles(i) col(i,:)]); end end end % draw the decomposed geometry 3 (ellipses) ellipses=find(dl1(1,:)==pde_ellip); if ~isempty(ellipses), n1=length(ellipses); n2=length(bounds); col=0.5*ones(n1,3); if n1==1, tmp1=find(bounds==ellipses); else tmp1=bounds(find(max(~(ones(n1,1)*bounds-(ones(n2,1)*ellipses)')))); end n3=length(tmp1); if n3==0 tmp=[]; elseif n3==1 if n1==1, tmp=1; else tmp=find(ellipses==tmp1); end else tmp=find(max(~(ones(n3,1)*ellipses-(ones(n1,1)*tmp1)'))); end if scalarflag, dir=find(pdebound(2,ellipses(tmp))==1); m=length(dir); col(tmp(dir),:)=[ones(m,1) zeros(m,2)]; neu=find(pdebound(2,ellipses(tmp))==0); m=length(neu); col(tmp(neu),:)=[zeros(m,2) ones(m,1)]; mix=[]; else dir=find(pdebound(2,ellipses(tmp))==2); m=length(dir); col(tmp(dir),:)=[ones(m,1) zeros(m,2)]; neu=find(pdebound(2,ellipses(tmp))==1); m=length(neu); col(tmp(neu),:)=[zeros(m,2) ones(m,1)]; mix=find(pdebound(2,ellipses(tmp))==0); m=length(mix); col(tmp(mix),:)=[zeros(m,1) ones(m,1) zeros(m,1)]; end delta=2*pi/100; for i=1:n1, k=ellipses(i); ca=cos(dl1(12,k)); sa=sin(dl1(12,k)); yd=dl1(4,k)-dl1(9,k); xd=dl1(2,k)-dl1(8,k); x1=ca.*xd+sa.*yd; y1=-sa.*xd+ca.*yd; arg1=atan2(y1./dl1(11,k),x1./dl1(10,k)); yd=dl1(5,k)-dl1(9,k); xd=dl1(3,k)-dl1(8,k); x1=ca.*xd+sa.*yd; y1=-sa.*xd+ca.*yd; arg2=atan2(y1./dl1(11,k),x1./dl1(10,k)); if arg2<0 & arg1>0, arg2=arg2+2*pi; end darg=abs(arg2-arg1); ns=max(2,ceil(darg/delta)); arc=linspace(arg1,arg2,ns); xd=(dl1(10,k)*cos(arc))'; yd=(dl1(11,k)*sin(arc))'; x1=ca*xd-sa*yd; y1=sa*xd+ca*yd; x(1:ns)=dl1(8,k)+x1; y(1:ns)=dl1(9,k)+y1; if isempty(find(bounds==k)), h=line(x(1:ns),y(1:ns),zeros(1,ns),'Tag','PDEBorderLine',... 'Color',col(i,:),'EraseMode','background',... 'Parent',ax,... 'ButtonDownFcn','pdetool(''bordclk'')',... 'UserData',k); else % make the boundary lines into arrows to indicate direction xl = get(ax,'xlim'); yl = get(ax,'ylim'); xd = xl(2)-xl(1); % this sets the scale for the arrow size yd = yl(2)-yl(1); % thus enabling the arrow to appear in correct scale = (xd + yd) / 2; % proportion to the current axis start(1)=x(ns-1); start(2)=y(ns-1); stop(1)=x(ns); stop(2)=y(ns); xdif = stop(1) - start(1); ydif = stop(2) - start(2); theta = atan2(ydif,xdif); % the angle has to point % according to the slope xx = [x(1:ns),(stop(1)+0.02*scale*cos(theta+3*pi/4)),NaN,... stop(1),(stop(1)+0.02*scale*cos(theta-3*pi/4))]'; yy = [y(1:ns), (stop(2)+0.02*scale*sin(theta+3*pi/4)),NaN,... stop(2),(stop(2)+0.02*scale*sin(theta-3*pi/4))]'; h=line(xx,yy,zeros(size(xx)),'Tag','PDEBoundLine',... 'Color',col(i,:),'EraseMode','background',... 'Parent',ax,... 'ButtonDownFcn','pdetool(''boundclk'')',... 'UserData',[k col(i,:)]); end end end % % case: click on boundary to select boundary and % open boundary condition dialog box elseif strcmp(action,'boundclk') % if in Zoom-mode, let Zoom do its thing and return immediately if btnstate(pde_fig,'zoom',1), return, end ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); bndhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); selecth=findobj(get(bndhndl,'Children'),'flat','Tag','PDEBoundSpec'); % case: select all (flag is set) if nargin>1 hndl=findobj(get(ax,'Children'),'flat','Tag','PDEBoundLine'); if ~isempty(hndl) set(hndl,'color','k'); set(selecth,'UserData',hndl'); end % case: double-click to open boundary condition dialog box elseif findstr(get(pde_fig,'SelectionType'),'open'), pdetool('set_bounds') % case: shift-click (allow selection of more than one boundary segment) elseif findstr(get(pde_fig,'SelectionType'),'extend'), curr_bound=gco; set(curr_bound,'color','k') pde_bound_sel=get(selecth,'UserData'); if isempty(pde_bound_sel) | isempty(find(curr_bound==pde_bound_sel)), pde_bound_sel=[pde_bound_sel curr_bound]; else % if already selected, de-select selcol=find(pde_bound_sel==curr_bound); pde_bound_sel=[pde_bound_sel(1:selcol-1) ... pde_bound_sel(selcol+1:length(pde_bound_sel))]; col=get(curr_bound,'UserData'); set(curr_bound,'color',col(2:4)) end set(selecth,'UserData',pde_bound_sel) % case: select else % if already selected, do nothing; else, select curr_bound=gco; pde_bound_sel=get(selecth,'UserData'); if isempty(pde_bound_sel) | isempty(find(pde_bound_sel==curr_bound)) set(curr_bound,'color','k') bounds=findobj(get(ax,'Children'),'flat','Tag','PDEBoundLine'); indx=find(bounds~=curr_bound)'; for i=indx col=get(bounds(i),'UserData'); set(bounds(i),'color',col(2:4)) end set(selecth,'UserData',curr_bound); end end % % case: click on subdomain border to select border elseif strcmp(action,'bordclk') % if in Zoom-mode, let Zoom do its thing and return immediately if btnstate(pde_fig,'zoom',1), return, end ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); border_sel=getuprop(ax,'bordsel'); % case: shift-click (allow selection of more than one border segment) if findstr(get(pde_fig,'SelectionType'),'extend'), curr_border=gco; set(curr_border,'color','k') if isempty(border_sel) border_sel = curr_border; else if isempty(find(curr_border==border_sel)), border_sel=[border_sel curr_border]; else % if already selected, de-select selcol=find(border_sel==curr_border); border_sel=[border_sel(1:selcol-1) ... border_sel(selcol+1:length(border_sel))]; set(curr_border,'color',0.5*ones(1,3)) end end setuprop(ax,'bordsel',border_sel) % case: select elseif findstr(get(pde_fig,'SelectionType'),'normal'), % if already selected, do nothing; else, select curr_border=gco; if isempty(border_sel) | isempty(find(border_sel==curr_border)) set(curr_border,'color','k') borders=findobj(get(ax,'Children'),'flat','Tag','PDEBorderLine'); indx=find(borders~=curr_border)'; set(borders(indx),'color',0.5*ones(1,3)) setuprop(ax,'bordsel',curr_border) end end % % case: click in subdomain to select subdomain and to define PDE coefficients elseif strcmp(action,'subclk') % if in Zoom-mode, let Zoom do its thing and return immediately if btnstate(pde_fig,'zoom',1), return, end ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); if ~pdeonax(ax) & nargin==1, return; end set(pde_fig,'CurrentAxes',ax) subsel=getuprop(ax,'subsel'); dl1=getuprop(pde_fig,'dl1'); hndl=findobj(get(ax,'Children'),'flat','Tag','PDESelRegion'); p1=getuprop(pde_fig,'pinit2'); t1=getuprop(pde_fig,'tinit2'); pv=get(ax,'CurrentPoint'); x=pv(1,1); y=pv(1,2); [uxy,tn,a2,a3]=tri2grid(p1,t1,zeros(size(p1,2)),x,y); % case: select all (flag is set) if nargin>1 if ~isempty(hndl) bt1=getuprop(pde_fig,'bt1'); set(hndl,'color','k') setuprop(ax,'subsel',1:size(bt1,1)) end % case: double-click to open PDE Specification dialog box elseif findstr(get(pde_fig,'SelectionType'),'open'), if ~isnan(tn), pdetool('set_param') end % case: shift-click (allow selection of more than one subdomain) elseif findstr(get(pde_fig,'SelectionType'),'extend'), if isnan(tn), % clicked outside of geometry objects: deselect all set(hndl,'color','w') setuprop(ax,'subsel',[]) return; else subreg=t1(4,tn); end s=find(dl1(6,:)==subreg | dl1(7,:)==subreg); h=[]; for i=1:length(s), h=[h; findobj(hndl,'flat','UserData',s(i))]; end if isempty(find(subsel==subreg)), subsel=[subsel subreg]; set(h,'color','k') else % if already selected, de-select selcol=find(subsel==subreg); subsel=[subsel(1:selcol-1) ... subsel(selcol+1:length(subsel))]; set(h,'color','w') end setuprop(ax,'subsel',subsel) % case: select else % if already selected, do nothing; else, select if isnan(tn), % clicked outside of geometry objects: deselect all set(hndl,'color','w') setuprop(ax,'subsel',[]) return; else subreg=t1(4,tn); end s=find(dl1(6,:)==subreg | dl1(7,:)==subreg); h=[]; for i=1:length(s), h=[h; findobj(hndl,'flat','UserData',s(i))]; end if isempty(subsel) | isempty(find(subsel==subreg)), set(hndl,'color','w') set(h,'color','k') setuprop(ax,'subsel',subreg); end end % % case: remove border (flag=1: remove all borders) elseif strcmp(action,'removeb') ax=findobj(allchild(pde_fig),'flat','Tag','PDEAxes'); set(pde_fig,'CurrentAxes',ax,'Pointer','watch') drawnow dl1=getuprop(pde_fig,'dl1'); bt1=getuprop(pde_fig,'bt1'); if nargin>1, if flag==1, % Case: remove all borders bl=find([dl1(6,:)~=0 & dl1(7,:)~=0]); if isempty(bl), set(pde_fig,'Pointer','arrow') drawnow return; end [dl1,bt1]=csgdel(dl1,bt1); else % flag contains bl; used from startup-file only bl=flag; [dl1,bt1]=csgdel(dl1,bt1,bl); end else bdsel=getuprop(ax,'bordsel'); if isempty(bdsel), set(pde_fig,'Pointer','arrow') drawnow return; end n=length(bdsel); bl=[]; for i=1:n, bl=[bl get(bdsel(i),'UserData')]; end [dl1new,bt1new]=csgdel(dl1,bt1,bl); if (size(dl1new,2)==size(dl1,2)), set(pde_fig,'Pointer','arrow') drawnow return; else dl1=dl1new; bt1=bt1new; end end blsaved=getuprop(pde_fig,'bl'); if ~isempty(bl), i=size(blsaved,1)+1; blsaved(i,1:size(bl,2))=bl; setuprop(pde_fig,'bl',blsaved) end % save new dl1, bt1 setuprop(pde_fig,'dl1',dl1) setuprop(pde_fig,'bt1',bt1) % compute new coarse initmesh for labeling purposes [pinit2,einit2,tinit2]=initmesh(dl1,'hmax',Inf,'init','on'); setuprop(pde_fig,'pinit2',pinit2) setuprop(pde_fig,'tinit2',tinit2) % Set flag 2 to force new mesh initialization: h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); flags(4)=1; set(h,'UserData',flags) setuprop(ax,'bordsel',[]) hh=[findobj(get(ax,'Children'),'flat','Tag','PDEBoundLine')'... findobj(get(ax,'Children'),'flat','Tag','PDEBorderLine')']; set(hh,'Erasemode','normal'), set(hh,'Erasemode','xor') delete(hh) appl=getuprop(pde_fig,'application'); scalarflag=any(appl<2 | appl>4); pdetool('initbounds',scalarflag) pdetool('drawbounds') if getuprop(pde_fig,'showsublbl'), pdetool('showsublbl',1) else pdetool('showsublbl',0) end if getuprop(pde_fig,'showedgelbl'), pdetool('showedgelbl',1) else pdetool('showedgelbl',0) end set(pde_fig,'Pointer','arrow') drawnow % % case: clear solution plot from PDE axes elseif strcmp(action,'clearsol') %if solution display is left on screen, remove it. h=findobj(get(pde_fig,'Children'),'flat','Tag','PDESolBar'); if ~isempty(h), delete(h); end ax=findobj(allchild(pde_fig),'flat','Tag','PDEAxes'); hh=get(ax,'UserData'); if ~isempty(hh), set(hh,'Erasemode','xor') delete(hh) end set(ax,'UserData',[],'Position',getuprop(ax,'axstdpos')) titleh=get(ax,'Title'); if ~isempty(get(titleh,'String')), set(titleh,'String','') end % % case: export variables to workspace elseif strcmp(action,'export') if flag==1, % export geometry data: gd=get(findobj(get(pde_fig,'Children'),'flat',... 'Tag','PDEMeshMenu'),'UserData'); ns=getuprop(pde_fig,'objnames'); evalhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEval'); sf=get(evalhndl,'String'); matqueue('put',gd,sf,ns) pstr='Variable names for geometry data, set formula, labels:'; estr='gd sf ns'; elseif flag==2, % export decomposed list, boundary conditions: dl1=getuprop(pde_fig,'dl1'); h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); bl=get(findobj(get(h,'Children'),'flat',... 'Tag','PDEBoundMode'),'UserData'); matqueue('put',dl1,bl) pstr='Variable names for decomposed geometry, boundary cond''s:'; estr='g b'; elseif flag==3, % export mesh: h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu'); p=get(findobj(get(h,'Children'),'flat','Tag','PDEInitMesh'),... 'UserData'); e=get(findobj(get(h,'Children'),'flat','Tag','PDERefine'),... 'UserData'); t=get(findobj(get(h,'Children'),'flat','Tag','PDEMeshParam'),... 'UserData'); matqueue('put',p,e,t) pstr='Variable names for mesh data (points, edges, triangles):'; estr='p e t'; elseif flag==4, % export PDE coefficients: params=get(findobj(get(pde_fig,'Children'),'Tag','PDEPDEMenu'),... 'UserData'); ns=getuprop(pde_fig,'ncafd'); nc=ns(1); na=ns(2); nf=ns(3); nd=ns(4); c=params(1:nc,:); a=params(nc+1:nc+na,:); f=params(nc+na+1:nc+na+nf,:); d=params(nc+na+nf+1:nc+na+nf+nd,:); matqueue('put',c,a,f,d) pstr='Variable names for PDE coefficients:'; estr='c a f d'; elseif flag==5, % export solution: u=get(findobj(get(pde_fig,'Children'),'flat','Tag','PDEPlotMenu'),... 'UserData'); l=get(findobj(get(pde_fig,'Children'),'flat','Tag','winmenu'),... 'UserData'); if isempty(l), pstr='Variable name for solution:'; estr='u'; matqueue('put',u) else pstr='Variable names for solution and eigenvalues:'; estr='u l'; matqueue('put',u,l) end elseif flag==6, % export movie: M=getuprop(pde_fig,'movie'); matqueue('put',M) pstr='Variable name for PDE solution movie:'; estr='M'; end pdeinfo('Change the variable name(s) if desired. OK when done.',0); matqdlg('buffer2ws','Name','Export','PromptString',pstr,... 'OKCallback','pdeinfo;','CancelCallback','pdeinfo;','EntryString',estr); % % case: check if set formula has changed: elseif strcmp(action,'formchk') hndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEEval'); newstr=deblank(get(hndl,'String')); oldstr=get(hndl,'UserData'); change=~strcmp(newstr,oldstr); if change, set(hndl,'UserData',newstr) % set flags: need_save and flag1 h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); flags(1)=1; flags(3)=1; set(h,'UserData',flags) setuprop(pde_fig,'meshstat',[]); setuprop(pde_fig,'bl',[]); end % % case: application selection callback elseif strcmp(action,'appl_cb') kids=get(pde_fig,'Children'); h=findobj(kids,'flat','Tag','PDEAppl'); oldval=get(h,'UserData'); val=get(h,'Value'); typeh=findobj(kids,'flat','Tag','PDEHelpMenu'); paramh=findobj(kids,'flat','Tag','PDEPDEMenu'); pde_typeh=findobj(kids,'flat','Tag','PDEHelpMenu'); if (flag==0 & val==1) | flag==1, % Generic scalar if oldval==1, return; end setuprop(pde_fig,'application',1); set(h,'Value',1,'UserData',1) menuh=get(findobj(kids,'Tag','PDEAppMenu'),'Children'); set(menuh,'Checked','off'); set(findobj(menuh,'UserData',1),'Checked','on') setuprop(pde_fig,'equation','-div(c*grad(u))+a*u=f'); setuprop(pde_fig,'params',str2mat('c','a','f','d')); setuprop(pde_fig,'description',str2mat([],[],[],[])); setuprop(pde_fig,'bounddescr',str2mat([],[],[],[])); setuprop(pde_fig,'boundeq',str2mat('n*c*grad(u)+q*u=g','h*u=r',[])) cp=str2mat('1.0','0.0','10','1.0'); setuprop(pde_fig,'currparam',cp); stdparam=pdetrans(cp,1); set(paramh,'UserData',stdparam) strmtx=str2mat('u|abs(grad(u))|abs(c*grad(u))|user entry',' -grad(u)| -c*grad(u)| user entry'); setuprop(pde_fig,'plotstrings',strmtx) pdetool('initbounds',1) elseif (flag==0 & val==2) | flag==2, % Generic system if oldval==2, return; end setuprop(pde_fig,'application',2); set(h,'Value',2,'UserData',2) menuh=get(findobj(kids,'Tag','PDEAppMenu'),'Children'); set(menuh,'Checked','off'); set(findobj(menuh,'UserData',2),'Checked','on') setuprop(pde_fig,'equation','-div(c*grad(u))+a*u=f'); setuprop(pde_fig,'params',str2mat('c11, c12','c21, c22',... 'a11, a12','a21, a22','f1, f2','d11, d12','d21, d22')); setuprop(pde_fig,'description',str2mat([],[],[],[],[],[],[])); setuprop(pde_fig,'bounddescr',str2mat([],[],[],[],[],[],[],[])); setuprop(pde_fig,'boundeq',... str2mat('n*c*grad(u)+q*u=g','h*u=r','n*c*grad(u)+q*u=g+h''*l; h*u=r')) cp=str2mat('1.0','0.0','0.0','0.0','1.0','1.0','0.0',... '0.0','1.0','0.0','0.0','1.0','0.0','1.0'); setuprop(pde_fig,'currparam',cp); stdparam=pdetrans(cp,2); set(paramh,'UserData',stdparam) strmtx=str2mat('u|v|abs(u,v)|user entry',... '(u,v)|user entry'); setuprop(pde_fig,'plotstrings',strmtx) pdetool('initbounds',0) elseif (flag==0 & val==3) | flag==3, % Structural Mechanics, Plane Stress if oldval==3, return; end setuprop(pde_fig,'application',3); set(h,'Value',3,'UserData',3) menuh=get(findobj(kids,'Tag','PDEAppMenu'),... 'Children'); set(menuh,'Checked','off'); set(findobj(menuh,'UserData',3),'Checked','on') setuprop(pde_fig,'equation','Structural mechanics, plane stress'); setuprop(pde_fig,'params',str2mat('E','nu','Kx','Ky','rho')); setuprop(pde_fig,'description',str2mat('Young''s modulus',... 'Poisson ratio','Volume force, x-direction',... 'Volume force, y-direction','Density')); setuprop(pde_fig,'bounddescr',str2mat('Surface tractions',' ''''',... 'Spring constants',' ''''','Weights',' ''''',... 'Displacements',' ''''')); setuprop(pde_fig,'boundeq',... str2mat('n*c*grad(u)+q*u=g','h*u=r','n*c*grad(u)+q*u=g+h''*l; h*u=r')) cp=str2mat('1E3','0.3','0.0','0.0','1.0'); setuprop(pde_fig,'currparam',cp); stdparam=pdetrans(cp,3); set(paramh,'UserData',stdparam) str1=['x displacement (u)|y displacement (v)|abs(u,v)|ux|uy|vx|vy|',... 'x strain|y strain|shear strain|x stress|y stress|shear stress|',... '1st principal strain|2nd principal strain|1st principal stress|',... '2nd principal stress|von Mises stress|user entry']; strmtx=str2mat(str1,'(u,v)|user entry'); setuprop(pde_fig,'plotstrings',strmtx) pdetool('initbounds',0) set(pde_typeh,'UserData',1) elseif (flag==0 & val==4) | flag==4, % Structural Mechanics, Plane Strain if oldval==4, return; end setuprop(pde_fig,'application',4); set(h,'Value',4,'UserData',4) menuh=get(findobj(kids,'Tag','PDEAppMenu'),... 'Children'); set(menuh,'Checked','off'); set(findobj(menuh,'UserData',4),'Checked','on') setuprop(pde_fig,'equation','Structural mechanics, plane strain'); setuprop(pde_fig,'params',str2mat('E','nu','Kx','Ky','rho')); setuprop(pde_fig,'description',str2mat('Young''s modulus',... 'Poisson ratio','Volume force, x-direction',... 'Volume force, y-direction','Density')); setuprop(pde_fig,'bounddescr',str2mat('Surface tractions',' ''''',... 'Spring constants',' ''''','Weights',' ''''',... 'Displacements',' ''''')); setuprop(pde_fig,'boundeq',... str2mat('n*c*grad(u)+q*u=g','h*u=r','n*c*grad(u)+q*u=g+h''*l; h*u=r')) cp=str2mat('1E3','0.3','0.0','0.0','1.0'); setuprop(pde_fig,'currparam',cp); stdparam=pdetrans(cp,4); set(paramh,'UserData',stdparam) str1=['x displacement (u)|y displacement (v)|abs(u,v)|ux|uy|vx|vy|',... 'x strain|y strain|shear strain|x stress|y stress|shear stress|',... '1st principal strain|2nd principal strain|1st principal stress|',... '2nd principal stress|von Mises stress|user entry']; strmtx=str2mat(str1,'(u,v)|user entry'); setuprop(pde_fig,'plotstrings',strmtx) pdetool('initbounds',0) set(pde_typeh,'UserData',1) elseif (flag==0 & val==5) | flag==5, % Electrostatics if oldval==5, return; end setuprop(pde_fig,'application',5); set(h,'Value',5,'UserData',5) menuh=get(findobj(kids,'Tag','PDEAppMenu'),... 'Children'); set(menuh,'Checked','off'); set(findobj(menuh,'UserData',5),'Checked','on') setuprop(pde_fig,'equation',... '-div(epsilon*grad(V))=rho, E=-grad(V), V=electric potential'); setuprop(pde_fig,'params',str2mat('epsilon','rho')); setuprop(pde_fig,'description',str2mat('Coeff. of dielectricity',... 'Space charge density')); setuprop(pde_fig,'bounddescr',... str2mat('Surface charge',[],'Weight','Electric potential')); setuprop(pde_fig,'boundeq',... str2mat('n*epsilon*grad(V)+q*V=g','h*V=r',[]')) cp=str2mat('1.0','1.0'); setuprop(pde_fig,'currparam',cp); stdparam=pdetrans(cp,5); set(paramh,'UserData',stdparam) set(typeh,'UserData',1) str1=['electric potential|electric field|electric displacement|',... 'user entry']; str2='electric field|electric displacement|user entry'; strmtx=str2mat(str1,str2); setuprop(pde_fig,'plotstrings',strmtx) pdetool('initbounds',1) set(pde_typeh,'UserData',1) elseif (flag==0 & val==6) | flag==6, % Magnetostatics if oldval==6, return; end setuprop(pde_fig,'application',6); set(h,'Value',6,'UserData',6) menuh=get(findobj(kids,'Tag','PDEAppMenu'),... 'Children'); set(menuh,'Checked','off'); set(findobj(menuh,'UserData',6),'Checked','on') setuprop(pde_fig,'equation',... '-div((1/mu)*grad(A))=J, B=curl(A), A=magnetic vector potential'); setuprop(pde_fig,'params',str2mat('mu','J')); setuprop(pde_fig,'description',str2mat('Magnetic permeability',... 'Current density')); setuprop(pde_fig,'bounddescr',... str2mat('Magnetic field',[],'Weight','Magnetic potential')); setuprop(pde_fig,'boundeq',... str2mat('n*(1/mu)*grad(A)+q*A=g','h*A=r',[])) cp=str2mat('1.0','1.0'); setuprop(pde_fig,'currparam',cp); stdparam=pdetrans(cp,6); set(paramh,'UserData',stdparam) set(typeh,'UserData',1) str1='magnetic potential|magnetic flux density|magnetic field|user entry'; str2='magnetic flux density|magnetic field|user entry'; strmtx=str2mat(str1,str2); setuprop(pde_fig,'plotstrings',strmtx) pdetool('initbounds',1) set(pde_typeh,'UserData',1) elseif (flag==0 & val==7) | flag==7, % AC Power Electromagnetics if oldval==7, return; end setuprop(pde_fig,'application',7); set(h,'Value',7,'UserData',7) menuh=get(findobj(kids,'Tag','PDEAppMenu'),... 'Children'); set(menuh,'Checked','off'); set(findobj(menuh,'UserData',7),'Checked','on') setuprop(pde_fig,'equation',... ['-div((1/mu)*grad(E))+(j*omega*sigma-omega^2*epsilon)*E=0, ',... 'E=electric field']); setuprop(pde_fig,'params',str2mat('omega','mu','sigma','epsilon')); setuprop(pde_fig,'description',str2mat('Angular frequency',... 'Magnetic permeability','Conductivity','Coeff. of dielectricity')); setuprop(pde_fig,'bounddescr',... str2mat('',[],'Weight','Electric field')); setuprop(pde_fig,'boundeq',... str2mat('n*(1/mu)*grad(E)+q*E=g','h*E=r',[])) cp=str2mat('1.0','1.0','1.0','1.0'); setuprop(pde_fig,'currparam',cp); stdparam=pdetrans(cp,7); set(paramh,'UserData',stdparam) set(typeh,'UserData',1) str1=['electric field|magnetic flux density|magnetic field|',... 'current density|resistive heating rate|user entry']; str2='magnetic flux density|magnetic field|user entry'; strmtx=str2mat(str1,str2); setuprop(pde_fig,'plotstrings',strmtx) pdetool('initbounds',1) set(pde_typeh,'UserData',1) elseif (flag==0 & val==8) | flag==8 % Conductive Media DC if oldval==8, return; end setuprop(pde_fig,'application',8); set(h,'Value',8,'UserData',8) menuh=get(findobj(kids,'Tag','PDEAppMenu'),... 'Children'); set(menuh,'Checked','off'); set(findobj(menuh,'UserData',8),'Checked','on') setuprop(pde_fig,'equation',... '-div(sigma*grad(V))=q, E=-grad(V), V=electric potential'); setuprop(pde_fig,'params',str2mat('sigma','q')); setuprop(pde_fig,'description',str2mat('Conductivity',... 'Current source')); setuprop(pde_fig,'bounddescr',... str2mat('Current source','Film conductance','Weight',... 'Electric potential')); setuprop(pde_fig,'boundeq',... str2mat('n*sigma*grad(V)+q*V=g','h*V=r',[])) cp=str2mat('1.0','1.0'); setuprop(pde_fig,'currparam',cp); stdparam=pdetrans(cp,8); set(paramh,'UserData',stdparam) set(typeh,'UserData',1) str1='electric potential|electric field|current density|user entry'; str2='electric field|current density|user entry'; strmtx=str2mat(str1,str2); setuprop(pde_fig,'plotstrings',strmtx) pdetool('initbounds',1) set(pde_typeh,'UserData',1) elseif (flag==0 & val==9) | flag==9, % Heat Transfer if oldval==9, return; end setuprop(pde_fig,'application',9); set(h,'Value',9,'UserData',9) menuh=get(findobj(kids,'Tag','PDEAppMenu'),... 'Children'); set(menuh,'Checked','off'); set(findobj(menuh,'UserData',9),'Checked','on') setuprop(pde_fig,'equation',... 'rho*C*T''-div(k*grad(T))=Q+h*(Text-T), T=temperature'); setuprop(pde_fig,'params',str2mat('rho','C','k','Q','h','Text')); ScreenUnits = get(0,'Units'); set(0,'Unit','pixels'); ScreenPos = get(0,'ScreenSize'); set(0,'Unit',ScreenUnits); if ScreenPos(3)<=800, setuprop(pde_fig,'description',str2mat('Density','Heat capacity',... 'Coeff. of heat conduction','Heat source',... 'Conv. heat transfer coeff.','External temperature')); else setuprop(pde_fig,'description',str2mat('Density','Heat capacity',... 'Coeff. of heat conduction','Heat source',... 'Convective heat transfer coeff.','External temperature')); end setuprop(pde_fig,'bounddescr',... str2mat('Heat flux','Heat transfer coefficient','Weight',... 'Temperature')); setuprop(pde_fig,'boundeq',... str2mat('n*k*grad(T)+q*T=g','h*T=r',[])) cp=str2mat('1.0','1.0','1.0','1.0','1.0','0.0'); setuprop(pde_fig,'currparam',cp); stdparam=pdetrans(cp,9); set(paramh,'UserData',stdparam) set(typeh,'UserData',2) str1='temperature|temperature gradient|heat flux|user entry'; str2='temperature gradient|heat flux|user entry'; strmtx=str2mat(str1,str2); setuprop(pde_fig,'plotstrings',strmtx) pdetool('initbounds',1) set(pde_typeh,'UserData',1) elseif (flag==0 & val==10) | flag==10, % Diffusion if oldval==10, return; end setuprop(pde_fig,'application',10); set(h,'Value',10,'UserData',10) menuh=get(findobj(kids,'Tag','PDEAppMenu'),... 'Children'); set(menuh,'Checked','off'); set(findobj(menuh,'UserData',10),'Checked','on') setuprop(pde_fig,'equation','dc/dt-div(D*grad(c))=Q, c=concentration'); setuprop(pde_fig,'params',str2mat('D','Q')); setuprop(pde_fig,'description',str2mat('Diffusion coefficient',... 'Volume source')); setuprop(pde_fig,'bounddescr',... str2mat('Flux','Transfer coefficient','Weight','Concentration')); setuprop(pde_fig,'boundeq',... str2mat('n*D*grad(c)+q*c=g','h*c=r',[])) cp=str2mat('1.0','1.0'); setuprop(pde_fig,'currparam',cp); stdparam=pdetrans(cp,10); set(paramh,'UserData',stdparam) set(typeh,'UserData',2) str1='concentration|concentration gradient|flux|user entry'; str2='concentration gradient|flux|user entry'; strmtx=str2mat(str1,str2); setuprop(pde_fig,'plotstrings',strmtx) pdetool('initbounds',1) set(pde_typeh,'UserData',1) end % Restore selected plotflags: plotflags=getuprop(pde_fig,'plotflags'); plotflags(1:6)=ones(1,6); plotflags(11:18)=[0 1 1 0 0 0 0 1]; setuprop(pde_fig,'plotflags',plotflags) % [colvar colstyle heightvar heightstyle vectorvar vectorstyle % colval doplot xyplot showmesh animationflag popupvalue % colflag contflag heightflag vectorflag deformflag deformvar] % Restore user entries: setuprop(pde_fig,'colstring','') setuprop(pde_fig,'arrowstring','') setuprop(pde_fig,'deformstring','') setuprop(pde_fig,'heightstring','') % Set flags to indicate that PDE equation has changed: h=findobj(kids,'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); flags(6)=0; flags(7)=1; set(h,'UserData',flags) % If any affected dialog box is open, update it: wins=get(0,'Children'); % Plot selection dialog figh=findobj(wins,'flat','Tag','PDEPlotFig'); if ~isempty(figh), if strcmp(get(figh,'Visible'),'on'), pdeptdlg('initialize',1,getuprop(gcf,'plotstrings')); end end % PDE Specification dialog figh=findobj(wins,'flat','Tag','PDESpecFig'); if ~isempty(figh), if strcmp(get(figh,'Visible'),'on'), close(figh) pdetool('set_param') end end % Boundary Condition dialog: figh=findobj(wins,'flat','Tag','PDEBoundFig'); if ~isempty(figh), if strcmp(get(figh,'Visible'),'on'), close(figh) pdetool('set_bounds') end end % % case: initialize boundary conditions % % Initial boundary condition: Dirichlet condition u=0 on the boundary. elseif strcmp(action,'initbounds') % flag=1 if scalar, 0 if system bndhndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEBoundMenu'); dl1=getuprop(pde_fig,'dl1'); if isempty(dl1), return; end h=findobj(get(bndhndl,'Children'),'flat','Tag','PDEBoundMode'); bounds=[find(dl1(7,:)==0) find(dl1(6,:)==0)]; m=size(dl1,2); if flag, pdebound=zeros(10,m); pdebound(1,bounds)=ones(1,size(bounds,2)); pdebound(2:6,:)=ones(5,m); pdebound([7:8 10],:)='0'*ones(3,m); pdebound(9,:)='1'*ones(1,m); else pdebound=zeros(26,m); pdebound(1,bounds)=2*ones(1,size(bounds,2)); pdebound(2,:)=2*ones(1,m); pdebound(3:14,:)=ones(12,m); pdebound([15:20, 22:23, 25:26],:)='0'*ones(10,m); pdebound([21 24],:)='1'*ones(2,m); end set(h,'UserData',pdebound) % set color and user data of boundaries to Dirichlet values (red) ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); bounds=findobj(get(ax,'Children'),'flat','Tag','PDEBoundLine'); set(bounds,'Erasemode','xor') for i=1:length(bounds), udata=get(bounds(i),'UserData'); udata(2:4)=[1 0 0]; set(bounds(i),'Color','r','UserData',udata) end set(bounds,'Erasemode','background') % deselect all selected boundaries: hndl=findobj(get(bndhndl,'Children'),'flat','Tag','PDEBoundSpec'); set(hndl,'UserData',[]) % % case: set PDE coefficient values % elseif strcmp(action,'set_param') ax=findobj(get(pde_fig,'Children'),'flat','Tag','PDEAxes'); subreg=getuprop(ax,'subsel'); appl=getuprop(pde_fig,'application'); equ=getuprop(pde_fig,'equation'); params=getuprop(pde_fig,'params'); descr=getuprop(pde_fig,'description'); par_val=getuprop(pde_fig,'currparam'); if findstr(par_val(1,:),'!'), if ~isempty(subreg), k=subreg; else k=1; end for i=1:size(par_val,1), str=par_val(i,:); for j=1:k, [tmps,str]=strtok(str,'!'); end if i==1, parvalues=tmps; else parvalues=str2mat(parvalues,tmps); end end else parvalues=par_val; end set(pde_fig,'WindowButtonDownFcn','','Pointer','watch') drawnow if strcmp(computer,'PCWIN'), pderel end typeh=findobj(get(pde_fig,'Children'),'flat','Tag','PDEHelpMenu'); if appl==1 | appl==2, pde_type=get(typeh,'UserData'); pdedlg('initialize',[],pde_type,1:4,equ,params,parvalues,descr) elseif appl==3 | appl==4 , pde_type=get(typeh,'UserData'); pdedlg('initialize',[],pde_type,[1,4],equ,params,parvalues,descr) elseif appl==5 | appl==6 | appl==7 | appl==8, set(typeh,'Userdata',1) pdedlg('initialize',[],1,1,equ,params,parvalues,descr) elseif appl==9 | appl==10, pde_type=get(typeh,'UserData'); pdedlg('initialize',[],pde_type,1:2,equ,params,parvalues,descr) end set(pde_fig,'WindowButtonDownFcn','pdetool subclk','Pointer','arrow') drawnow % % case: set boundary condition parameter values elseif strcmp(action,'set_bounds') appl=getuprop(pde_fig,'application'); boundequ=getuprop(pde_fig,'boundeq'); descr=getuprop(pde_fig,'bounddescr'); systmtx=str2mat('g1','g2','q11, q12','q21, q22','h11, h12','h21, h22',... 'r1','r2'); scalarmtx=str2mat('g','q','h','r'); set(pde_fig,'Pointer','watch') drawnow if strcmp(computer,'PCWIN'), pderel end if appl==1 pdebddlg('initialize',[],1,1:2,boundequ,scalarmtx,descr) elseif appl==2 | appl==3 | appl==4,, pdebddlg('initialize',[],0,1:3,boundequ,systmtx,descr) elseif appl>4 pdebddlg('initialize',[],1,1:2,boundequ,scalarmtx,descr) end set(pde_fig,'Pointer','arrow') drawnow % % case: turn toolbar help on/off elseif strcmp(action,'helponoff') opthndl=findobj(get(pde_fig,'Children'),'flat','Tag','PDEOptMenu'); h=findobj(get(opthndl,'Children'),'flat','Tag','PDEHelpoff'); if getuprop(pde_fig,'toolhelp'), set(h,'Checked','on') setuprop(pde_fig,'toolhelp',0) pdeinfo; else set(h,'Checked','off') setuprop(pde_fig,'toolhelp',1) end % % case: refresh PDE toolbox figure elseif strcmp(action,'refresh') pde_kids = allchild(pde_fig); ax=findobj(pde_kids,'flat','Tag','PDEAxes'); h=findobj(pde_kids,'flat','Tag','PDEFileMenu'); flags=get(h,'UserData'); mode_flag=flags(2); if mode_flag~=3, set(ax,'DrawMode','normal'), refresh(pde_fig); set(ax,'DrawMode','fast') end % % case: 'About PDE Toolbox' display elseif strcmp(action,'about') s = sprintf([... ' The Partial Differential Equation Toolbox \n',... ' for Liquid Sloshing.\n\n',... ' Version 1.0.1\n\n',... ' Copyright(c) 1998-99 by S.J.T.U.']); msgbox(s,'About PDE Toolbox','modal') % % case: error (error message passed in flag) elseif strcmp(action,'error') errordlg(flag,'PDE Toolbox Error','modal'); elseif strcmp(action,'cb_1') if flag==1 disp('elliptic'); CavityChoice = 1; SpheroidDomain = 1; RegularMesh = 0; nodes = 13; alpha = 0.25; G0 = 0; elseif flag==2 disp('regular'); CavityChoice = 2; SpheroidDomain = 0; RegularMesh = 1; nodes_x = 4; nodes_y = 9; alpha = 0.75; G0 = 0; else disp('axis'); CavityChoice = 3; SpheroidDomain = 0; RegularMesh = 0; nodes = floor(abs(nodes)); alpha = abs(alpha)-floor(abs(alpha)); end elseif strcmp(action,'cb_2') if flag==1 MethodChoice = 1; elseif flag==2 MethodChoice = 2; else MethodChoice = 3; end end % end pdetool