Mercurial > repos > public > sbplib
view SolutionFile.m @ 1037:2d7ba44340d0 feature/burgers1d
Pass scheme specific parameters as cell array. This will enabale constructDiffOps to be more general. In addition, allow for schemes returning function handles as diffOps, which is currently how non-linear schemes such as Burgers1d are implemented.
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Fri, 18 Jan 2019 09:02:02 +0100 |
parents | 8298734b1938 |
children |
line wrap: on
line source
classdef SolutionFile < handle properties filename matfile keys % Cell array of keys. Each key is a structure % entries end methods function obj = SolutionFile(filename) obj.filename = filename; is_new_file = ~exist(filename,'file'); % obj.matfile = matfile(filename,'Writable',true); fprintf('MATLAB SUCKS!!!!\n') if is_new_file obj.matfile.keys = {}; obj.matfile.entries = {}; else loadStruct = load(filename); obj.matfile.keys = loadStruct.keys; obj.matfile.entries = loadStruct.entries; % matObj = matfile(filename,'Writable',true); % obj.matfile.keys = matObj.keys; % obj.matfile.entries = matObj.entries; end obj.keys = obj.matfile.keys; end function stupidSave(obj) % Read file contents matObj = matfile(obj.filename,'Writable',true); keys = obj.matfile.keys; entries = obj.matfile.entries; % Delete the file if exist(obj.filename,'file') delete(obj.filename); end % Rewrite the file matObj = matfile(obj.filename,'Writable',true); matObj.keys = keys; matObj.entries = entries; end function list(obj, show_syntax) default_arg('show_syntax',false); for i = 1:length(obj.keys) fprintf('[%d]: %s', i, toString(obj.keys{i})); if show_syntax fprintf('\t%s',struct2syntax(obj.keys{i})); end fprintf('\n'); end end % Returns the index for a key. Returns 0 if the key doesn't exist function I = getIndex(obj, key) I = 0; for i = 1:length(obj.keys) if isequal(key,obj.keys{i}); I = i; return end end end function b = isKey(obj, key) I = obj.getIndex(key); if I == 0 b = false; else b = true; end end % Gets entries where key match exactly. function e = get(obj, key) if ~obj.isKey(key); key error('No such key: %s', struct2string(key)); end I = obj.getIndex(key); e = obj.getEntryByIndex(I); % unpack the cell array end % Handles indexing weirdness of matfile class function e = getEntryByIndex(obj, I) e = obj.matfile.entries(1,I); e = e{1}; end function e = deleteByIndex(obj, I) obj.keys(I) = []; obj.matfile.keys = obj.keys; entries = obj.matfile.entries; entries(I) = []; obj.matfile.entries = entries; end % Handles indexing weirdness of matfile class function setEntryByIndex(obj,I, entry, force_flag) default_arg('force_flag',false); if ~force_flag && ( I < 1 || I > length(obj.keys)) error('I is out of range. I = %d',I); end obj.matfile.entries(1,I) = {entry}; end function store(obj, key, entry) if obj.isKey(key); I = obj.getIndex(key); else I = length(obj.keys) + 1; end obj.keys{I} = key; obj.matfile.keys = obj.keys; obj.setEntryByIndex(I,entry,true); end function delete(obj, key) if ~obj.isKey(key); error('No such key: %s', struct2string(key)); end I = obj.getIndex(key); obj.deleteByIndex(I); end % Gets entries where the defined parts of partial_key matches the key of the entry function [keys, entries] = find(obj,partial_key) keys = {}; entries = {}; for i = 1:length(obj.keys) if structIsSubset(partial_key,obj.keys{i}) i obj.keys{i} keys{end + 1} = obj.keys{i}; entries{end + 1} = obj.getEntryByIndex(i); end end end end methods(Static) function merge(fn1, fn2, fnNew) sf1 = SolutionFile(fn1); sf2 = SolutionFile(fn2); sfNew = SolutionFile(fnNew); sfNew.keys = sf1.keys; sfNew.matfile.keys = sf1.keys; sfNew.matfile.entries = sf1.matfile.entries; for i = 1:length(sf2.keys) if sfNew.isKey(sf2.keys{i}) warning('Key ''%s'' exists in both files!',struct2string(sf2.keys{i})); end sfNew.store(sf2.keys{i},sf2.getEntryByIndex(i)); end end function b = keyIsEqual(key1,key2) b = isequal(key1, key2); end function b = keyIsIn(key,keys) b = false; for i = 1:length(keys) b = isequal(key, keys{i}); if b return end end end end end