I had a need to load some OpenFOAM force data into MATLAB recently and for my future conveniance I wrapped the import commands into a simple to use function to speed future loads.
function [data, structNames] = foamForceLoader(fname)
%FOAMFORCELOADER Load OpenFOAM force data parsing by parentheses groups
% OpenFOAM dumps its force data in a formatted manner but the extensive
% use of parenthesis groups makes hard work for standard text readers.
% This function takes the input data file and returns a structure based
% on the names given in the file. Comments prefixed by "#" are ignored
% and the last comment line in the header will be parsed for the
% structure names.
%
% This should also work with moment files that use similar rules.
%
% Input/s:
% -) fname: the name of the file to read.
%
% Output/s:
% -) data: the data array from parsing the file.
% -) headers: the header text arrays
%
% Dr Peter Brady <peter.brady@openfluids.engineer>
% 2017-05-11
% Attempt to open the file and check for errors
fid = fopen(fname, 'r');
if (fid == -1)
error('FFL:fopen', 'Unable to open: %s', fname)
end
%% Parse the header rows:
lineBuffer = fgetl(fid);
while (lineBuffer ~= -1)
if (strcmp(lineBuffer(1), '#'))
previousLine = lineBuffer;
lineBuffer = fgetl(fid);
else
break;
end
end
% Parse the line to extract the structure names but drop the leading "#"
structNames = parseLineToChar(previousLine(2:1:end));
%% Parse the Data Lines
% First do a very quick line count to pre-allocate arrays
dataRaw = textscan(fid, '%f (%f %f %f) (%f %f %f) (%f %f %f)',...
'CommentStyle', '#');
data = cell2mat(dataRaw);
%% Be nice and close out
fclose(fid);
end
function tokens = parseLineToChar(charsToParse)
tokens = strings(0);
remain = charsToParse;
while (remain ~= "")
% Get the next token:
[token, remain] = strtok(remain); %#ok<STTOK>
% Strip "(" and ")" characters
if (token(1) == "(")
token = token(2:1:end);
end
if (token(end) == ")")
token = token(1:1:end-1);
end
% Append to our data array:
tokens = [tokens; token]; %#ok<AGROW>
end
end
Finally, thanks for reading this article and please leave a comment below. If you are interested in being updated when similar items are posted then either subscribe via RSS or sign up to my mailing list below.