Mercurial > octave
annotate libinterp/corefcn/stream-euler.cc @ 33645:42355b7ec5d7 bytecode-interpreter tip
maint: Merge default to bytecode-interpreter.
author | Nicholas R. Jankowski <jankowski.nicholas@gmail.com> |
---|---|
date | Tue, 04 Jun 2024 11:00:11 -0400 |
parents | 2e484f9f1f18 |
children |
rev | line source |
---|---|
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
1 //////////////////////////////////////////////////////////////////////// |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
2 // |
32632
2e484f9f1f18
maint: update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
31706
diff
changeset
|
3 // Copyright (C) 2019-2024 The Octave Project Developers |
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
4 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
5 // See the file COPYRIGHT.md in the top-level directory of this |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
6 // distribution or <https://octave.org/copyright/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
7 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
8 // This file is part of Octave. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
9 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
10 // Octave is free software: you can redistribute it and/or modify it |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
11 // under the terms of the GNU General Public License as published by |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
12 // the Free Software Foundation, either version 3 of the License, or |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
13 // (at your option) any later version. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
14 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
15 // Octave is distributed in the hope that it will be useful, but |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
16 // WITHOUT ANY WARRANTY; without even the implied warranty of |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
18 // GNU General Public License for more details. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
19 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
20 // You should have received a copy of the GNU General Public License |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
21 // along with Octave; see the file COPYING. If not, see |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
22 // <https://www.gnu.org/licenses/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
23 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
24 //////////////////////////////////////////////////////////////////////// |
27759
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 References: |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
29 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
30 @article{ |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
31 title = {Particle Tracing Algorithms for 3D Curvilinear Grids}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
32 year = {2000}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
33 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
|
34 } |
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 @article{ |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
37 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
|
38 publisher = {Journal of Scientific Computing}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
39 year = {1988}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
40 volume = {3}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
41 number = {2}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
42 pages = {149--164}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
43 author = {Buning, Pieter G.}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
44 } |
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 #if defined (HAVE_CONFIG_H) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
49 # include "config.h" |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
50 #endif |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
51 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
52 #include "defun.h" |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
53 #include "error.h" |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
54 #include "ovl.h" |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
55 |
31605
e88a07dec498
maint: Use macros to begin/end C++ namespaces.
Rik <rik@octave.org>
parents:
31594
diff
changeset
|
56 OCTAVE_BEGIN_NAMESPACE(octave) |
29958
32c3a5805893
move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
57 |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
58 // Coordinates of a point in C-Space (unit square mesh) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
59 |
30043
b8ffd22ee32c
maint: use C++ style struct declaration instead of typedef struct in stream-euler.cc
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
60 struct Vector2 |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
61 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
62 double x, y; |
30043
b8ffd22ee32c
maint: use C++ style struct declaration instead of typedef struct in stream-euler.cc
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
63 }; |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
64 |
27810
f2b89a2e20b6
overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents:
27808
diff
changeset
|
65 // 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
|
66 // 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
|
67 // coordinates of the point in the cell. |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
68 |
30043
b8ffd22ee32c
maint: use C++ style struct declaration instead of typedef struct in stream-euler.cc
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
69 struct Cell2 |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
70 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
71 double fcx, fcy; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
72 signed long idx, idy; |
30043
b8ffd22ee32c
maint: use C++ style struct declaration instead of typedef struct in stream-euler.cc
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
73 }; |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
74 |
30043
b8ffd22ee32c
maint: use C++ style struct declaration instead of typedef struct in stream-euler.cc
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
75 struct Vector3 |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
76 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
77 double x, y, z; |
30043
b8ffd22ee32c
maint: use C++ style struct declaration instead of typedef struct in stream-euler.cc
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
78 }; |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
79 |
30043
b8ffd22ee32c
maint: use C++ style struct declaration instead of typedef struct in stream-euler.cc
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
80 struct Cell3 |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
81 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
82 double fcx, fcy, fcz; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
83 signed long idx, idy, idz; |
30043
b8ffd22ee32c
maint: use C++ style struct declaration instead of typedef struct in stream-euler.cc
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
84 }; |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
85 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
86 static inline void |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
87 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
|
88 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
89 *id = floor (u); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
90 *fc = u - *id; |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
93 static inline octave_idx_type |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
94 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
|
95 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
96 return (id < N - 1 ? id : N - 2); |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
99 static inline void |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
100 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
|
101 const double fc1, const octave_idx_type N) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
102 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
103 if (id1 < N - 1) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
104 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
105 *id2 = id1; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
106 *fc2 = fc1; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
107 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
108 else |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
109 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
110 *id2 = N - 2; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
111 *fc2 = 1.0; |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
115 static inline double |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
116 bilinear (const double u11, const double u21, const double u12, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
117 const double u22, const double x, const double y) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
118 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
119 return (u11 * (1-x) * (1-y) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
120 u21 * x * (1-y) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
121 u12 * (1-x) * y + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
122 u22 * x * y); |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
125 static inline Cell2 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
126 vector_to_cell2d (const Vector2 X) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
127 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
128 Cell2 Z; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
129 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
130 number_to_fractional (&Z.idx, &Z.fcx, X.x); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
131 number_to_fractional (&Z.idy, &Z.fcy, X.y); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
132 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
133 return (Z); |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
136 static inline bool |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
137 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
|
138 const octave_idx_type rows) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
139 { |
31607
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
140 return ( (((X.idx >= 0) && (X.idx < cols-1)) || |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
141 ((X.idx == cols-1) && (X.fcx == 0.0))) && |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
142 (((X.idy >= 0) && (X.idy < rows-1)) || |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
143 ((X.idy == rows-1) && (X.fcy == 0.0))) ); |
27759
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
146 static inline Vector2 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
147 add2d (const Cell2 X, const Vector2 Y) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
148 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
149 Vector2 Z = {X.idx + X.fcx + Y.x, |
31607
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
150 X.idy + X.fcy + Y.y |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
151 }; |
27759
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 return (Z); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
154 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
155 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
156 static inline Vector2 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
157 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
|
158 const octave_idx_type cols, const octave_idx_type rows) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
159 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
160 Vector2 V; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
161 double fcx, fcy; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
162 octave_idx_type idx, idy; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
163 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
164 handle_border (&idx, &fcx, X.idx, X.fcx, cols); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
165 handle_border (&idy, &fcy, X.idy, X.fcy, rows); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
166 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
167 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
|
168 u(idy+1, idx+1), fcx, fcy); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
169 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
|
170 v(idy+1, idx+1), fcx, fcy); |
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 return (V); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
173 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
174 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
175 // Apply the Jacobian matrix on the vector V. |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
176 // The step vector length is set to h. |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
177 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
178 static inline Vector2 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
179 calculate_step_vector2d (const Cell2 X, const Vector2 V, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
180 const RowVector& tx, const RowVector& ty, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
181 const octave_idx_type cols, const octave_idx_type rows, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
182 const double h) |
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 Vector2 S; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
185 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
186 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
|
187 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
|
188 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
189 const double x = V.x * tx(idx); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
190 const double y = V.y * ty(idy); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
191 const double n = 1.0 / sqrt (x*x + y*y); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
192 S.x = h * n * x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
193 S.y = h * n * y; |
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 return (S); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
196 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
197 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
198 static inline bool |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
199 is_singular2d (const Vector2 V) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
200 { |
29961
7d6709900da7
eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents:
29958
diff
changeset
|
201 return ((math::isnan (V.x) || math::isnan (V.y)) || |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
202 ((V.x == 0) && (V.y == 0))); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
203 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
204 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
205 static void |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
206 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
|
207 const Matrix& u, const Matrix& v, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
208 const RowVector& tx, const RowVector& ty, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
209 const double zeta, const double xi, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
210 const double h, const octave_idx_type maxnverts, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
211 Matrix& buffer, octave_idx_type *nverts) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
212 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
213 Vector2 V0, V1, S0, X1, Xnxt, S1; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
214 const Vector2 X0 = {zeta, xi}; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
215 Cell2 X0f, X1f; |
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 octave_idx_type i = 0; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
218 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
219 buffer(i, 0) = X0.x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
220 buffer(i, 1) = X0.y; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
221 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
222 X0f = vector_to_cell2d (X0); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
223 while (true) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
224 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
225 if (! is_in_definition_set2d (X0f, cols, rows)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
226 break; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
227 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
228 V0 = vector_interpolation2d (X0f, u, v, cols, rows); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
229 if (is_singular2d (V0)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
230 break; |
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 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
|
233 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
234 X1 = add2d (X0f, S0); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
235 X1f = vector_to_cell2d (X1); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
236 if (! is_in_definition_set2d (X1f, cols, rows)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
237 break; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
238 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
239 V1 = vector_interpolation2d (X1f, u, v, cols, rows); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
240 if (is_singular2d (V1)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
241 break; |
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 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
|
244 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
245 // Runge Kutta - Heun's Scheme |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
246 const Vector2 S = {0.5 * (S0.x + S1.x), |
31607
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
247 0.5 * (S0.y + S1.y) |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
248 }; |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
249 Xnxt = add2d (X0f, S); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
250 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
251 X0f = vector_to_cell2d (Xnxt); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
252 if (! is_in_definition_set2d (X0f, cols, rows)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
253 break; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
254 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
255 i++; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
256 buffer(i, 0) = Xnxt.x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
257 buffer(i, 1) = Xnxt.y; |
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 if (i + 1 >= maxnverts) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
260 break; |
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 *nverts = i + 1; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
264 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
265 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
266 static inline double |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
267 trilinear (const double u111, const double u211, const double u121, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
268 const double u221, const double u112, const double u212, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
269 const double u122, const double u222, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
270 const double x, const double y, const double z) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
271 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
272 return (u111 * (1-x) * (1-y) * (1-z) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
273 u211 * x * (1-y) * (1-z) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
274 u121 * (1-x) * y * (1-z) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
275 u221 * x * y * (1-z) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
276 u112 * (1-x) * (1-y) * z + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
277 u212 * x * (1-y) * z + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
278 u122 * (1-x) * y * z + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
279 u222 * x * y * z); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
280 } |
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 static inline Cell3 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
283 vector_to_cell3d (const Vector3 X) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
284 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
285 Cell3 Z; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
286 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
287 number_to_fractional (&Z.idx, &Z.fcx, X.x); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
288 number_to_fractional (&Z.idy, &Z.fcy, X.y); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
289 number_to_fractional (&Z.idz, &Z.fcz, X.z); |
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 return (Z); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
292 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
293 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
294 static inline bool |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
295 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
|
296 const octave_idx_type ny, const octave_idx_type nz) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
297 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
298 return ( (((X.idx >= 0) && (X.idx < nx-1)) || |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
299 ((X.idx == nx-1) && (X.fcx == 0.0))) && |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
300 (((X.idy >= 0) && (X.idy < ny-1)) || |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
301 ((X.idy == ny-1) && (X.fcy == 0.0))) && |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
302 (((X.idz >= 0) && (X.idz < nz-1)) || |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
303 ((X.idz == nz-1) && (X.fcz == 0.0))) ); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
304 } |
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 static inline Vector3 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
307 add3d (const Cell3 X, const Vector3 Y) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
308 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
309 Vector3 Z = {X.idx + X.fcx + Y.x, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
310 X.idy + X.fcy + Y.y, |
31607
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
311 X.idz + X.fcz + Y.z |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
312 }; |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
313 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
314 return (Z); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
315 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
316 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
317 static inline Vector3 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
318 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
|
319 const NDArray& w, const octave_idx_type nx, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
320 const octave_idx_type ny, const octave_idx_type nz) |
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 Vector3 V; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
323 double fcx, fcy, fcz; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
324 octave_idx_type idx, idy, idz; |
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 handle_border (&idx, &fcx, X.idx, X.fcx, nx); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
327 handle_border (&idy, &fcy, X.idy, X.fcy, ny); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
328 handle_border (&idz, &fcz, X.idz, X.fcz, nz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
329 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
330 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
|
331 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
|
332 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
|
333 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
|
334 fcx, fcy, fcz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
335 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
|
336 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
|
337 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
|
338 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
|
339 fcx, fcy, fcz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
340 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
|
341 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
|
342 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
|
343 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
|
344 fcx, fcy, fcz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
345 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
346 return (V); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
347 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
348 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
349 static inline Vector3 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
350 calculate_step_vector3d (const Cell3 X, const Vector3 V, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
351 const RowVector& tx, const RowVector& ty, const RowVector& tz, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
352 const octave_idx_type nx, const octave_idx_type ny, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
353 const octave_idx_type nz, const double h) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
354 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
355 Vector3 S; |
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 octave_idx_type idx = handle_border_index (X.idx, nx); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
358 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
|
359 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
|
360 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
361 const double x = V.x * tx(idx); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
362 const double y = V.y * ty(idy); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
363 const double z = V.z * tz(idz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
364 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
|
365 S.x = h * n * x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
366 S.y = h * n * y; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
367 S.z = h * n * z; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
368 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
369 return (S); |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
372 static inline bool |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
373 is_singular3d (const Vector3 V) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
374 { |
29961
7d6709900da7
eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents:
29958
diff
changeset
|
375 return ((math::isnan (V.x) || math::isnan (V.y) || math::isnan (V.z)) || |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
376 ((V.x == 0) && (V.y == 0) && (V.z == 0))); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
377 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
378 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
379 static void |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
380 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
|
381 const NDArray& u, const NDArray& v, const NDArray& w, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
382 const RowVector& tx, const RowVector& ty, const RowVector& tz, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
383 const double zeta, const double xi, const double rho, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
384 const double h, const octave_idx_type maxnverts, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
385 Matrix& buffer, octave_idx_type *nverts) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
386 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
387 Vector3 V0, V1, S0, X1, Xnxt, S1; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
388 const Vector3 X0 = {zeta, xi, rho}; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
389 Cell3 X0f, X1f; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
390 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
391 octave_idx_type i = 0; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
392 buffer(i, 0) = X0.x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
393 buffer(i, 1) = X0.y; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
394 buffer(i, 2) = X0.z; |
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 X0f = vector_to_cell3d (X0); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
397 while (true) |
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 if (! is_in_definition_set3d (X0f, nx, ny, nz)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
400 break; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
401 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
402 V0 = vector_interpolation3d (X0f, u, v, w, nx, ny, nz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
403 if (is_singular3d (V0)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
404 break; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
405 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
406 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
|
407 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
408 X1 = add3d (X0f, S0); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
409 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
410 X1f = vector_to_cell3d (X1); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
411 if (! is_in_definition_set3d (X1f, nx, ny, nz)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
412 break; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
413 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
414 V1 = vector_interpolation3d (X1f, u, v, w, nx, ny, nz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
415 if (is_singular3d (V1)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
416 break; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
417 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
418 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
|
419 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
420 // Runge Kutta - Heun's Scheme |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
421 const Vector3 S = {0.5 * (S0.x + S1.x), |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
422 0.5 * (S0.y + S1.y), |
31607
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
423 0.5 * (S0.z + S1.z) |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
424 }; |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
425 Xnxt = add3d (X0f, S); |
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 X0f = vector_to_cell3d (Xnxt); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
428 if (! is_in_definition_set3d (X0f, nx, ny, nz)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
429 break; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
430 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
431 i++; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
432 buffer(i, 0) = Xnxt.x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
433 buffer(i, 1) = Xnxt.y; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
434 buffer(i, 2) = Xnxt.z; |
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 if (i + 1 >= maxnverts) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
437 break; |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
441 *nverts = i + 1; |
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 static octave_value |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
445 streameuler2d_internal (const octave_value_list& args) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
446 { |
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 int nargin = args.length (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
449 if (nargin != 8) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
450 print_usage (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
451 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
452 const Matrix U = args(0).matrix_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
453 const Matrix V = args(1).matrix_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
454 const RowVector TX = args(2).row_vector_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
455 const RowVector TY = args(3).row_vector_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
456 const double zeta = args(4).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
457 const double xi = args(5).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
458 const double h = args(6).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
459 const octave_idx_type maxnverts = args(7).idx_type_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
460 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
461 const octave_idx_type rows = U.rows (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
462 const octave_idx_type cols = U.columns (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
463 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
464 octave_idx_type nverts; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
465 Matrix buffer (maxnverts, 2); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
466 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
467 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
|
468 buffer, &nverts); |
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 Matrix xy = buffer.extract (0, 0, nverts-1, 1); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
471 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
472 return octave_value (xy); |
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 static octave_value |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
476 streameuler3d_internal (const octave_value_list& args, const char *fcn) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
477 { |
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 int nargin = args.length (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
480 if (nargin != 11) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
481 print_usage (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
482 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
483 const NDArray U = args(0).array_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
484 const NDArray V = args(1).array_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
485 const NDArray W = args(2).array_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
486 const RowVector TX = args(3).row_vector_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
487 const RowVector TY = args(4).row_vector_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
488 const RowVector TZ = args(5).row_vector_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
489 const double zeta = args(6).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
490 const double xi = args(7).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
491 const double rho = args(8).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
492 const double h = args(9).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
493 const octave_idx_type maxnverts = args(10).idx_type_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
494 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
495 const dim_vector dims = args(0).dims (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
496 const int ndims = dims.ndims (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
497 if (ndims != 3) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
498 error ("%s: dimension must be 3", fcn); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
499 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
500 octave_idx_type nverts; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
501 Matrix buffer (maxnverts, 3); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
502 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
503 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
|
504 h, maxnverts, buffer, &nverts); |
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 Matrix xyz = buffer.extract (0, 0, nverts-1, 2); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
507 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
508 return octave_value (xyz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
509 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
510 |
27808
d7dfab7045d9
Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents:
27795
diff
changeset
|
511 DEFUN (__streameuler2d__, args, , |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
512 doc: /* -*- texinfo -*- |
30888
32d2b6604a9f
doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents:
30564
diff
changeset
|
513 @deftypefn {} {@var{output} =} __streameuler2d__ (@var{U}, @var{V}, @var{TX}, @var{TY}, @var{ZETA}, @var{XI}, @var{H}, @var{MAXNVERTS}) |
31594
a3d8915b9f87
doc: more DOCSTRING changes ahead of 8.1 release.
Rik <rik@octave.org>
parents:
30888
diff
changeset
|
514 Calculate the streamline in a vector field @code{[@var{U}, @var{V}]} starting |
27810
f2b89a2e20b6
overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents:
27808
diff
changeset
|
515 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
|
516 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
|
517 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
|
518 @code{[@var{TX}, @var{TY}]}. |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
519 |
27808
d7dfab7045d9
Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents:
27795
diff
changeset
|
520 @seealso{streamline, stream2, stream3, __streameuler3d__} |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
521 @end deftypefn */) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
522 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
523 return streameuler2d_internal (args); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
524 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
525 |
27808
d7dfab7045d9
Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents:
27795
diff
changeset
|
526 DEFUN (__streameuler3d__, args, , |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
527 doc: /* -*- texinfo -*- |
30888
32d2b6604a9f
doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents:
30564
diff
changeset
|
528 @deftypefn {} {@var{output} =} __streameuler3d__ (@var{U}, @var{V}, @var{W}, @var{TX}, @var{TY}, @var{TZ}, @var{ZETA}, @var{XI}, @var{RHO}, @var{H}, @var{MAXNVERTS}) |
31594
a3d8915b9f87
doc: more DOCSTRING changes ahead of 8.1 release.
Rik <rik@octave.org>
parents:
30888
diff
changeset
|
529 Calculate the streamline in a vector field @code{[@var{U}, @var{V}, @var{W}]} |
27810
f2b89a2e20b6
overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents:
27808
diff
changeset
|
530 starting from a seed point at position |
f2b89a2e20b6
overhaul streamXXX.m series of functions.
Rik <rik@octave.org>
parents:
27808
diff
changeset
|
531 @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
|
532 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
|
533 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
|
534 |
27808
d7dfab7045d9
Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents:
27795
diff
changeset
|
535 @seealso{streamline, stream2, stream3, __streameuler2d__} |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
536 @end deftypefn */) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
537 { |
27808
d7dfab7045d9
Make "streameuler2d" and "streameuler3d" internal functions.
Markus Mützel <markus.muetzel@gmx.de>
parents:
27795
diff
changeset
|
538 return streameuler3d_internal (args, "__streameuler3d__"); |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
539 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
540 |
31605
e88a07dec498
maint: Use macros to begin/end C++ namespaces.
Rik <rik@octave.org>
parents:
31594
diff
changeset
|
541 OCTAVE_END_NAMESPACE(octave) |