plotframe3.m.html | ![]() |
Source file: plotframe3.m | |
Directory: /home/rjl/git/rjleveque/clawpack-4.x/matlab | |
Converted: Sun May 15 2011 at 19:15:58 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
% % PLOTFRAME3 plots data from a single Clawpack output file. % % PLOTFRAME3 is called from PLOTCLAW3, the driver script for Clawpack % graphics. PLOTFRAME3 uses parameters, defined in the user's % workspace, usually in the SETPLOT3 script, to determine what kind of % plot to create, and various other plotting options. % % See SETPLOT for a complete list of the parameters that the user can % set. % % There are three basic types of plots available. These are % % Slice plots : 3d slices, along Cartesian or mapped Cartesian % coordinates shown. % % Scatter plots : Spherically symmetric data is plotted as a % function of a 1d variable, usually the distance from a fixed point % (x0,y0,z0). The result is a 2d line-type plot of points % representing the data. % % Isosurfaces : Surfaces of constant data values are shown. These % can be combined with slices, if desired. % % See SETPLOT, PLOTCLAW3, MAPPEDGRID. if (~exist('amrdata')) str = sprintf(['*** Plotframe3 : ''amrdata'' does not exist. call\n',... '*** readamrdata or plotclaw3']); error(str); end; if length(amrdata) == 0 disp(' ') disp(['Frame ',num2str(Frame),'(',outputflag,') does not exist ***']); disp(' ') return; end; disp(' '); disp(['Frame ',num2str(Frame),' at time t = ',num2str(t)]); if exist('beforeframe')==2 % make an m-file with this name for any other commands you % want executed before drawing each frame, for example % if you want to use axes to specify exactly where the % plot will be in the window, aspect ratio, etc. beforeframe; end % ------------------------------------------------------------------------ % Check PlotType <= 3 inputs (slices) % ------------------------------------------------------------------------ if (PlotType <= 3) % The manifold option isn't used in 3d manifold = 0; set_value('mappedgrid','MappedGrid',0); set_value('view_arg','UserView',3); set_value('cvalues','ContourValues',[]); set_value('interpmethod','InterpMethod','*linear'); if (mappedgrid == 1) if (~exist('mapc2p')) error('*** MappedGrid == 1 but no ''mapc2p'' function was found'); end; end; if (PlotType == 2) if (isempty(cvalues)) disp(' '); disp(' *** Warning : You have specified PlotType == 2, but have'); disp(' *** not set any contour values. Set ContourValues to a '); disp(' *** vector of values or integer (number of contour lines). '); end; end; % Change color map for schlieren plot if (PlotType == 3) % colormap(flipud(gray(2048)).^5) colormap(flipud(gray(2048)).^10) if (~isempty(cvalues)) disp(' '); disp(' *** Warning : ContourValues is set to a non-empty matrix.'); disp(' *** Schlieren data will be contoured.'); end; end; set_value('xscoords','xSliceCoords',[]); set_value('yscoords','ySliceCoords',[]); set_value('zscoords','zSliceCoords',[]); if (length(cvalues) == 1 & (length(amrdata) > 1 | ... (length(xscoords) + length(yscoords) + length(zscoords) > 1))) disp(' '); disp(' *** Warning: Contour values will be chosen independently'); disp(' *** on each amr patch or slice. Set ContourValues to a '); disp(' *** vector of values to insure that contour lines match '); disp(' *** across mesh boundaries or slices.'); end; set_value('isosurfvalues','IsosurfValues',[]); m = length(isosurfvalues); if (m > 0) % now check input for isosurfaces set_value('isoalphas','IsosurfAlphas',1); isosurfalphas = set_length(isoalphas,m); set_value('isc','IsosurfColors','q'); if (iscell(isc)) % In case SETPLOTSTYLE was used to to set the isosurfcolors. isocolors = strvcat(isc); else isocolors = isc; end; isosurfcolors = set_length(isocolors,m); versionstring = version; version_number = str2num(versionstring(1)); for i = 1:length(isosurfalphas) a = isosurfalphas(i); has_opengl = strcmp(get(gcf,'Renderer'),'OpenGL'); if (a < 1 & version_number < 6) disp(' '); disp(' *** plotframe3: Transparency for isosurfaces supported only in') disp(' *** Matlab versions 6 and higher.'); isosurfalphas(i) = 1; elseif (a < 1 & has_opengl == 0) disp(' *** Warning : The graphics renderer OpenGL is not set on your'); disp(' *** system. Use setopengl to set this renderer. Without it,'); disp(' *** isosurfaces will not appear transparent'); isosurfalphas(i) = 1; end; end; else % These won't be used... isosurfcolors = ''; isosurfalphas = []; end; % end of length(isosurfvalues > 0) clear_amrplot; create_amrplot(MaxLevels,xscoords,yscoords,zscoords,isosurfvalues); newplot; end; % end of PlotType <= 3 % ------------------------------------------------------------------------ % Check PlotType == 4 inputs (1d line plots) % ------------------------------------------------------------------------ if (PlotType == 4) view_arg = 2; set_value('usermap1d','UserMap1d',0); if (usermap1d == 1) if (~exist('map1d')) error('*** You have set UserMap1d=1, but no ''map1d'' function was found'); end; else if ((~exist('x0') | ~exist('y0') | ~exist('z0'))) str = sprintf(['*** plotframe3 : (x0,y0,z0) must be defined before you\n',... '*** can do a line or scatter plot. Or, create a ''map1d''',... ' function and set UserMap1d = 1']); error(str); end; end; set_value('mappedgrid','MappedGrid',0); if (exist('ScatterStyle')) pstyle = ScatterStyle; elseif (exist('LineStyle')) pstyle = LineStyle; else error([' *** plotframe3 : Set either ''ScatterStyle'' or ',... '''LineStyle''.']); end; if (~iscell(pstyle)) str = sprintf(['*** plotframe3 : ScatterStyle or LineStyle must be cell \n',... 'matrices. Use SETPLOTSTYLE to set either of these variables.']); error(str); end; [linestyle,linecolors,markerstyle] = get_plotstyle(pstyle,MaxLevels); clear_amrplot; create_amrplot(MaxLevels); newplot; end; % end of PlotType == 4 % ------------------------------------------------------------------------ % Check PlotType == 5 inputs (deprecated isosurface plots) % ------------------------------------------------------------------------ if (PlotType == 5) disp(' ') disp(' *** PlotType = 5 is no longer supported as of Clawpack 4.2') disp(' *** Choose different setting for PlotType in setplot3.m') disp(' *** Isosurface plots are avaiable with PlotType = 1, 2 or 3') disp(' *** by setting IsosurfValues and IsosurfColors') disp(' ') end; % end of PlotType == 5 % End of input check. % ------------------------------------------------------------------ % Store current handle data structure in the UserData property of the % current figure, gcf. % --------------------------------------------------------------------- % ------------------------------------------------------------------------ % Main loop for this frame. % ------------------------------------------------------------------------ qmin = []; qmax = []; ncells = []; ngrids = length(amrdata); % length of structure array for ng = 1:ngrids, gridno = amrdata(ng).gridno; level = amrdata(ng).level; % bn_plotframeN is a global variable used in mapc2p.m if the grid % mapping varies across the blocks. set_blocknumber(gridno); if (PlotData(level) == 0) % Continue to next patch continue; end; mx = amrdata(ng).mx; my = amrdata(ng).my; mz = amrdata(ng).mz; xlow = amrdata(ng).xlow; ylow = amrdata(ng).ylow; zlow = amrdata(ng).zlow; dx = amrdata(ng).dx; dy = amrdata(ng).dy; dz = amrdata(ng).dz; data = amrdata(ng).data; % Get grid info for plotting grid boxes. xhigh = xlow + mx*dx; yhigh = ylow + my*dy; zhigh = zlow + mz*dz; xedge = xlow + (0:mx)*dx; yedge = ylow + (0:my)*dy; zedge = zlow + (0:mz)*dz; xcenter = xedge(1:mx) + dx/2; ycenter = yedge(1:my) + dy/2; zcenter = zedge(1:mz) + dz/2; % for compatibility with old matlab41/plotframe3 convention: x = xcenter; y = ycenter; z = zcenter; data = data'; if (UserVariable == 1) % User has supplied a function to convert original q variables to % the variable which is to be plotted, e.g. Mach number, entropy. qdata = feval(UserVariableFile,data); q = reshape(qdata,mx,my,mz); else q = reshape(data(:,mq),mx,my,mz); end % q must be permuted so that it matches the dimensions of xcm,ycm,zcm % created by meshgrid. if (PlotType == 3) % Scheieren plot; we plot the gradient, not the values. [qx,qy,qz] = gradient(q,dx,dy,dz); qs = sqrt(qx.^2 + qy.^2 + qz.^2); qmesh = permute(qs,[2,1,3]); else qmesh = permute(q,[2,1,3]); end; amrdata(ng).q = qmesh; % minimum over all grids at this time, but not necessarily on slice % shown. qmin = min([qmin,min(min(min(q)))]); qmax = max([qmax,max(max(max(q)))]); % keep count of how many cells at this refinement level: if length(ncells) < level ncells(level) = 0; end; ncells(level) = ncells(level) + mx*my*mz; % ----------------------------------------------- % plot commands go here if PlotType <= 3 sliceCoords = {xscoords, yscoords, zscoords}; sdirs = {'x','y','z'}; maskflag = 1; % Mask out patch areas for idir = 1:3, % Loop over directions slicevals = sliceCoords{idir}; % user specified slice constants sdir = sdirs{idir}; % Loop over all slices that cube of data qmesh might intersect for n = 1:length(slicevals), sval = slicevals(n); [isect,qcm2] = interp_data_3d(xcenter,ycenter,zcenter,... xedge,yedge,zedge,qmesh,sdir,sval,interpmethod); if (isect == 1) % qmesh intersects a user specified slice. % This command adds a patch to the appropriate slice add_patch2slice(sdir,sval, n,xcenter,ycenter,zcenter,... xedge,yedge,zedge,qcm2,level,... cvalues,mappedgrid, manifold,maskflag,ng); end; end; end; % Add cube to plot - whether it is visible or not depends on how user % set PlotCubeEdges. add_cube2plot(xedge,yedge,zedge,level,mappedgrid); % Add isosurfaces to plot add_isosurface2plot(xcenter,ycenter,zcenter,q,level,isosurfvalues,... isosurfcolors,isosurfalphas,mappedgrid); end; % End plotting for PlotType == 3 if (PlotType == 4) % 1d Line plots [xcm,ycm,zcm] = meshgrid(xcenter,ycenter,zcenter); if (usermap1d == 1) if (usermap1d == 1) if (mappedgrid == 1) [xpm,ypm,zpm] = mapc2p(xcm,ycm,zcm); [rvec,qvec] = map1d(xpm,ypm,zpm,qmesh); else [rvec,qvec] = map1d(xcm,ycm,zcm,qmesh); end [rs,cs] = size(rvec); [rq,cq] = size(qvec); if (cs > 1 | cq > 1) error(['plotframe3 : map1d can only return single columns vectors ',... 'for s or q']); end; else if (mappedgrid == 1) [xpm,ypm,zpm] = mapc2p(xcm,ycm,zcm); r = sqrt((xpm - x0).^2 + (ypm - y0).^2 + (zpm - z0).^2); else r = sqrt((xcm - x0).^2 + (ycm - y0).^2 + (zcm - z0).^2); end; rvec = reshape(r,prod(size(r)),1); qvec = reshape(qmesh,prod(size(qmesh)),1); end; add_line2plot(rvec,qvec,level,markerstyle{level},... linecolors{level},linestyle{level}); end; % end of plotting for PlotType == 4 if exist('aftergrid')==2 % make an m-file with this name for any other commands you % want executed at the end of drawing each grid aftergrid; end; end % loop on ng (plot commands for each grid) % ----------------------------------------------------- set(gca,'FontName','helvetica'); if UserVariable == 1 str = sprintf('%s at time %8.4f',UserVariableFile,t); title(str,'fontsize',15); else str = sprintf('q(%d) at time %8.4f',mq,t); title(str,'fontsize',15); end % Set user defined grid details, from setplot3.m if (PlotType <= 3) setPlotGrid(PlotGrid); setPlotGridEdges(PlotGridEdges); setPlotCubeEdges(PlotCubeEdges); if (PlotType == 2) setslicecolor('w'); end; % Now plot intersections of x-y planes, x-z planes and y-z planes. create_sliceintersections(mappedgrid); xlabel('x') ylabel('y') zlabel('z') end; view(view_arg); if exist('afterframe')==2 afterframe % make an m-file with this name for any other commands you % want executed at the end of drawing each frame % for example to change the axes, or add a curve for a % boundary end; end