PageRenderTime 50ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/cvs_final/octave-forge/main/odepkg/inst/odepkg_structure_check.m

#
MATLAB | 392 lines | 218 code | 35 blank | 139 comment | 49 complexity | a4af880635407e6585c468b946fcd80f MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-2.1, GPL-3.0, LGPL-3.0
  1. %# Copyright (C) 2006, Thomas Treichl <treichl@users.sourceforge.net>
  2. %# OdePkg - Package for solving ordinary differential equations with Octave
  3. %#
  4. %# This program is free software; you can redistribute it and/or modify
  5. %# it under the terms of the GNU General Public License as published by
  6. %# the Free Software Foundation; either version 2 of the License, or
  7. %# (at your option) any later version.
  8. %#
  9. %# This program is distributed in the hope that it will be useful,
  10. %# but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. %# GNU General Public License for more details.
  13. %#
  14. %# You should have received a copy of the GNU General Public License
  15. %# along with this program; if not, write to the Free Software
  16. %# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. %# -*- texinfo -*-
  18. %# @deftypefn {Function} {@var{odestruct} =} odepkg_structure_check (@var{odestruct}, ['@var{solver}'])
  19. %# Checks the field names and the field values of the OdePkg option structure @var{odestruct} and returns it if it is valid. If optionally called with a second string input argument '@var{solver}' specifying the name of a valid OdePkg solver then a higher level error detection is performed. If an invalid structure fieldname or an invalid value for an option is given then the function returns an error.
  20. %#
  21. %# Run
  22. %# @example
  23. %# demo odepkg_structure_check
  24. %# @end example
  25. %# to see an example.
  26. %# @end deftypefn
  27. %#
  28. %# @seealso{odepkg}
  29. function [vret] = odepkg_structure_check (varargin)
  30. %# Check the number of input arguments
  31. if (nargin == 0)
  32. help ('odepkg_structure_check');
  33. error ('OdePkg:InvalidArgument', ...
  34. 'Number of input arguments must be greater than zero');
  35. elseif (nargin > 2)
  36. print_usage;
  37. elseif (nargin == 1 && isstruct (varargin{1}))
  38. vret = varargin{1};
  39. vsol = '';
  40. vfld = fieldnames (vret);
  41. vlen = length (vfld);
  42. elseif (nargin == 2 && isstruct (varargin{1}) && ischar (varargin{2}))
  43. vret = varargin{1};
  44. vsol = varargin{2};
  45. vfld = fieldnames (vret);
  46. vlen = length (vfld);
  47. end
  48. for vcntarg = 1:vlen %# Run through the number of given structure field names
  49. switch (vfld{vcntarg})
  50. case 'RelTol'
  51. if (isnumeric (vret.(vfld{vcntarg})) && ...
  52. isreal (vret.(vfld{vcntarg})) && ...
  53. all (vret.(vfld{vcntarg}) > 0)) %# 'all' is a MatLab need
  54. else
  55. error ('OdePkg:InvalidParameter', ...
  56. 'Unknown parameter name "%s" or not valid parameter value', ...
  57. vfld{vcntarg});
  58. end
  59. switch (vsol)
  60. case {'ode23', 'ode45', 'ode54', 'ode78'}
  61. if (~isscalar (vret.(vfld{vcntarg})) && ...
  62. ~isempty (vret.(vfld{vcntarg})))
  63. error ('OdePkg:InvalidParameter', ...
  64. 'Value of option "RelTol" must be a scalar for solver "ode23"');
  65. end
  66. otherwise
  67. end
  68. case 'AbsTol'
  69. if (isnumeric (vret.(vfld{vcntarg})) && ...
  70. isreal (vret.(vfld{vcntarg})) && ...
  71. all (vret.(vfld{vcntarg}) > 0))
  72. else
  73. error ('OdePkg:InvalidParameter', ...
  74. 'Unknown parameter name "%s" or not valid parameter value', ...
  75. vfld{vcntarg});
  76. end
  77. case 'NormControl'
  78. if (strcmp (vret.(vfld{vcntarg}), 'on') || ...
  79. strcmp (vret.(vfld{vcntarg}), 'off'))
  80. else
  81. error ('OdePkg:InvalidParameter', ...
  82. 'Unknown parameter name "%s" or not valid parameter value', ...
  83. vfld{vcntarg});
  84. end
  85. case 'NonNegative'
  86. if (isempty (vret.(vfld{vcntarg})) || ...
  87. (isnumeric (vret.(vfld{vcntarg})) && isvector (vret.(vfld{vcntarg}))))
  88. else
  89. error ('OdePkg:InvalidParameter', ...
  90. 'Unknown parameter name "%s" or not valid parameter value', ...
  91. vfld{vcntarg});
  92. end
  93. case 'OutputFcn'
  94. if (isempty (vret.(vfld{vcntarg})) || ...
  95. isa (vret.(vfld{vcntarg}), 'function_handle'))
  96. else
  97. error ('OdePkg:InvalidParameter', ...
  98. 'Unknown parameter name "%s" or not valid parameter value', ...
  99. vfld{vcntarg});
  100. end
  101. case 'OutputSel'
  102. if (isempty (vret.(vfld{vcntarg})) || ...
  103. (isnumeric (vret.(vfld{vcntarg})) && isvector (vret.(vfld{vcntarg}))) || ...
  104. isscalar (vret.(vfld{vcntarg})))
  105. else
  106. error ('OdePkg:InvalidParameter', ...
  107. 'Unknown parameter name "%s" or not valid parameter value', ...
  108. vfld{vcntarg});
  109. end
  110. case 'Refine'
  111. if (isscalar (vret.(vfld{vcntarg})) && ...
  112. mod (vret.(vfld{vcntarg}), 1) == 0 && ...
  113. vret.(vfld{vcntarg}) >= 0 && ...
  114. vret.(vfld{vcntarg}) <= 5)
  115. else
  116. error ('OdePkg:InvalidParameter', ...
  117. 'Unknown parameter name "%s" or not valid parameter value', ...
  118. vfld{vcntarg});
  119. end
  120. case 'Stats'
  121. if (strcmp (vret.(vfld{vcntarg}), 'on') || ...
  122. strcmp (vret.(vfld{vcntarg}), 'off'))
  123. else
  124. error ('OdePkg:InvalidParameter', ...
  125. 'Unknown parameter name "%s" or not valid parameter value', ...
  126. vfld{vcntarg});
  127. end
  128. case 'InitialStep'
  129. if (isempty (vret.(vfld{vcntarg})) || ...
  130. (isscalar (vret.(vfld{vcntarg})) && ...
  131. isreal (vret.(vfld{vcntarg})) && ...
  132. vret.(vfld{vcntarg}) > 0) )
  133. else
  134. error ('OdePkg:InvalidParameter', ...
  135. 'Unknown parameter name "%s" or not valid parameter value', ...
  136. vfld{vcntarg});
  137. end
  138. case 'MaxStep'
  139. if (isempty (vret.(vfld{vcntarg})) || ...
  140. (isscalar (vret.(vfld{vcntarg})) && ...
  141. vret.(vfld{vcntarg}) > 0) )
  142. else
  143. error ('OdePkg:InvalidParameter', ...
  144. 'Unknown parameter name "%s" or not valid parameter value', ...
  145. vfld{vcntarg});
  146. end
  147. case 'Events'
  148. if (isempty (vret.(vfld{vcntarg})) || ...
  149. isa (vret.(vfld{vcntarg}), 'function_handle'))
  150. else
  151. error ('OdePkg:InvalidParameter', ...
  152. 'Unknown parameter name "%s" or not valid parameter value', ...
  153. vfld{vcntarg});
  154. end
  155. case 'Jacobian'
  156. if (isempty (vret.(vfld{vcntarg})) || ...
  157. ismatrix (vret.(vfld{vcntarg})) || ...
  158. isa (vret.(vfld{vcntarg}), 'function_handle') || ...
  159. iscell (vret.(vfld{vcntarg})))
  160. else
  161. error ('OdePkg:InvalidParameter', ...
  162. 'Unknown parameter name "%s" or not valid parameter value', ...
  163. vfld{vcntarg});
  164. end
  165. case 'JPattern'
  166. if (isempty (vret.(vfld{vcntarg})) || ...
  167. issparse (vret.(vfld{vcntarg})))
  168. else
  169. error ('OdePkg:InvalidParameter', ...
  170. 'Unknown parameter name "%s" or not valid parameter value', ...
  171. vfld{vcntarg});
  172. end
  173. case 'Vectorized'
  174. if (strcmp (vret.(vfld{vcntarg}), 'on') || ...
  175. strcmp (vret.(vfld{vcntarg}), 'off'))
  176. else
  177. error ('OdePkg:InvalidParameter', ...
  178. 'Unknown parameter name "%s" or not valid parameter value', ...
  179. vfld{vcntarg});
  180. end
  181. case 'Mass'
  182. if (isempty (vret.(vfld{vcntarg})) || ...
  183. ismatrix (vret.(vfld{vcntarg})) || ...
  184. isa (vret.(vfld{vcntarg}), 'function_handle'))
  185. else
  186. error ('OdePkg:InvalidParameter', ...
  187. 'Unknown parameter name "%s" or not valid parameter value', ...
  188. vfld{vcntarg});
  189. end
  190. case 'MStateDependence'
  191. if (strcmp (vret.(vfld{vcntarg}), 'none') || ...
  192. strcmp (vret.(vfld{vcntarg}), 'weak') || ...
  193. strcmp (vret.(vfld{vcntarg}), 'strong'))
  194. else
  195. error ('OdePkg:InvalidParameter', ...
  196. 'Unknown parameter name "%s" or not valid parameter value', ...
  197. vfld{vcntarg});
  198. end
  199. case 'MvPattern'
  200. if (isempty (vret.(vfld{vcntarg})) || ...
  201. issparse (vret.(vfld{vcntarg})))
  202. else
  203. error ('OdePkg:InvalidParameter', ...
  204. 'Unknown parameter name "%s" or not valid parameter value', ...
  205. vfld{vcntarg});
  206. end
  207. case 'MassSingular'
  208. if (strcmp (vret.(vfld{vcntarg}), 'yes') || ...
  209. strcmp (vret.(vfld{vcntarg}), 'no') || ...
  210. strcmp (vret.(vfld{vcntarg}), 'maybe'))
  211. else
  212. error ('OdePkg:InvalidParameter', ...
  213. 'Unknown parameter name "%s" or not valid parameter value', ...
  214. vfld{vcntarg});
  215. end
  216. case 'InitialSlope'
  217. if (isempty (vret.(vfld{vcntarg})) || ...
  218. isvector (vret.(vfld{vcntarg})))
  219. else
  220. error ('OdePkg:InvalidParameter', ...
  221. 'Unknown parameter name "%s" or not valid parameter value', ...
  222. vfld{vcntarg});
  223. end
  224. case 'MaxOrder'
  225. if (isempty (vret.(vfld{vcntarg})) || ...
  226. (mod (vret.(vfld{vcntarg}), 1) == 0 && ...
  227. vret.(vfld{vcntarg}) > 0 && ...
  228. vret.(vfld{vcntarg}) < 6))
  229. else
  230. error ('OdePkg:InvalidParameter', ...
  231. 'Unknown parameter name "%s" or not valid parameter value', ...
  232. vfld{vcntarg});
  233. end
  234. case 'BDF'
  235. if (strcmp (vret.(vfld{vcntarg}), 'on') || ...
  236. strcmp (vret.(vfld{vcntarg}), 'off'))
  237. else
  238. error ('OdePkg:InvalidParameter', ...
  239. 'Unknown parameter name "%s" or not valid parameter value', ...
  240. vfld{vcntarg});
  241. end
  242. otherwise
  243. error ('OdePkg:InvalidParameter', ...
  244. 'Unknown parameter name "%s"', ...
  245. vfld{vcntarg});
  246. end %# switch
  247. end %# for
  248. %# The following line can be uncommented for a even higher level error
  249. %# detection
  250. %# if (vlen ~= 21)
  251. %# vmsg = sprintf ('Number of fields in structure must match 21');
  252. %# error (vmsg);
  253. %# end
  254. %!test A = odeset ('RelTol', 1e-4);
  255. %!test A = odeset ('RelTol', [1e-4, 1e-3]);
  256. %!test A = odeset ('RelTol', []);
  257. %!error A = odeset ('RelTol', '1e-4');
  258. %!test A = odeset ('AbsTol', 1e-4);
  259. %!test A = odeset ('AbsTol', [1e-4, 1e-3]);
  260. %!test A = odeset ('AbsTol', []);
  261. %!error A = odeset ('AbsTol', '1e-4');
  262. %!test A = odeset ('NormControl', 'on');
  263. %!test A = odeset ('NormControl', 'off');
  264. %!error A = odeset ('NormControl', []);
  265. %!error A = odeset ('NormControl', '12');
  266. %!test A = odeset ('NonNegative', 1);
  267. %!test A = odeset ('NonNegative', [1, 2, 3]);
  268. %!test A = odeset ('NonNegative', []);
  269. %!error A = odeset ('NonNegative', '12');
  270. %!test A = odeset ('OutputFcn', @odeprint);
  271. %!test A = odeset ('OutputFcn', @odeplot);
  272. %!test A = odeset ('OutputFcn', []);
  273. %!error A = odeset ('OutputFcn', 'odeprint');
  274. %!test A = odeset ('OutputSel', 1);
  275. %!test A = odeset ('OutputSel', [1, 2, 3]);
  276. %!test A = odeset ('OutputSel', []);
  277. %!error A = odeset ('OutputSel', '12');
  278. %!test A = odeset ('Refine', 3);
  279. %!error A = odeset ('Refine', [1, 2, 3]);
  280. %!error A = odeset ('Refine', []);
  281. %!error A = odeset ('Refine', 6);
  282. %!test A = odeset ('Stats', 'on');
  283. %!test A = odeset ('Stats', 'off');
  284. %!error A = odeset ('Stats', []);
  285. %!error A = odeset ('Stats', '12');
  286. %!test A = odeset ('InitialStep', 3);
  287. %!error A = odeset ('InitialStep', [1, 2, 3]);
  288. %!test A = odeset ('InitialStep', []);
  289. %!test A = odeset ('InitialStep', 6);
  290. %!test A = odeset ('MaxStep', 3);
  291. %!error A = odeset ('MaxStep', [1, 2, 3]);
  292. %!test A = odeset ('MaxStep', []);
  293. %!test A = odeset ('MaxStep', 6);
  294. %!test A = odeset ('Events', @demo);
  295. %!error A = odeset ('Events', 'off');
  296. %!test A = odeset ('Events', []);
  297. %!error A = odeset ('Events', '12');
  298. %!test A = odeset ('Jacobian', @demo);
  299. %!test A = odeset ('Jacobian', [1, 2; 3, 4]);
  300. %!test A = odeset ('Jacobian', []);
  301. %!error A = odeset ('Jacobian', '12');
  302. %#!test A = odeset ('JPattern', );
  303. %#!test A = odeset ('JPattern', );
  304. %#!error A = odeset ('JPattern', );
  305. %#!error A = odeset ('JPattern', );
  306. %!test A = odeset ('Vectorized', 'on');
  307. %!test A = odeset ('Vectorized', 'off');
  308. %!error A = odeset ('Vectorized', []);
  309. %!error A = odeset ('Vectorized', '12');
  310. %!test A = odeset ('Mass', @demo);
  311. %!test A = odeset ('Mass', [1, 2; 3, 4]);
  312. %!test A = odeset ('Mass', []);
  313. %!error A = odeset ('Mass', '12');
  314. %!test A = odeset ('MStateDependence', 'none');
  315. %!test A = odeset ('MStateDependence', 'weak');
  316. %!test A = odeset ('MStateDependence', 'strong');
  317. %!error A = odeset ('MStateDependence', [1, 2; 3, 4]);
  318. %!error A = odeset ('MStateDependence', []);
  319. %!error A = odeset ('MStateDependence', '12');
  320. %#!test A = odeset ('MvPattern', );
  321. %#!test A = odeset ('MvPattern', );
  322. %#!error A = odeset ('MvPattern', );
  323. %#!error A = odeset ('MvPattern', );
  324. %!test A = odeset ('MassSingular', 'yes');
  325. %!test A = odeset ('MassSingular', 'no');
  326. %!test A = odeset ('MassSingular', 'maybe');
  327. %!error A = odeset ('MassSingular', [1, 2; 3, 4]);
  328. %!error A = odeset ('MassSingular', []);
  329. %!error A = odeset ('MassSingular', '12');
  330. %!test A = odeset ('InitialSlope', [1, 2, 3]);
  331. %!test A = odeset ('InitialSlope', 1);
  332. %!test A = odeset ('InitialSlope', []);
  333. %!test A = odeset ('InitialSlope', '12');
  334. %!test A = odeset ('MaxOrder', 3);
  335. %!error A = odeset ('MaxOrder', 3.5);
  336. %!test A = odeset ('MaxOrder', [1, 2; 3, 4]);
  337. %!test A = odeset ('MaxOrder', []);
  338. %!test A = odeset ('BDF', 'on');
  339. %!test A = odeset ('BDF', 'off');
  340. %!error A = odeset ('BDF', [1, 2; 3, 4]);
  341. %!error A = odeset ('BDF', []);
  342. %!demo
  343. %!
  344. %! odepkg_structure_check (odeset);
  345. %!
  346. %! %----------------------------------------------------------------
  347. %! % Returns the checked OdePkg options structure created by odeset.
  348. %!demo
  349. %!
  350. %! A = odeset (); odepkg_structure_check (A);
  351. %!
  352. %! %----------------------------------------------------------------
  353. %! % Create the OdePkg options structure A with odeset and check it
  354. %! % with odepkg_structure_check.
  355. %# Local Variables: ***
  356. %# mode: octave ***
  357. %# End: ***