X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fodepkg-0.8.2%2Fodeget.m;fp=octave_packages%2Fodepkg-0.8.2%2Fodeget.m;h=348d700dcbbb0114a29bf737ac796ac84a2f5949;hp=0000000000000000000000000000000000000000;hb=f5f7a74bd8a4900f0b797da6783be80e11a68d86;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/odepkg-0.8.2/odeget.m b/octave_packages/odepkg-0.8.2/odeget.m new file mode 100644 index 0000000..348d700 --- /dev/null +++ b/octave_packages/odepkg-0.8.2/odeget.m @@ -0,0 +1,122 @@ +%# Copyright (C) 2006-2012, Thomas Treichl +%# OdePkg - A package for solving ordinary differential equations and more +%# +%# This program is free software; you can redistribute it and/or modify +%# it under the terms of the GNU General Public License as published by +%# the Free Software Foundation; either version 2 of the License, or +%# (at your option) any later version. +%# +%# This program is distributed in the hope that it will be useful, +%# but WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%# GNU General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; If not, see . + +%# -*- texinfo -*- +%# @deftypefn {Function File} {[@var{value}] =} odeget (@var{odestruct}, @var{option}, [@var{default}]) +%# @deftypefnx {Command} {[@var{values}] =} odeget (@var{odestruct}, @{@var{opt1}, @var{opt2}, @dots{}@}, [@{@var{def1}, @var{def2}, @dots{}@}]) +%# +%# If this function is called with two input arguments and the first input argument @var{odestruct} is of type structure array and the second input argument @var{option} is of type string then return the option value @var{value} that is specified by the option name @var{option} in the OdePkg option structure @var{odestruct}. Optionally if this function is called with a third input argument then return the default value @var{default} if @var{option} is not set in the structure @var{odestruct}. +%# +%# If this function is called with two input arguments and the first input argument @var{odestruct} is of type structure array and the second input argument @var{option} is of type cell array of strings then return the option values @var{values} that are specified by the option names @var{opt1}, @var{opt2}, @dots{} in the OdePkg option structure @var{odestruct}. Optionally if this function is called with a third input argument of type cell array then return the default value @var{def1} if @var{opt1} is not set in the structure @var{odestruct}, @var{def2} if @var{opt2} is not set in the structure @var{odestruct}, @dots{} +%# +%# Run examples with the command +%# @example +%# demo odeget +%# @end example +%# @end deftypefn +%# +%# @seealso{odepkg} + +%# Note: 20061022, Thomas Treichl +%# We cannot create a function of the form odeget (@var{odestruct}, +%# @var{name1}, @var{name2}) because we would get a mismatch with +%# the function form 1 like described above. + +function [vret] = odeget (varargin) + + if (nargin == 0) %# Check number and types of input arguments + vmsg = sprintf ('Number of input arguments must be greater than zero'); + help ('odeget'); error (vmsg); + elseif (isstruct (varargin{1}) == true) %# Check first input argument + vint.odestruct = odepkg_structure_check (varargin{1}); + vint.otemplate = odeset; %# Create default odepkg otpions structure + else + vmsg = sprintf ('First input argument must be a valid odepkg otpions structure'); + error (vmsg); + end + + %# Check number and types of other input arguments + if (length (varargin) < 2 || length (varargin) > 3) + vmsg = sprintf ('odeget (odestruct, "option", default) or\n odeget (odestruct, {"opt1", "opt2", ...}, {def1, def2, ...})'); + usage (vmsg); + elseif (ischar (varargin{2}) == true && isempty (varargin{2}) == false) + vint.arguments = {varargin{2}}; + vint.lengtharg = 1; + elseif (iscellstr (varargin{2}) == true && isempty (varargin{2}) == false) + vint.arguments = varargin{2}; + vint.lengtharg = length (vint.arguments); + end + + if (nargin == 3) %# Check if third input argument is valid + if (iscell (varargin{3}) == true) + vint.defaults = varargin{3}; + vint.lengthdf = length (vint.defaults); + else + vint.defaults = {varargin{3}}; + vint.lengthdf = 1; + end + if (vint.lengtharg ~= vint.lengthdf) + vmsg = sprintf ('If third argument is given then sizes of argument 2 and argument 3 must be the equal'); + error (vmsg); + end + end + + %# Run through number of input arguments given + for vcntarg = 1:vint.lengtharg + if ((... + isempty(vint.odestruct.(vint.arguments{vcntarg})) + )||( ... + ischar(vint.odestruct.(vint.arguments{vcntarg})) && ... + strcmp(vint.odestruct.(vint.arguments{vcntarg}),vint.otemplate.(vint.arguments{vcntarg}))... + )||(... + ~ischar(vint.odestruct.(vint.arguments{vcntarg})) && ... + vint.odestruct.(vint.arguments{vcntarg}) == vint.otemplate.(vint.arguments{vcntarg}) ... + )) + if (nargin == 3), vint.returnval{vcntarg} = vint.defaults{vcntarg}; + else, vint.returnval{vcntarg} = vint.odestruct.(vint.arguments{vcntarg}); end + else, vint.returnval{vcntarg} = vint.odestruct.(vint.arguments{vcntarg}); + end + end + + %# Postprocessing, store results in the vret variable + if (vint.lengtharg == 1), vret = vint.returnval{1}; + else, vret = vint.returnval; end + +%!test assert (odeget (odeset (), 'RelTol'), []); +%!test assert (odeget (odeset (), 'RelTol', 10), 10); +%!test assert (odeget (odeset (), {'RelTol', 'AbsTol'}), {[] []}) +%!test assert (odeget (odeset (), {'RelTol', 'AbsTol'}, {10 20}), {10 20}); +%!test assert (odeget (odeset (), 'Stats'), 'off'); +%!test assert (odeget (odeset (), 'Stats', 'on'), 'on'); + +%!demo +%! # Return the manually changed value RelTol of the OdePkg options +%! # strutcure A. If RelTol wouldn't have been changed then an +%! # empty matrix value would have been returned. +%! +%! A = odeset ('RelTol', 1e-1, 'AbsTol', 1e-2); +%! odeget (A, 'RelTol', []) + +%!demo +%! # Return the manually changed value of RelTol and the value 1e-4 +%! # for AbsTol of the OdePkg options structure A. +%! +%! A = odeset ('RelTol', 1e-1); +%! odeget (A, {'RelTol', 'AbsTol'}, {1e-2, 1e-4}) + +%# Local Variables: *** +%# mode: octave *** +%# End: ***