1 | #include <hmpp_fun.h> |
---|
2 | |
---|
3 | |
---|
4 | |
---|
5 | #ifdef USING_LOCAL_DIRECTIVES |
---|
6 | #pragma hmpp manFrictionFlat codelet, target=CUDA args[*].transfer=atcall |
---|
7 | #endif |
---|
8 | void manning_friction_flat( |
---|
9 | int N, |
---|
10 | int N3, |
---|
11 | double g, |
---|
12 | double eps, // minimum_allowed_height |
---|
13 | |
---|
14 | double w[N], // stage_centroid_values |
---|
15 | double zv[N3], // elevation_vertex_values |
---|
16 | double uh[N], // xmom_centroid_values |
---|
17 | double vh[N], // ymom_centroid_values |
---|
18 | double eta[N],// friction_centroid_values |
---|
19 | double xmom[N],//xmom_semi_implicit_update |
---|
20 | double ymom[N])//ymom_semi_implicit_update |
---|
21 | { |
---|
22 | int k; |
---|
23 | #ifndef REARRANGED_DOMAIN |
---|
24 | int k3; |
---|
25 | #endif |
---|
26 | double S, h, z, z0, z1, z2; |
---|
27 | |
---|
28 | #pragma hmppcg gridify(k), & |
---|
29 | #pragma hmppcg & private( k3, S, h, z, z0, z1, z2), & |
---|
30 | #pragma hmppcg & global( g, eps, w,zv, uh, vh, eta, xmom, ymom) |
---|
31 | for (k = 0; k < N; k++) { |
---|
32 | if (eta[k] > eps) { |
---|
33 | #ifndef REARRANGED_DOMAIN |
---|
34 | k3 = 3 * k; |
---|
35 | z0 = zv[k3 + 0]; |
---|
36 | z1 = zv[k3 + 1]; |
---|
37 | z2 = zv[k3 + 2]; |
---|
38 | #else |
---|
39 | z0 = zv[k]; |
---|
40 | z1 = zv[k + N]; |
---|
41 | z2 = zv[k + 2*N]; |
---|
42 | #endif |
---|
43 | |
---|
44 | z = (z0 + z1 + z2) / 3.0; |
---|
45 | h = w[k] - z; |
---|
46 | if (h >= eps) { |
---|
47 | S = -g *eta[k] * eta[k] * sqrt((uh[k] * uh[k] + vh[k] * vh[k])); |
---|
48 | S /= pow(h, 7.0 / 3); //Expensive (on Ole's home computer) |
---|
49 | //seems to save about 15% over manning_friction |
---|
50 | //S /= exp((7.0/3.0)*log(h)); |
---|
51 | //FIXME: Could use a Taylor expansion |
---|
52 | //S /= h*h*(1 + h/3.0 - h*h/9.0); |
---|
53 | |
---|
54 | //Update momentum |
---|
55 | xmom[k] += S * uh[k]; |
---|
56 | ymom[k] += S * vh[k]; |
---|
57 | } |
---|
58 | } |
---|
59 | } |
---|
60 | } |
---|
61 | |
---|
62 | |
---|
63 | |
---|
64 | #ifdef USING_LOCAL_DIRECTIVES |
---|
65 | #pragma hmpp manFrictionSloped codelet, target=CUDA args[*].transfer=atcall |
---|
66 | #endif |
---|
67 | void manning_friction_sloped( |
---|
68 | int N, |
---|
69 | int N3, |
---|
70 | int N6, |
---|
71 | double g, |
---|
72 | double eps, // minimum_allowed_height |
---|
73 | |
---|
74 | double x[N6], // vertex_coordinates |
---|
75 | double w[N], // stage_centroid_values |
---|
76 | double zv[N3], // elevation_vertex_values |
---|
77 | double uh[N], // xmom_centroid_values |
---|
78 | double vh[N], // ymom_centroid_values |
---|
79 | double eta[N],// friction_centroid_values |
---|
80 | double xmom_update[N], // xmom_semi_implicit_update |
---|
81 | double ymom_update[N]) // ymom_semi_implicit_update |
---|
82 | { |
---|
83 | int k; |
---|
84 | #ifndef REARRANGED_DOMAIN |
---|
85 | int k3, k6; |
---|
86 | #endif |
---|
87 | double S, h, z, z0, z1, z2, zs, zx, zy; |
---|
88 | double x0, y0, x1, y1, x2, y2; |
---|
89 | double det; |
---|
90 | |
---|
91 | #pragma hmppcg gridify(k), & |
---|
92 | #pragma hmppcg & private( k3, k6, S, h, z, z0, z1, z2, zs, zx, zy, & |
---|
93 | #pragma hmppcg & x0, y0, x1, y1, x2, y2, det), & |
---|
94 | #pragma hmppcg & global( g, eps, x, w, zv, uh, vh, eta, & |
---|
95 | #pragma hmppcg & xmom_update, ymom_update) |
---|
96 | for (k = 0; k < N; k++) { |
---|
97 | if (eta[k] > eps) { |
---|
98 | #ifndef REARRANGED_DOMAIN |
---|
99 | k3 = 3 * k; |
---|
100 | z0 = zv[k3 + 0]; |
---|
101 | z1 = zv[k3 + 1]; |
---|
102 | z2 = zv[k3 + 2]; |
---|
103 | |
---|
104 | // Compute bed slope |
---|
105 | k6 = 6 * k; // base index |
---|
106 | |
---|
107 | x0 = x[k6 + 0]; |
---|
108 | y0 = x[k6 + 1]; |
---|
109 | x1 = x[k6 + 2]; |
---|
110 | y1 = x[k6 + 3]; |
---|
111 | x2 = x[k6 + 4]; |
---|
112 | y2 = x[k6 + 5]; |
---|
113 | #else |
---|
114 | z0 = zv[k]; |
---|
115 | z1 = zv[k + N]; |
---|
116 | z2 = zv[k + 2*N]; |
---|
117 | |
---|
118 | // Compute bed slope |
---|
119 | x0 = x[k]; |
---|
120 | y0 = x[k + N]; |
---|
121 | x1 = x[k + 2*N]; |
---|
122 | y1 = x[k + 3*N]; |
---|
123 | x2 = x[k + 4*N]; |
---|
124 | y2 = x[k + 5*N]; |
---|
125 | #endif |
---|
126 | |
---|
127 | //_gradient(x0, y0, x1, y1, x2, y2, z0, z1, z2, &zx, &zy); |
---|
128 | det = (y2-y0)*(x1-x0) - (y1-y0)*(x2-x0); |
---|
129 | |
---|
130 | zx = (y2-y0)*(z1-z0) - (y1-y0)*(z2-z0); |
---|
131 | zx /= det; |
---|
132 | |
---|
133 | zy = (x1-x0)*(z2-z0) - (x2-x0)*(z1-z0); |
---|
134 | zy /= det; |
---|
135 | |
---|
136 | |
---|
137 | zs = sqrt(1.0 + zx * zx + zy * zy); |
---|
138 | z = (z0 + z1 + z2) / 3.0; |
---|
139 | h = w[k] - z; |
---|
140 | if (h >= eps) { |
---|
141 | S =-g *eta[k] *eta[k] *zs *sqrt((uh[k] *uh[k] + vh[k] * vh[k])); |
---|
142 | S /= pow(h, 7.0 / 3); //Expensive (on Ole's home computer) |
---|
143 | //S /= exp((7.0/3.0)*log(h)); |
---|
144 | //seems to save about 15% over manning_friction |
---|
145 | //S /= h*h*(1 + h/3.0 - h*h/9.0); |
---|
146 | //FIXME: Could use a Taylor expansion |
---|
147 | |
---|
148 | //Update momentum |
---|
149 | xmom_update[k] += S * uh[k]; |
---|
150 | ymom_update[k] += S * vh[k]; |
---|
151 | } |
---|
152 | } |
---|
153 | } |
---|
154 | } |
---|