function [FigHandle,ColorbarHandle]=PlotMeshScalarVariable(CtrlVar,MUA,Variable,varargin)
Plots a scalar variable over the mesh domain as a patch (see help patch)
PlotMeshScalarVariable(CtrlVar,MUA,Variable,varargin)
variable can be either nodal, element variable (i.e. single value per element) or an integration-point variable.
If variable is empty, nothing is plotted and no warning given.
If 'Variable' not empty, but is not nodal, element or integration-point variable, I complain a bit.
vararing is passed on to the patch command
Examples:
Plot element sizes
load('MUA-PIG-TWG-Example.mat','MUA','BCs','CtrlVar') Tarea=TriAreaFE(MUA.coordinates,MUA.connectivity); Tlength=sqrt(2*Tarea) ; figure ; PlotMeshScalarVariable(CtrlVar,MUA,Tlength) ; title('Element sizes')
Plot a nodal variable (here as an example, the x coordinates of the nodes)
load('MUA-PIG-TWG-Example.mat','MUA','BCs','CtrlVar') x=MUA.coordinates(:,1); figure ; PlotMeshScalarVariable([],MUA,x) ;
Plot the floating mask:
load('MUA-PIG-TWG-Example.mat','MUA','GF','CtrlVar') x=MUA.coordinates(:,1); figure ; PlotMeshScalarVariable(CtrlVar,MUA,GF.node) ; title('The nodal floating mask (floating=0, grounded=1)')
persistent NodTri EleTri Nele Nnodes nod DTintTriInside DTint if islogical(Variable) Variable=double(Variable); end [N,M]=size(Variable); if N==MUA.Nnodes && M==1 % nodal variable if isempty(NodTri) || isempty(Nnodes) NodTri=MUA.connectivity; elseif MUA.Nele~=Nele || MUA.Nnodes~= Nnodes || MUA.nod~=nod NodTri=MUA.connectivity; end [FigHandle,ColorbarHandle,NodTri]=PlotNodalBasedQuantities(NodTri,MUA.coordinates,Variable,CtrlVar,varargin{:}); elseif N==MUA.Nele && M==1 % element variable if isempty(EleTri) || isempty(Nele) EleTri=MUA.connectivity; elseif MUA.Nele~=Nele || MUA.Nnodes~= Nnodes || MUA.nod~=nod EleTri=MUA.connectivity; end [FigHandle,ColorbarHandle,EleTri]=PlotElementBasedQuantities(EleTri,MUA.coordinates,Variable,CtrlVar,varargin{:}); elseif N==MUA.Nele && M==MUA.nip % integration-point variable % This case is slighly more complicated, because the set of integration point can have duplicates if integration points fall on the % element edges, and one must also get rid of any resulting triangles outside of (a possible non-convex) domain. if isempty(DTint) || isempty(Nele) || MUA.Nele~=Nele || MUA.Nnodes~= Nnodes || MUA.nod~=nod x=MUA.coordinates(:,1); y=MUA.coordinates(:,2); [xint,yint] = CalcIntegrationPointsCoordinates(MUA); % create vectors Xint and Yint of unique integration points and triangulise that set of points Xint=xint(:) ; Yint=yint(:); [~, Iint, ~] = unique([Xint Yint],'first','rows'); Iint = sort(Iint); Xint = Xint(Iint); Yint = Yint(Iint); DTint = delaunayTriangulation(Xint,Yint); % get rid of triangles outside of the polygon define by MeshBoundaryCoordinates ic=incenter(DTint); [cnInt,on] = inpoly2(ic,[x(MUA.Boundary.EdgeCornerNodes) y(MUA.Boundary.EdgeCornerNodes)]); DTintTriInside=DTint.ConnectivityList(cnInt,:); end [FigHandle,ColorbarHandle]=PlotIntegrationPointBasedQuantities(CtrlVar,DTintTriInside,DTint.Points,Variable,varargin{:}) ; elseif ~isempty(Variable) fprintf('PlotMeshScalarVariable: Variable has inconsistent dimensions and can not be plotted.\n') warning('Ua:PlotMeshScalarVariable:Inconsistentdimensions','Inconsistent dimensions') FigHandle=[] ; ColorbarHandle=[] ; end Nele=MUA.Nele ; Nnodes=MUA.Nnodes; nod=MUA.nod;
end