1 |
function fem_data_struct=read_fem_data(fname) |
---|
2 |
%READ_FEM_DATA read a FEM output file of standard filetype. |
---|
3 |
% READ_FEM_DATA is part of a suite of OPNML I/O functions |
---|
4 |
% to read specific filetypes pertaining to FEM model |
---|
5 |
% input and output. These functions allow the user to |
---|
6 |
% get these data files into MATLAB without copying the |
---|
7 |
% files and removing the header info by hand. |
---|
8 |
% |
---|
9 |
% READ_FEM_DATA reads all FEM filetypes (.s2r,.v2c,...), |
---|
10 |
% as detailed in "Data File Standards for the Gulf of Maine |
---|
11 |
% Project" from the Numerical Methods Laboratory at |
---|
12 |
% Dartmouth College. |
---|
13 |
% |
---|
14 |
% READ_FEM_DATA returns a FEM_DATA_STRUCT to the local |
---|
15 |
% workspace that contains all into needed by subsequent |
---|
16 |
% routines. |
---|
17 |
% |
---|
18 |
% If FNAME is omitted, READ_FEM_DATA enables a file |
---|
19 |
% browser with which the user can specify the file. |
---|
20 |
% |
---|
21 |
% Otherwise, FNAME is the name of a standard filetype, |
---|
22 |
% relative or absolute (fullpath), including the filetype |
---|
23 |
% suffix. This input is a char array so it must be enclosed |
---|
24 |
% in single quotes. |
---|
25 |
% |
---|
26 |
% See FEM_DATA_STRUCT for a description of the struct array |
---|
27 |
% returned. |
---|
28 |
% Call as: >> data_struct=read_fem_data(fname); |
---|
29 |
% |
---|
30 |
% Written by : Brian O. Blanton |
---|
31 |
|
---|
32 |
err1=['READ_FEM_DATA requires 0 or 1 argument.']; |
---|
33 |
err2=['Argument to READ_FEM_DATA must be a string (filename)']; |
---|
34 |
if ~exist('fname') |
---|
35 |
[fname,fpath]=uigetfile('*','Which file'); |
---|
36 |
if fname==0,return,end |
---|
37 |
else |
---|
38 |
if ~isstr(fname),error(err2),end |
---|
39 |
% parse into filename and pathname |
---|
40 |
slash_place=findstr(fname,'/'); |
---|
41 |
slash_place=slash_place(length(slash_place)); |
---|
42 |
fpath=fname(1:slash_place-1); |
---|
43 |
fname=fname(slash_place+1:length(fname)); |
---|
44 |
end |
---|
45 |
|
---|
46 |
% Find dot delimiters in filename |
---|
47 |
dot_place=findstr(fname,'.'); |
---|
48 |
% use only the last dot as the extension delimiter; |
---|
49 |
% this allows for gridnames with dots, like grid.new.ele, etc... |
---|
50 |
dot_place=dot_place(length(dot_place)); |
---|
51 |
flength=length(fname); |
---|
52 |
|
---|
53 |
% get filetype from tail of fname |
---|
54 |
ftype=fname(dot_place+1:flength); |
---|
55 |
fname2=fname(1:dot_place-1); |
---|
56 |
|
---|
57 |
% make sure this is an allowed filetype |
---|
58 |
% The second set with trailing "e" allows for element-based |
---|
59 |
% data. |
---|
60 |
possible_types={'s2r','s2c','v2r','v2c','s3r','s3c','v3r','v3c',... |
---|
61 |
's2re','s2ce','v2re','v2ce','s3re','s3ce','v3re','v3ce'}; |
---|
62 |
if ~strcmp(ftype,possible_types) |
---|
63 |
error(['READ_FEM_DATA cannot read ' ftype ' filetype']) |
---|
64 |
end |
---|
65 |
|
---|
66 |
[pfid,message]=fopen([fpath '/' fname]); |
---|
67 |
if pfid==-1 |
---|
68 |
error([fpath fname,' not found. ',message]); |
---|
69 |
end |
---|
70 |
|
---|
71 |
fem_data_struct.fname=fname2; |
---|
72 |
fem_data_struct.fext =ftype; |
---|
73 |
fem_data_struct.fpath=fpath; |
---|
74 |
|
---|
75 |
% If we're this far... |
---|
76 |
|
---|
77 |
% the 2nd character of ftype is the dimension of the data |
---|
78 |
ndim=eval(ftype(2)); |
---|
79 |
fem_data_struct.ndim=ndim; |
---|
80 |
|
---|
81 |
% the 1st character of ftype is the type of the data |
---|
82 |
type1=ftype(1); |
---|
83 |
if strcmp(type1,'s') |
---|
84 |
type1='scalar'; |
---|
85 |
else |
---|
86 |
type1='vector'; |
---|
87 |
end |
---|
88 |
fem_data_struct.type1=type1; |
---|
89 |
|
---|
90 |
% the 3rd character of ftype is the type real/complex |
---|
91 |
type2=ftype(3); |
---|
92 |
if strcmp(type2,'r') |
---|
93 |
type2='real'; |
---|
94 |
else |
---|
95 |
type2='complex'; |
---|
96 |
end |
---|
97 |
fem_data_struct.type2=type2; |
---|
98 |
|
---|
99 |
% if there is a 4th character, it is necessarily 'e' for 'element' |
---|
100 |
if length(ftype)==3 |
---|
101 |
type3='nodal'; |
---|
102 |
else |
---|
103 |
type3='elemental'; |
---|
104 |
end |
---|
105 |
fem_data_struct.type3=type3; |
---|
106 |
|
---|
107 |
% In all filetypes there is always a gridname |
---|
108 |
% and description line as lines #1 and #2 of the file. |
---|
109 |
gridname=fgets(pfid); |
---|
110 |
iding=findstr(gridname,' '); |
---|
111 |
gridname(iding)=[]; |
---|
112 |
descline=fgets(pfid); |
---|
113 |
fem_data_struct.gname=gridname; |
---|
114 |
fem_data_struct.h1=descline; |
---|
115 |
|
---|
116 |
% If field is complex, frequency is next |
---|
117 |
% |
---|
118 |
fem_data_struct.freq=1e-12; |
---|
119 |
if strcmp(type2,'complex') |
---|
120 |
freq=eval(fgets(pfid)); |
---|
121 |
fem_data_struct.freq=freq; |
---|
122 |
end |
---|
123 |
|
---|
124 |
% Depending on filetype, read remainder of file |
---|
125 |
if ndim==3 |
---|
126 |
% nnv is the next entry |
---|
127 |
nnv=eval(fgets(pfid)); |
---|
128 |
fem_data_struct.nnv=nnv; |
---|
129 |
else |
---|
130 |
fem_data_struct.nnv=1; |
---|
131 |
end |
---|
132 |
|
---|
133 |
if ndim==2 |
---|
134 |
if strcmp(type1,'scalar') |
---|
135 |
if strcmp(type2,'real') |
---|
136 |
ncol=1; |
---|
137 |
else |
---|
138 |
ncol=2; |
---|
139 |
end |
---|
140 |
else % vector |
---|
141 |
if strcmp(type2,'real') |
---|
142 |
ncol=2; |
---|
143 |
else |
---|
144 |
ncol=4; |
---|
145 |
end |
---|
146 |
end |
---|
147 |
else |
---|
148 |
if strcmp(type1,'scalar') |
---|
149 |
if strcmp(type2,'real') |
---|
150 |
ncol=1; |
---|
151 |
else |
---|
152 |
ncol=2; |
---|
153 |
end |
---|
154 |
else % vector |
---|
155 |
if strcmp(type2,'real') |
---|
156 |
ncol=3; |
---|
157 |
else |
---|
158 |
ncol=6; |
---|
159 |
end |
---|
160 |
end |
---|
161 |
end |
---|
162 |
|
---|
163 |
% Build format string |
---|
164 |
format_string=['%d ']; |
---|
165 |
for i=1:ncol |
---|
166 |
format_string=[format_string '%f ']; |
---|
167 |
end |
---|
168 |
|
---|
169 |
% Add column for node counter |
---|
170 |
ncol=ncol+1; |
---|
171 |
|
---|
172 |
% Extra column for depth in 3-D file |
---|
173 |
if ndim==3 |
---|
174 |
format_string=[format_string '%f ']; |
---|
175 |
ncol=ncol+1; |
---|
176 |
end |
---|
177 |
|
---|
178 |
% Read block of data |
---|
179 |
data=fscanf(pfid,format_string,[ncol inf])'; |
---|
180 |
|
---|
181 |
if ndim==3 |
---|
182 |
fem_data_struct.zgrid=data(:,2); |
---|
183 |
fem_data_struct.data1=data(:,3:ncol+1); |
---|
184 |
else |
---|
185 |
fem_data_struct.zgrid='none'; |
---|
186 |
fem_data_struct.data1=data(:,2:ncol); |
---|
187 |
end |
---|
188 |
|
---|
189 |
fclose(pfid); |
---|
190 |
|
---|
191 |
% |
---|
192 |
% Brian O. Blanton |
---|
193 |
% Department of Marine Sciences |
---|
194 |
% 15-1A Venable Hall |
---|
195 |
% CB# 3300 |
---|
196 |
% Uni. of North Carolina |
---|
197 |
% Chapel Hill, NC |
---|
198 |
% 27599-3300 |
---|
199 |
% |
---|
200 |
% 919-962-4466 |
---|
201 |
% blanton@marine.unc.edu |
---|
202 |
% |
---|
203 |
% Fall 1998 |
---|