Mercurial > octave
annotate libinterp/corefcn/stream-euler.cc @ 27795:afbaad39d25c
doc: grammarcheck C++ files in libinterp/ directory.
* debug.cc, event-manager.cc, file-io.cc, stream-euler.cc, strfns.cc,
urlwrite.cc, dmperm.cc:
grammarcheck C++ files in libinterp/ directory.
author | Rik <rik@octave.org> |
---|---|
date | Tue, 10 Dec 2019 13:19:07 -0800 |
parents | 992e702ef0d7 |
children | d7dfab7045d9 |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
3 Copyright (C) 2019 Markus Meisinger |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
4 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
5 This file is part of Octave. |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
6 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
7 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
|
8 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
|
9 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
|
10 (at your option) any later version. |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
11 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
12 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
|
13 WITHOUT ANY WARRANTY; without even the implied warranty of |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
15 GNU General Public License for more details. |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
16 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
17 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
|
18 along with Octave; see the file COPYING. If not, see |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
19 <https://www.gnu.org/licenses/>. |
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 */ |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
22 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
23 /* |
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 References: |
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 @article{ |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
28 title = {Particle Tracing Algorithms for 3D Curvilinear Grids}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
29 year = {2000}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
30 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
|
31 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
32 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
33 @article{ |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
34 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
|
35 publisher = {Journal of Scientific Computing}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
36 year = {1988}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
37 volume = {3}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
38 number = {2}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
39 pages = {149--164}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
40 author = {Buning, Pieter G.}, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
41 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
42 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
43 */ |
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 #if defined (HAVE_CONFIG_H) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
46 # include "config.h" |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
47 #endif |
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 #include "defun.h" |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
50 #include "error.h" |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
51 #include "ovl.h" |
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 // Coordinates of a point in C-Space (unit square mesh) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
54 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
55 typedef struct |
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 double x, y; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
58 } Vector2; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
59 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
60 // The integer- and the fractional value from a point in C-Space. |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
61 // 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
|
62 // coordinates of the point in the cell. |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
63 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
64 typedef struct |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
65 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
66 double fcx, fcy; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
67 signed long idx, idy; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
68 } Cell2; |
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 typedef struct |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
71 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
72 double x, y, z; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
73 } Vector3; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
74 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
75 typedef struct |
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 fcx, fcy, fcz; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
78 signed long idx, idy, idz; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
79 } Cell3; |
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 static inline void |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
82 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
|
83 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
84 *id = floor (u); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
85 *fc = u - *id; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
86 } |
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 static inline octave_idx_type |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
89 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
|
90 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
91 return (id < N - 1 ? id : N - 2); |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
94 static inline void |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
95 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
|
96 const double fc1, const octave_idx_type N) |
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 if (id1 < N - 1) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
99 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
100 *id2 = id1; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
101 *fc2 = fc1; |
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 else |
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 = N - 2; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
106 *fc2 = 1.0; |
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 } |
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 static inline double |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
111 bilinear (const double u11, const double u21, const double u12, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
112 const double u22, const double x, const double y) |
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 return (u11 * (1-x) * (1-y) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
115 u21 * x * (1-y) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
116 u12 * (1-x) * y + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
117 u22 * x * 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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
120 static inline Cell2 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
121 vector_to_cell2d (const Vector2 X) |
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 Cell2 Z; |
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 number_to_fractional (&Z.idx, &Z.fcx, X.x); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
126 number_to_fractional (&Z.idy, &Z.fcy, X.y); |
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 return (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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
131 static inline bool |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
132 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
|
133 const octave_idx_type rows) |
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 return ( (((X.idx >= 0) && (X.idx < cols-1)) || |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
136 ((X.idx == cols-1) && (X.fcx == 0.0))) && |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
137 (((X.idy >= 0) && (X.idy < rows-1)) || |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
138 ((X.idy == rows-1) && (X.fcy == 0.0))) ); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
139 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
140 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
141 static inline Vector2 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
142 add2d (const Cell2 X, const Vector2 Y) |
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 Vector2 Z = {X.idx + X.fcx + Y.x, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
145 X.idy + X.fcy + Y.y}; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
146 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
147 return (Z); |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
150 static inline Vector2 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
151 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
|
152 const octave_idx_type cols, const octave_idx_type rows) |
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 Vector2 V; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
155 double fcx, fcy; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
156 octave_idx_type idx, idy; |
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 handle_border (&idx, &fcx, X.idx, X.fcx, cols); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
159 handle_border (&idy, &fcy, X.idy, X.fcy, rows); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
160 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
161 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
|
162 u(idy+1, idx+1), fcx, fcy); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
163 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
|
164 v(idy+1, idx+1), fcx, fcy); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
165 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
166 return (V); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
167 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
168 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
169 // Apply the Jacobian matrix on the vector V. |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
170 // The step vector length is set to h. |
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 static inline Vector2 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
173 calculate_step_vector2d (const Cell2 X, const Vector2 V, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
174 const RowVector& tx, const RowVector& ty, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
175 const octave_idx_type cols, const octave_idx_type rows, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
176 const double 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 Vector2 S; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
179 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
180 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
|
181 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
|
182 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
183 const double x = V.x * tx(idx); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
184 const double y = V.y * ty(idy); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
185 const double n = 1.0 / sqrt (x*x + y*y); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
186 S.x = h * n * x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
187 S.y = h * n * y; |
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 return (S); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
190 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
191 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
192 static inline bool |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
193 is_singular2d (const Vector2 V) |
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 ((octave::math::isnan (V.x) || octave::math::isnan (V.y)) || |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
196 ((V.x == 0) && (V.y == 0))); |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
199 static void |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
200 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
|
201 const Matrix& u, const Matrix& v, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
202 const RowVector& tx, const RowVector& ty, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
203 const double zeta, const double xi, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
204 const double h, const octave_idx_type maxnverts, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
205 Matrix& buffer, octave_idx_type *nverts) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
206 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
207 Vector2 V0, V1, S0, X1, Xnxt, S1; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
208 const Vector2 X0 = {zeta, xi}; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
209 Cell2 X0f, X1f; |
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 octave_idx_type i = 0; |
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 buffer(i, 0) = X0.x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
214 buffer(i, 1) = X0.y; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
215 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
216 X0f = vector_to_cell2d (X0); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
217 while (true) |
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 if (! is_in_definition_set2d (X0f, cols, rows)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
220 break; |
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 V0 = vector_interpolation2d (X0f, u, v, cols, rows); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
223 if (is_singular2d (V0)) |
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 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
|
227 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
228 X1 = add2d (X0f, S0); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
229 X1f = vector_to_cell2d (X1); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
230 if (! is_in_definition_set2d (X1f, cols, rows)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
231 break; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
232 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
233 V1 = vector_interpolation2d (X1f, u, v, cols, rows); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
234 if (is_singular2d (V1)) |
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 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
|
238 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
239 // Runge Kutta - Heun's Scheme |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
240 const Vector2 S = {0.5 * (S0.x + S1.x), |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
241 0.5 * (S0.y + S1.y)}; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
242 Xnxt = add2d (X0f, S); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
243 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
244 X0f = vector_to_cell2d (Xnxt); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
245 if (! is_in_definition_set2d (X0f, cols, rows)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
246 break; |
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 i++; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
249 buffer(i, 0) = Xnxt.x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
250 buffer(i, 1) = Xnxt.y; |
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 if (i + 1 >= maxnverts) |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
256 *nverts = i + 1; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
257 } |
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 static inline double |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
260 trilinear (const double u111, const double u211, const double u121, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
261 const double u221, const double u112, const double u212, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
262 const double u122, const double u222, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
263 const double x, const double y, const double z) |
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 return (u111 * (1-x) * (1-y) * (1-z) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
266 u211 * x * (1-y) * (1-z) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
267 u121 * (1-x) * y * (1-z) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
268 u221 * x * y * (1-z) + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
269 u112 * (1-x) * (1-y) * z + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
270 u212 * x * (1-y) * z + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
271 u122 * (1-x) * y * z + |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
272 u222 * x * y * z); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
273 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
274 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
275 static inline Cell3 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
276 vector_to_cell3d (const Vector3 X) |
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 Cell3 Z; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
279 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
280 number_to_fractional (&Z.idx, &Z.fcx, X.x); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
281 number_to_fractional (&Z.idy, &Z.fcy, X.y); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
282 number_to_fractional (&Z.idz, &Z.fcz, X.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 return (Z); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
285 } |
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 static inline bool |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
288 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
|
289 const octave_idx_type ny, const octave_idx_type nz) |
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 ( (((X.idx >= 0) && (X.idx < nx-1)) || |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
292 ((X.idx == nx-1) && (X.fcx == 0.0))) && |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
293 (((X.idy >= 0) && (X.idy < ny-1)) || |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
294 ((X.idy == ny-1) && (X.fcy == 0.0))) && |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
295 (((X.idz >= 0) && (X.idz < nz-1)) || |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
296 ((X.idz == nz-1) && (X.fcz == 0.0))) ); |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
299 static inline Vector3 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
300 add3d (const Cell3 X, const Vector3 Y) |
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 Vector3 Z = {X.idx + X.fcx + Y.x, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
303 X.idy + X.fcy + Y.y, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
304 X.idz + X.fcz + Y.z}; |
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 return (Z); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
307 } |
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 static inline Vector3 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
310 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
|
311 const NDArray& w, const octave_idx_type nx, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
312 const octave_idx_type ny, const octave_idx_type nz) |
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 Vector3 V; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
315 double fcx, fcy, fcz; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
316 octave_idx_type idx, idy, idz; |
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 handle_border (&idx, &fcx, X.idx, X.fcx, nx); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
319 handle_border (&idy, &fcy, X.idy, X.fcy, ny); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
320 handle_border (&idz, &fcz, X.idz, X.fcz, 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 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
|
323 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
|
324 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
|
325 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
|
326 fcx, fcy, fcz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
327 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
|
328 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
|
329 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
|
330 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
|
331 fcx, fcy, fcz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
332 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
|
333 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
|
334 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
|
335 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
|
336 fcx, fcy, fcz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
337 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
338 return (V); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
339 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
340 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
341 static inline Vector3 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
342 calculate_step_vector3d (const Cell3 X, const Vector3 V, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
343 const RowVector& tx, const RowVector& ty, const RowVector& tz, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
344 const octave_idx_type nx, const octave_idx_type ny, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
345 const octave_idx_type nz, const double h) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
346 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
347 Vector3 S; |
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 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
|
350 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
|
351 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
|
352 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
353 const double x = V.x * tx(idx); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
354 const double y = V.y * ty(idy); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
355 const double z = V.z * tz(idz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
356 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
|
357 S.x = h * n * x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
358 S.y = h * n * y; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
359 S.z = h * n * z; |
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 return (S); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
362 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
363 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
364 static inline bool |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
365 is_singular3d (const Vector3 V) |
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 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
|
368 octave::math::isnan (V.z)) || |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
369 ((V.x == 0) && (V.y == 0) && (V.z == 0))); |
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 void |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
373 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
|
374 const NDArray& u, const NDArray& v, const NDArray& w, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
375 const RowVector& tx, const RowVector& ty, const RowVector& tz, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
376 const double zeta, const double xi, const double rho, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
377 const double h, const octave_idx_type maxnverts, |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
378 Matrix& buffer, octave_idx_type *nverts) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
379 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
380 Vector3 V0, V1, S0, X1, Xnxt, S1; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
381 const Vector3 X0 = {zeta, xi, rho}; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
382 Cell3 X0f, X1f; |
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 octave_idx_type i = 0; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
385 buffer(i, 0) = X0.x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
386 buffer(i, 1) = X0.y; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
387 buffer(i, 2) = X0.z; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
388 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
389 X0f = vector_to_cell3d (X0); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
390 while (true) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
391 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
392 if (! is_in_definition_set3d (X0f, nx, ny, nz)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
393 break; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
394 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
395 V0 = vector_interpolation3d (X0f, u, v, w, nx, ny, nz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
396 if (is_singular3d (V0)) |
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 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
|
400 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
401 X1 = add3d (X0f, S0); |
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 X1f = vector_to_cell3d (X1); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
404 if (! is_in_definition_set3d (X1f, nx, ny, nz)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
405 break; |
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 V1 = vector_interpolation3d (X1f, u, v, w, nx, ny, nz); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
408 if (is_singular3d (V1)) |
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 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
|
412 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
413 // Runge Kutta - Heun's Scheme |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
414 const Vector3 S = {0.5 * (S0.x + S1.x), |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
415 0.5 * (S0.y + S1.y), |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
416 0.5 * (S0.z + S1.z)}; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
417 Xnxt = add3d (X0f, S); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
418 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
419 X0f = vector_to_cell3d (Xnxt); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
420 if (! is_in_definition_set3d (X0f, nx, ny, nz)) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
421 break; |
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 i++; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
424 buffer(i, 0) = Xnxt.x; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
425 buffer(i, 1) = Xnxt.y; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
426 buffer(i, 2) = Xnxt.z; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
427 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
428 if (i + 1 >= maxnverts) |
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 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
432 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
433 *nverts = i + 1; |
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 static octave_value |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
437 streameuler2d_internal (const octave_value_list& args) |
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 const int nargin = args.length (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
441 if (nargin != 8) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
442 print_usage (); |
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 Matrix U = args(0).matrix_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
445 const Matrix V = args(1).matrix_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
446 const RowVector TX = args(2).row_vector_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
447 const RowVector TY = args(3).row_vector_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
448 const double zeta = args(4).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
449 const double xi = args(5).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
450 const double h = args(6).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
451 const octave_idx_type maxnverts = args(7).idx_type_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
452 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
453 const octave_idx_type rows = U.rows (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
454 const octave_idx_type cols = U.columns (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
455 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
456 octave_idx_type nverts; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
457 Matrix buffer (maxnverts, 2); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
458 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
459 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
|
460 buffer, &nverts); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
461 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
462 Matrix xy = buffer.extract (0, 0, nverts-1, 1); |
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 return octave_value (xy); |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
467 static octave_value |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
468 streameuler3d_internal (const octave_value_list& args, const char *fcn) |
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 const int nargin = args.length (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
472 if (nargin != 11) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
473 print_usage (); |
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 NDArray U = args(0).array_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
476 const NDArray V = args(1).array_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
477 const NDArray W = args(2).array_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
478 const RowVector TX = args(3).row_vector_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
479 const RowVector TY = args(4).row_vector_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
480 const RowVector TZ = args(5).row_vector_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
481 const double zeta = args(6).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
482 const double xi = args(7).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
483 const double rho = args(8).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
484 const double h = args(9).double_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
485 const octave_idx_type maxnverts = args(10).idx_type_value (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
486 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
487 const dim_vector dims = args(0).dims (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
488 const int ndims = dims.ndims (); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
489 if (ndims != 3) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
490 error ("%s: dimension must be 3", fcn); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
491 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
492 octave_idx_type nverts; |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
493 Matrix buffer (maxnverts, 3); |
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 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
|
496 h, maxnverts, buffer, &nverts); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
497 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
498 Matrix xyz = buffer.extract (0, 0, nverts-1, 2); |
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 return octave_value (xyz); |
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 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
503 DEFUN (streameuler2d, args, , |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
504 doc: /* -*- texinfo -*- |
27795
afbaad39d25c
doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents:
27759
diff
changeset
|
505 @deftypefn {} {} streameuler2d (@var{U}, @var{V}, @var{TX}, @var{TY}, @var{ZETA}, @var{XI}, @var{H}, @var{MAXNVERTS}) |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
506 Calculates the streamline in a vector field [@var{U}, @var{V}] starting from a |
27795
afbaad39d25c
doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents:
27759
diff
changeset
|
507 seed point at position [@var{ZETA}, @var{XI}]. The integrator used is |
afbaad39d25c
doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents:
27759
diff
changeset
|
508 Heun's Scheme. The step size can be controlled by @var{H}. The Jacobian |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
509 matrix can be defined for each grid cell by [@var{TX}, @var{TY}]. |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
510 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
511 @seealso{streamline, stream2, stream3, streameuler3d} |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
512 @end deftypefn */) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
513 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
514 return streameuler2d_internal (args); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
515 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
516 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
517 DEFUN (streameuler3d, args, , |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
518 doc: /* -*- texinfo -*- |
27795
afbaad39d25c
doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents:
27759
diff
changeset
|
519 @deftypefn {} {} streameuler3d (@var{U}, @var{V}, @var{W}, @var{TX}, @var{TY}, @var{TZ}, @var{ZETA}, @var{XI}, @var{RHO}, @var{H}, @var{MAXNVERTS}) |
afbaad39d25c
doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents:
27759
diff
changeset
|
520 Calculates the streamline in a vector field [@var{U}, @var{V}, @var{W}] |
afbaad39d25c
doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents:
27759
diff
changeset
|
521 starting from a seed point at position [@var{ZETA}, @var{XI}, @var{RHO}]. The |
afbaad39d25c
doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents:
27759
diff
changeset
|
522 integrator used is Heun's Scheme. The step size can be controlled by @var{H}. |
afbaad39d25c
doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents:
27759
diff
changeset
|
523 The Jacobian matrix can be defined for each grid cell by [@var{TX}, @var{TY}, |
afbaad39d25c
doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents:
27759
diff
changeset
|
524 @var{TZ}]. |
27759
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
525 |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
526 @seealso{streamline, stream2, stream3, streameuler2d} |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
527 @end deftypefn */) |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
528 { |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
529 return streameuler3d_internal (args, "streameuler3d"); |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
530 } |
992e702ef0d7
Add stream* functions (patch #9859).
Markus Meisinger <chloros2@gmx.de>
parents:
diff
changeset
|
531 |