source: trunk/anuga_work/anuga_cuda/src/anuga_HMPP/manning_friction.c @ 9329

Last change on this file since 9329 was 9017, checked in by steve, 12 years ago

Adding in Zhe (John) Weng's anuga_cuda code as obtained from googlecode https://code.google.com/p/anuga-cuda

File size: 4.4 KB
Line 
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
8void 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
67void 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}
Note: See TracBrowser for help on using the repository browser.