annotate libinterp/corefcn/stream-euler.cc @ 27919:1891570abac8

update Octave Project Developers copyright for the new year In files that have the "Octave Project Developers" copyright notice, update for 2020.
author John W. Eaton <jwe@octave.org>
date Mon, 06 Jan 2020 22:29:51 -0500
parents b442ec6dda5c
children bd51beb6205e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27759
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
1 /*
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
2
27919
1891570abac8 update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 27918
diff changeset
3 Copyright (C) 2019-2020 The Octave Project Developers
27918
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 27810
diff changeset
4
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 27810
diff changeset
5 See the file COPYRIGHT.md in the top-level directory of this distribution
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 27810
diff changeset
6 or <https://octave.org/COPYRIGHT.html/>.
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 27810
diff changeset
7
27759
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
8
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
9 This file is part of Octave.
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
10
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
11 Octave is free software: you can redistribute it and/or modify it
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
12 under the terms of the GNU General Public License as published by
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
13 the Free Software Foundation, either version 3 of the License, or
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
14 (at your option) any later version.
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
15
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
16 Octave is distributed in the hope that it will be useful, but
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
17 WITHOUT ANY WARRANTY; without even the implied warranty of
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
19 GNU General Public License for more details.
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
20
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
21 You should have received a copy of the GNU General Public License
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
22 along with Octave; see the file COPYING. If not, see
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
23 <https://www.gnu.org/licenses/>.
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
24
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
25 */
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
26
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
27 /*
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
28
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
29 References:
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
30
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
31 @article{
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
32 title = {Particle Tracing Algorithms for 3D Curvilinear Grids},
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
33 year = {2000},
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
34 author = {Nielson, Gregory and Uller, H. and Sadarjoen, I. and Walsum, Theo and Hin, Andrea and Post, Frits}
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
35 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
36
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
37 @article{
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
38 title = {Sources of error in the graphical analysis of CFD results},
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
39 publisher = {Journal of Scientific Computing},
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
40 year = {1988},
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
41 volume = {3},
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
42 number = {2},
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
43 pages = {149--164},
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
44 author = {Buning, Pieter G.},
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
45 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
46
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
47 */
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
48
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
49 #if defined (HAVE_CONFIG_H)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
50 # include "config.h"
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
51 #endif
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
52
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
53 #include "defun.h"
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
54 #include "error.h"
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
55 #include "ovl.h"
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
56
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
57 // Coordinates of a point in C-Space (unit square mesh)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
58
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
59 typedef struct
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
60 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
61 double x, y;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
62 } Vector2;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
63
27810
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
64 // The integer value and the fractional value from a point in C-Space.
27759
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
65 // Equivalent to the cell index the point is located in and the local
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
66 // coordinates of the point in the cell.
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
67
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
68 typedef struct
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
69 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
70 double fcx, fcy;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
71 signed long idx, idy;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
72 } Cell2;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
73
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
74 typedef struct
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
75 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
76 double x, y, z;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
77 } Vector3;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
78
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
79 typedef struct
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
80 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
81 double fcx, fcy, fcz;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
82 signed long idx, idy, idz;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
83 } Cell3;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
84
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
85 static inline void
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
86 number_to_fractional (signed long *id, double *fc, const double u)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
87 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
88 *id = floor (u);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
89 *fc = u - *id;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
90 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
91
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
92 static inline octave_idx_type
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
93 handle_border_index (const octave_idx_type id, const octave_idx_type N)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
94 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
95 return (id < N - 1 ? id : N - 2);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
96 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
97
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
98 static inline void
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
99 handle_border (octave_idx_type *id2, double *fc2, const octave_idx_type id1,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
100 const double fc1, const octave_idx_type N)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
101 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
102 if (id1 < N - 1)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
103 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
104 *id2 = id1;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
105 *fc2 = fc1;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
106 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
107 else
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
108 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
109 *id2 = N - 2;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
110 *fc2 = 1.0;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
111 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
112 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
113
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
114 static inline double
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
115 bilinear (const double u11, const double u21, const double u12,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
116 const double u22, const double x, const double y)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
117 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
118 return (u11 * (1-x) * (1-y) +
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
119 u21 * x * (1-y) +
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
120 u12 * (1-x) * y +
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
121 u22 * x * y);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
122 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
123
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
124 static inline Cell2
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
125 vector_to_cell2d (const Vector2 X)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
126 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
127 Cell2 Z;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
128
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
129 number_to_fractional (&Z.idx, &Z.fcx, X.x);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
130 number_to_fractional (&Z.idy, &Z.fcy, X.y);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
131
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
132 return (Z);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
133 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
134
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
135 static inline bool
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
136 is_in_definition_set2d (const Cell2 X, const octave_idx_type cols,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
137 const octave_idx_type rows)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
138 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
139 return ( (((X.idx >= 0) && (X.idx < cols-1)) ||
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
140 ((X.idx == cols-1) && (X.fcx == 0.0))) &&
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
141 (((X.idy >= 0) && (X.idy < rows-1)) ||
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
142 ((X.idy == rows-1) && (X.fcy == 0.0))) );
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
143 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
144
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
145 static inline Vector2
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
146 add2d (const Cell2 X, const Vector2 Y)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
147 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
148 Vector2 Z = {X.idx + X.fcx + Y.x,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
149 X.idy + X.fcy + Y.y};
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
150
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
151 return (Z);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
152 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
153
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
154 static inline Vector2
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
155 vector_interpolation2d (const Cell2 X, const Matrix& u, const Matrix& v,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
156 const octave_idx_type cols, const octave_idx_type rows)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
157 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
158 Vector2 V;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
159 double fcx, fcy;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
160 octave_idx_type idx, idy;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
161
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
162 handle_border (&idx, &fcx, X.idx, X.fcx, cols);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
163 handle_border (&idy, &fcy, X.idy, X.fcy, rows);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
164
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
165 V.x = bilinear (u(idy, idx), u(idy, idx+1), u(idy+1, idx),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
166 u(idy+1, idx+1), fcx, fcy);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
167 V.y = bilinear (v(idy, idx), v(idy, idx+1), v(idy+1, idx),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
168 v(idy+1, idx+1), fcx, fcy);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
169
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
170 return (V);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
171 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
172
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
173 // Apply the Jacobian matrix on the vector V.
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
174 // The step vector length is set to h.
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
175
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
176 static inline Vector2
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
177 calculate_step_vector2d (const Cell2 X, const Vector2 V,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
178 const RowVector& tx, const RowVector& ty,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
179 const octave_idx_type cols, const octave_idx_type rows,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
180 const double h)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
181 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
182 Vector2 S;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
183
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
184 const octave_idx_type idx = handle_border_index (X.idx, cols);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
185 const octave_idx_type idy = handle_border_index (X.idy, rows);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
186
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
187 const double x = V.x * tx(idx);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
188 const double y = V.y * ty(idy);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
189 const double n = 1.0 / sqrt (x*x + y*y);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
190 S.x = h * n * x;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
191 S.y = h * n * y;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
192
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
193 return (S);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
194 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
195
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
196 static inline bool
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
197 is_singular2d (const Vector2 V)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
198 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
199 return ((octave::math::isnan (V.x) || octave::math::isnan (V.y)) ||
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
200 ((V.x == 0) && (V.y == 0)));
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
201 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
202
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
203 static void
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
204 euler2d (const octave_idx_type cols, const octave_idx_type rows,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
205 const Matrix& u, const Matrix& v,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
206 const RowVector& tx, const RowVector& ty,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
207 const double zeta, const double xi,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
208 const double h, const octave_idx_type maxnverts,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
209 Matrix& buffer, octave_idx_type *nverts)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
210 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
211 Vector2 V0, V1, S0, X1, Xnxt, S1;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
212 const Vector2 X0 = {zeta, xi};
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
213 Cell2 X0f, X1f;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
214
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
215 octave_idx_type i = 0;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
216
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
217 buffer(i, 0) = X0.x;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
218 buffer(i, 1) = X0.y;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
219
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
220 X0f = vector_to_cell2d (X0);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
221 while (true)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
222 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
223 if (! is_in_definition_set2d (X0f, cols, rows))
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
224 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
225
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
226 V0 = vector_interpolation2d (X0f, u, v, cols, rows);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
227 if (is_singular2d (V0))
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
228 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
229
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
230 S0 = calculate_step_vector2d (X0f, V0, tx, ty, cols, rows, h);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
231
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
232 X1 = add2d (X0f, S0);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
233 X1f = vector_to_cell2d (X1);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
234 if (! is_in_definition_set2d (X1f, cols, rows))
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
235 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
236
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
237 V1 = vector_interpolation2d (X1f, u, v, cols, rows);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
238 if (is_singular2d (V1))
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
239 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
240
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
241 S1 = calculate_step_vector2d (X1f, V1, tx, ty, cols, rows, h);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
242
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
243 // Runge Kutta - Heun's Scheme
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
244 const Vector2 S = {0.5 * (S0.x + S1.x),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
245 0.5 * (S0.y + S1.y)};
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
246 Xnxt = add2d (X0f, S);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
247
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
248 X0f = vector_to_cell2d (Xnxt);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
249 if (! is_in_definition_set2d (X0f, cols, rows))
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
250 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
251
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
252 i++;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
253 buffer(i, 0) = Xnxt.x;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
254 buffer(i, 1) = Xnxt.y;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
255
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
256 if (i + 1 >= maxnverts)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
257 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
258 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
259
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
260 *nverts = i + 1;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
261 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
262
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
263 static inline double
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
264 trilinear (const double u111, const double u211, const double u121,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
265 const double u221, const double u112, const double u212,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
266 const double u122, const double u222,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
267 const double x, const double y, const double z)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
268 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
269 return (u111 * (1-x) * (1-y) * (1-z) +
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
270 u211 * x * (1-y) * (1-z) +
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
271 u121 * (1-x) * y * (1-z) +
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
272 u221 * x * y * (1-z) +
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
273 u112 * (1-x) * (1-y) * z +
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
274 u212 * x * (1-y) * z +
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
275 u122 * (1-x) * y * z +
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
276 u222 * x * y * z);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
277 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
278
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
279 static inline Cell3
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
280 vector_to_cell3d (const Vector3 X)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
281 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
282 Cell3 Z;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
283
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
284 number_to_fractional (&Z.idx, &Z.fcx, X.x);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
285 number_to_fractional (&Z.idy, &Z.fcy, X.y);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
286 number_to_fractional (&Z.idz, &Z.fcz, X.z);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
287
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
288 return (Z);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
289 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
290
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
291 static inline bool
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
292 is_in_definition_set3d (const Cell3 X, const octave_idx_type nx,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
293 const octave_idx_type ny, const octave_idx_type nz)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
294 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
295 return ( (((X.idx >= 0) && (X.idx < nx-1)) ||
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
296 ((X.idx == nx-1) && (X.fcx == 0.0))) &&
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
297 (((X.idy >= 0) && (X.idy < ny-1)) ||
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
298 ((X.idy == ny-1) && (X.fcy == 0.0))) &&
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
299 (((X.idz >= 0) && (X.idz < nz-1)) ||
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
300 ((X.idz == nz-1) && (X.fcz == 0.0))) );
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
301 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
302
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
303 static inline Vector3
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
304 add3d (const Cell3 X, const Vector3 Y)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
305 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
306 Vector3 Z = {X.idx + X.fcx + Y.x,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
307 X.idy + X.fcy + Y.y,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
308 X.idz + X.fcz + Y.z};
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
309
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
310 return (Z);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
311 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
312
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
313 static inline Vector3
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
314 vector_interpolation3d (const Cell3 X, const NDArray& u, const NDArray& v,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
315 const NDArray& w, const octave_idx_type nx,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
316 const octave_idx_type ny, const octave_idx_type nz)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
317 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
318 Vector3 V;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
319 double fcx, fcy, fcz;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
320 octave_idx_type idx, idy, idz;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
321
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
322 handle_border (&idx, &fcx, X.idx, X.fcx, nx);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
323 handle_border (&idy, &fcy, X.idy, X.fcy, ny);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
324 handle_border (&idz, &fcz, X.idz, X.fcz, nz);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
325
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
326 V.x = trilinear (u(idy, idx, idz), u(idy, idx+1, idz),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
327 u(idy+1, idx, idz), u(idy+1, idx+1, idz),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
328 u(idy, idx, idz+1), u(idy, idx+1, idz+1),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
329 u(idy+1, idx, idz+1), u(idy+1, idx+1, idz+1),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
330 fcx, fcy, fcz);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
331 V.y = trilinear (v(idy, idx, idz), v(idy, idx+1, idz),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
332 v(idy+1, idx, idz), v(idy+1, idx+1, idz),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
333 v(idy, idx, idz+1), v(idy, idx+1, idz+1),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
334 v(idy+1, idx, idz+1), v(idy+1, idx+1, idz+1),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
335 fcx, fcy, fcz);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
336 V.z = trilinear (w(idy, idx, idz), w(idy, idx+1, idz),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
337 w(idy+1, idx, idz), w(idy+1, idx+1, idz),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
338 w(idy, idx, idz+1), w(idy, idx+1, idz+1),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
339 w(idy+1, idx, idz+1), w(idy+1, idx+1, idz+1),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
340 fcx, fcy, fcz);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
341
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
342 return (V);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
343 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
344
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
345 static inline Vector3
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
346 calculate_step_vector3d (const Cell3 X, const Vector3 V,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
347 const RowVector& tx, const RowVector& ty, const RowVector& tz,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
348 const octave_idx_type nx, const octave_idx_type ny,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
349 const octave_idx_type nz, const double h)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
350 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
351 Vector3 S;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
352
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
353 const octave_idx_type idx = handle_border_index (X.idx, nx);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
354 const octave_idx_type idy = handle_border_index (X.idy, ny);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
355 const octave_idx_type idz = handle_border_index (X.idz, nz);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
356
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
357 const double x = V.x * tx(idx);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
358 const double y = V.y * ty(idy);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
359 const double z = V.z * tz(idz);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
360 const double n = 1.0 / sqrt (x*x + y*y + z*z);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
361 S.x = h * n * x;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
362 S.y = h * n * y;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
363 S.z = h * n * z;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
364
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
365 return (S);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
366 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
367
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
368 static inline bool
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
369 is_singular3d (const Vector3 V)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
370 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
371 return ((octave::math::isnan (V.x) || octave::math::isnan (V.y) ||
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
372 octave::math::isnan (V.z)) ||
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
373 ((V.x == 0) && (V.y == 0) && (V.z == 0)));
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
374 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
375
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
376 static void
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
377 euler3d (const octave_idx_type nx, const octave_idx_type ny, const octave_idx_type nz,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
378 const NDArray& u, const NDArray& v, const NDArray& w,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
379 const RowVector& tx, const RowVector& ty, const RowVector& tz,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
380 const double zeta, const double xi, const double rho,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
381 const double h, const octave_idx_type maxnverts,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
382 Matrix& buffer, octave_idx_type *nverts)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
383 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
384 Vector3 V0, V1, S0, X1, Xnxt, S1;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
385 const Vector3 X0 = {zeta, xi, rho};
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
386 Cell3 X0f, X1f;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
387
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
388 octave_idx_type i = 0;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
389 buffer(i, 0) = X0.x;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
390 buffer(i, 1) = X0.y;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
391 buffer(i, 2) = X0.z;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
392
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
393 X0f = vector_to_cell3d (X0);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
394 while (true)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
395 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
396 if (! is_in_definition_set3d (X0f, nx, ny, nz))
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
397 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
398
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
399 V0 = vector_interpolation3d (X0f, u, v, w, nx, ny, nz);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
400 if (is_singular3d (V0))
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
401 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
402
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
403 S0 = calculate_step_vector3d (X0f, V0, tx, ty, tz, nx, ny, nz, h);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
404
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
405 X1 = add3d (X0f, S0);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
406
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
407 X1f = vector_to_cell3d (X1);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
408 if (! is_in_definition_set3d (X1f, nx, ny, nz))
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
409 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
410
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
411 V1 = vector_interpolation3d (X1f, u, v, w, nx, ny, nz);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
412 if (is_singular3d (V1))
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
413 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
414
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
415 S1 = calculate_step_vector3d (X1f, V1, tx, ty, tz, nx, ny, nz, h);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
416
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
417 // Runge Kutta - Heun's Scheme
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
418 const Vector3 S = {0.5 * (S0.x + S1.x),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
419 0.5 * (S0.y + S1.y),
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
420 0.5 * (S0.z + S1.z)};
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
421 Xnxt = add3d (X0f, S);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
422
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
423 X0f = vector_to_cell3d (Xnxt);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
424 if (! is_in_definition_set3d (X0f, nx, ny, nz))
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
425 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
426
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
427 i++;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
428 buffer(i, 0) = Xnxt.x;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
429 buffer(i, 1) = Xnxt.y;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
430 buffer(i, 2) = Xnxt.z;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
431
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
432 if (i + 1 >= maxnverts)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
433 break;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
434
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
435 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
436
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
437 *nverts = i + 1;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
438 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
439
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
440 static octave_value
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
441 streameuler2d_internal (const octave_value_list& args)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
442 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
443
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
444 const int nargin = args.length ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
445 if (nargin != 8)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
446 print_usage ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
447
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
448 const Matrix U = args(0).matrix_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
449 const Matrix V = args(1).matrix_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
450 const RowVector TX = args(2).row_vector_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
451 const RowVector TY = args(3).row_vector_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
452 const double zeta = args(4).double_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
453 const double xi = args(5).double_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
454 const double h = args(6).double_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
455 const octave_idx_type maxnverts = args(7).idx_type_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
456
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
457 const octave_idx_type rows = U.rows ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
458 const octave_idx_type cols = U.columns ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
459
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
460 octave_idx_type nverts;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
461 Matrix buffer (maxnverts, 2);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
462
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
463 euler2d (cols, rows, U, V, TX, TY, zeta, xi, h, maxnverts,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
464 buffer, &nverts);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
465
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
466 Matrix xy = buffer.extract (0, 0, nverts-1, 1);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
467
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
468 return octave_value (xy);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
469 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
470
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
471 static octave_value
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
472 streameuler3d_internal (const octave_value_list& args, const char *fcn)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
473 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
474
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
475 const int nargin = args.length ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
476 if (nargin != 11)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
477 print_usage ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
478
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
479 const NDArray U = args(0).array_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
480 const NDArray V = args(1).array_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
481 const NDArray W = args(2).array_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
482 const RowVector TX = args(3).row_vector_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
483 const RowVector TY = args(4).row_vector_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
484 const RowVector TZ = args(5).row_vector_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
485 const double zeta = args(6).double_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
486 const double xi = args(7).double_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
487 const double rho = args(8).double_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
488 const double h = args(9).double_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
489 const octave_idx_type maxnverts = args(10).idx_type_value ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
490
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
491 const dim_vector dims = args(0).dims ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
492 const int ndims = dims.ndims ();
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
493 if (ndims != 3)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
494 error ("%s: dimension must be 3", fcn);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
495
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
496 octave_idx_type nverts;
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
497 Matrix buffer (maxnverts, 3);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
498
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
499 euler3d (dims(1), dims(0), dims(2), U, V, W, TX, TY, TZ, zeta, xi, rho,
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
500 h, maxnverts, buffer, &nverts);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
501
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
502 Matrix xyz = buffer.extract (0, 0, nverts-1, 2);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
503
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
504 return octave_value (xyz);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
505 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
506
27808
d7dfab7045d9 Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents: 27795
diff changeset
507 DEFUN (__streameuler2d__, args, ,
27759
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
508 doc: /* -*- texinfo -*-
27808
d7dfab7045d9 Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents: 27795
diff changeset
509 @deftypefn {} {} __streameuler2d__ (@var{U}, @var{V}, @var{TX}, @var{TY}, @var{ZETA}, @var{XI}, @var{H}, @var{MAXNVERTS})
27810
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
510 Calculates the streamline in a vector field @code{[@var{U}, @var{V}]} starting
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
511 from a seed point at position @code{[@var{ZETA}, @var{XI}]}. The integrator
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
512 used is Heun's Scheme. The step size can be controlled by @var{H}. The
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
513 Jacobian matrix can be defined for each grid cell by
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
514 @code{[@var{TX}, @var{TY}]}.
27759
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
515
27808
d7dfab7045d9 Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents: 27795
diff changeset
516 @seealso{streamline, stream2, stream3, __streameuler3d__}
27759
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
517 @end deftypefn */)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
518 {
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
519 return streameuler2d_internal (args);
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
520 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
521
27808
d7dfab7045d9 Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents: 27795
diff changeset
522 DEFUN (__streameuler3d__, args, ,
27759
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
523 doc: /* -*- texinfo -*-
27808
d7dfab7045d9 Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents: 27795
diff changeset
524 @deftypefn {} {} __streameuler3d__ (@var{U}, @var{V}, @var{W}, @var{TX}, @var{TY}, @var{TZ}, @var{ZETA}, @var{XI}, @var{RHO}, @var{H}, @var{MAXNVERTS})
27810
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
525 Calculates the streamline in a vector field @code{[@var{U}, @var{V}, @var{W}]}
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
526 starting from a seed point at position
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
527 @code{[@var{ZETA}, @var{XI}, @var{RHO}]}. The integrator used is Heun's
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
528 Scheme. The step size can be controlled by @var{H}. The Jacobian matrix can
f2b89a2e20b6 overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents: 27808
diff changeset
529 be defined for each grid cell by @code{[@var{TX}, @var{TY}, @var{TZ}]}.
27759
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
530
27808
d7dfab7045d9 Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents: 27795
diff changeset
531 @seealso{streamline, stream2, stream3, __streameuler2d__}
27759
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
532 @end deftypefn */)
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
533 {
27808
d7dfab7045d9 Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents: 27795
diff changeset
534 return streameuler3d_internal (args, "__streameuler3d__");
27759
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
535 }
992e702ef0d7 Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff changeset
536