1 |
function [phi,jj]=basis2d(fem_grid_struct,xylist,j) |
---|
2 |
%BASIS2D compute basis functions for input points in FEM grid |
---|
3 |
% BASIS2D computes the FEM basis functions for a given |
---|
4 |
% horizontal position, specified either in the argument |
---|
5 |
% list or with the mouse. |
---|
6 |
% |
---|
7 |
% In determining which element has been selected, |
---|
8 |
% BASIS2D needs elemental areas and shape functions. |
---|
9 |
% Element areas are returned by LOADGRID. |
---|
10 |
% The routine BELINT computes shape function information |
---|
11 |
% and attaches it to the input fem_grid_struct. |
---|
12 |
% These two functions MUST be run before BASIS2D will |
---|
13 |
% run. |
---|
14 |
% |
---|
15 |
% BELINT is run as: |
---|
16 |
% new_struct=belint(fem_grid_struct); |
---|
17 |
% If ever needed, EL_AREAS is run as: |
---|
18 |
% [new_struct,ineg]=el_areas(fem_grid_struct); |
---|
19 |
% |
---|
20 |
% INPUT : fem_grid_struct - (from LOADGRID, see FEM_GRID_STRUCT) |
---|
21 |
% xylist (op) - points to find elements for [n x 2 double] |
---|
22 |
% j (op) - element list corresponding to the xylist |
---|
23 |
% set of points. Optional, but isf passed in, |
---|
24 |
% points will not be relocated. length(j) must |
---|
25 |
% equal length(xylist). |
---|
26 |
% |
---|
27 |
% OUTPUT : basis function(s) and element number(s) |
---|
28 |
% If elements were NOT passed in, then providing two output |
---|
29 |
% arguments will collect the elements determined to contain the |
---|
30 |
% specified points. |
---|
31 |
% |
---|
32 |
% CALL : >> [phi,j]=basis2d(fem_grid_struct) for interactive |
---|
33 |
% or |
---|
34 |
% >> [phi,j]=basis2d(fem_grid_struct,xylist) |
---|
35 |
% or |
---|
36 |
% >> phi=basis2d(fem_grid_struct,xylist,j) |
---|
37 |
% |
---|
38 |
% Written by : Brian O. Blanton |
---|
39 |
% Summer 1998 |
---|
40 |
% |
---|
41 |
|
---|
42 |
% Input arguemnt number check |
---|
43 |
nargchk(1,3,nargin); |
---|
44 |
|
---|
45 |
if nargin==3 & nargout==2 |
---|
46 |
error('cannot input AND output element list to BASIS2D') |
---|
47 |
end |
---|
48 |
|
---|
49 |
if nargin==1 |
---|
50 |
% VERIFY INCOMING STRUCTURE |
---|
51 |
% |
---|
52 |
if ~is_valid_struct(fem_grid_struct) |
---|
53 |
error(' Grid argument to BASIS2D must be a valid fem_grid_struct.') |
---|
54 |
end |
---|
55 |
|
---|
56 |
% Make sure additional needed fields of the fem_grid_struct |
---|
57 |
% have been filled. |
---|
58 |
if ~is_valid_struct2(fem_grid_struct) |
---|
59 |
error(' fem_grid_struct to BASIS2D invalid.') |
---|
60 |
end |
---|
61 |
xylist=[]; |
---|
62 |
j=[]; |
---|
63 |
elseif nargin==2 | nargin==3 |
---|
64 |
% second argument must be Nx2 |
---|
65 |
[m,n]=size(xylist); |
---|
66 |
if n~=2 & m~=2 |
---|
67 |
error('xylist to BASIS1D must be Nx2') |
---|
68 |
end |
---|
69 |
|
---|
70 |
% allow for possible 2 x N shape |
---|
71 |
if n>2 |
---|
72 |
xylist=xylist'; |
---|
73 |
end |
---|
74 |
|
---|
75 |
[n,m]=size(xylist); % resize after possible transpose |
---|
76 |
|
---|
77 |
xp=xylist(:,1); |
---|
78 |
yp=xylist(:,2); |
---|
79 |
if nargin==3 |
---|
80 |
[mj,nj]=size(j); |
---|
81 |
if mj~=1 & nj~=1 |
---|
82 |
error(' element list to BASIS2D is not a 1-D vector.') |
---|
83 |
end |
---|
84 |
nj=max(mj,nj); |
---|
85 |
if n~=nj |
---|
86 |
error('length of xylist and element list are NOT equal!') |
---|
87 |
end |
---|
88 |
j=j(:); |
---|
89 |
else |
---|
90 |
j=[]; |
---|
91 |
end |
---|
92 |
|
---|
93 |
end |
---|
94 |
|
---|
95 |
% If no points were input, use mouse to select a |
---|
96 |
% set of points |
---|
97 |
if isempty(xylist) |
---|
98 |
disp('Click on element ...'); |
---|
99 |
waitforbuttonpress; |
---|
100 |
Pt=gcp; |
---|
101 |
xp=Pt(2);yp=Pt(4); |
---|
102 |
line(xp,yp,'Marker','+') |
---|
103 |
xylist=[xp(:) yp(:)]; |
---|
104 |
end |
---|
105 |
if isempty(j) |
---|
106 |
% Get the element number containing points |
---|
107 |
j=findelem(fem_grid_struct,xylist); |
---|
108 |
end |
---|
109 |
|
---|
110 |
inan=find(~isnan(j)); |
---|
111 |
|
---|
112 |
if isempty(inan) |
---|
113 |
phi=[]; |
---|
114 |
j=[]; |
---|
115 |
return; |
---|
116 |
end |
---|
117 |
|
---|
118 |
phi=NaN*ones(length(j),3); |
---|
119 |
|
---|
120 |
% Extract local information |
---|
121 |
n3=fem_grid_struct.e(j(inan),:); |
---|
122 |
x=reshape(fem_grid_struct.x(n3),size(n3)); |
---|
123 |
x1=x(:,1);x2=x(:,2);x3=x(:,3); |
---|
124 |
y=reshape(fem_grid_struct.y(n3),size(n3)); |
---|
125 |
y1=y(:,1);y2=y(:,2);y3=y(:,3); |
---|
126 |
area=fem_grid_struct.ar(j(inan)); |
---|
127 |
|
---|
128 |
xptemp=xp(inan); |
---|
129 |
yptemp=yp(inan); |
---|
130 |
|
---|
131 |
% Basis function #1 |
---|
132 |
a=(x2.*y3-x3.*y2)./(2.0*area); |
---|
133 |
b=(y2-y3)./(2.0*area); |
---|
134 |
c=-(x2-x3)./(2.0*area); |
---|
135 |
phi(inan,1)=a+b.*xptemp+c.*yptemp; |
---|
136 |
|
---|
137 |
% Basis function #2 |
---|
138 |
a=(x3.*y1-x1.*y3)./(2.0*area); |
---|
139 |
b=(y3-y1)./(2.0*area); |
---|
140 |
c=-(x3-x1)./(2.0*area); |
---|
141 |
phi(inan,2)=a+b.*xptemp+c.*yptemp; |
---|
142 |
|
---|
143 |
% Basis function #3 |
---|
144 |
a=(x1.*y2-x2.*y1)./(2.0*area); |
---|
145 |
b=(y1-y2)./(2.0*area); |
---|
146 |
c=-(x1-x2)./(2.0*area); |
---|
147 |
phi(inan,3)=a+b.*xptemp+c.*yptemp; |
---|
148 |
|
---|
149 |
if nargout==0 |
---|
150 |
clear j phi |
---|
151 |
end |
---|
152 |
|
---|
153 |
% |
---|
154 |
% Brian O. Blanton |
---|
155 |
% Department of Marine Sciences |
---|
156 |
% 15-1A Venable Hall |
---|
157 |
% CB# 3300 |
---|
158 |
% Uni. of North Carolina |
---|
159 |
% Chapel Hill, NC |
---|
160 |
% 27599-3300 |
---|
161 |
% |
---|
162 |
% 919-962-4466 |
---|
163 |
% blanton@marine.unc.edu |
---|
164 |
% |
---|
165 |
% Summer 1998 |
---|
166 |
|
---|
167 |
|
---|
168 |
|
---|
169 |
|
---|
170 |
|
---|