source: trunk/anuga_work/anuga_cuda/src/anuga_HMPP/protect.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: 3.1 KB
Line 
1//#define USING_MAIN
2
3#ifndef USING_MAIN
4#include "hmpp_fun.h"
5#else
6#include <math.h>
7#endif
8
9//#ifdef USING_MAIN
10#ifdef USING_LOCAL_DIRECTIVES
11#pragma hmpp protectSW codelet, target=CUDA args[*].transfer=atcall
12#endif
13void protect_sw(
14        int N,
15        int N3,
16        double minimum_allowed_height,
17        double maximum_allowed_speed,
18        double epsilon,
19
20        double wc[N],   // stage_centroid_values
21        double zc[N],   // bed_centroid_values
22        double xmomc[N],// xmom_centroid_values
23        double ymomc[N] //ymom_centroid_values
24        )
25{
26    int k;
27    double hc;
28    double u, v, reduced_speed;
29
30
31    // Protect against initesimal and negative heights
32    if (maximum_allowed_speed < epsilon) {
33        #pragma hmppcg gridify(k), &
34        #pragma hmppcg & private( hc, u, v, reduced_speed), &
35        #pragma hmppcg & global( minimum_allowed_height, maximum_allowed_speed, &
36        #pragma hmppcg & epsilon, wc, zc, xmomc, ymomc)
37        for (k = 0; k < N; k++) {
38            hc = wc[k] - zc[k];
39            if (hc < minimum_allowed_height) {
40                // Set momentum to zero and ensure h is non negative
41                xmomc[k] = 0.0;
42                ymomc[k] = 0.0;
43                if (hc <= 0.0) wc[k] = zc[k];
44            }
45        }
46
47    } else {
48        // Protect against initesimal and negative heights
49        #pragma hmppcg gridify(k), &
50        #pragma hmppcg & private( hc, u, v, reduced_speed), &
51        #pragma hmppcg & global( minimum_allowed_height, maximum_allowed_speed, &
52        #pragma hmppcg & epsilon, wc, zc, xmomc, ymomc)
53        for (k = 0; k < N; k++) {
54            hc = wc[k] - zc[k];
55            if (hc < minimum_allowed_height) {
56                //New code: Adjust momentum to guarantee speeds are physical
57                //          ensure h is non negative
58                if (hc <= 0.0) {
59                    wc[k] = zc[k];
60                    xmomc[k] = 0.0;
61                    ymomc[k] = 0.0;
62                } else {
63                    //Reduce excessive speeds derived from division by small hc
64                    //FIXME (Ole): This may be unnecessary with new slope limiters
65                    //in effect.
66
67                    u = xmomc[k] / hc;
68                    if (fabs(u) > maximum_allowed_speed) {
69                        reduced_speed = maximum_allowed_speed * u / fabs(u);
70                        xmomc[k] = reduced_speed * hc;
71                    }
72
73                    v = ymomc[k] / hc;
74                    if (fabs(v) > maximum_allowed_speed) {
75                        reduced_speed = maximum_allowed_speed * v / fabs(v);
76                        ymomc[k] = reduced_speed * hc;
77                    }
78                }
79            }
80        }
81    }
82}
83
84
85
86#ifdef USING_MAIN
87int main()
88#else
89void test_protect_sw()
90#endif
91{
92    int N=4;
93    double minimum_allowed_height=0.001, 
94            maximum_allowed_speed=0, 
95            epsilon=1e-12;
96
97    double  wc[]={1,2,3,4}, 
98            zc[]={1,2,3,4}, 
99            xmomc[]={1,2,3,4}, 
100            ymomc[]={1,2,3,4};
101
102    #pragma hmpp protectSW callsite
103    protect_sw(N, N*3, minimum_allowed_height,
104            maximum_allowed_speed, epsilon, wc, zc, xmomc, ymomc);
105}
Note: See TracBrowser for help on using the repository browser.