source: codes/icosagcm/devel/src/kernels_unst/div.k90 @ 913

Last change on this file since 913 was 658, checked in by dubos, 7 years ago

devel/unstructured : updated kernels

File size: 3.4 KB
Line 
1   !--------------------------------------------------------------------------
2   !---------------------------- div ----------------------------------
3   !$OMP DO SCHEDULE(STATIC)
4   DO ij = 1, primal_num
5      ! this VLOOP iterates over primal cell edges
6      SELECT CASE(primal_deg(ij))
7      CASE(4)
8         edge1 = primal_edge(1,ij)
9         edge2 = primal_edge(2,ij)
10         edge3 = primal_edge(3,ij)
11         edge4 = primal_edge(4,ij)
12         le_de1 = le_de(edge1)
13         le_de2 = le_de(edge2)
14         le_de3 = le_de(edge3)
15         le_de4 = le_de(edge4)
16         sign1 = primal_ne(1,ij)
17         sign2 = primal_ne(2,ij)
18         sign3 = primal_ne(3,ij)
19         sign4 = primal_ne(4,ij)
20         !DIR$ SIMD
21         DO l = 1, llm
22            div_ij=0.
23            div_ij = div_ij + sign1*le_de1*u(l,edge1)
24            div_ij = div_ij + sign2*le_de2*u(l,edge2)
25            div_ij = div_ij + sign3*le_de3*u(l,edge3)
26            div_ij = div_ij + sign4*le_de4*u(l,edge4)
27            divu(l,ij) = div_ij / Ai(ij)
28         END DO
29      CASE(5)
30         edge1 = primal_edge(1,ij)
31         edge2 = primal_edge(2,ij)
32         edge3 = primal_edge(3,ij)
33         edge4 = primal_edge(4,ij)
34         edge5 = primal_edge(5,ij)
35         le_de1 = le_de(edge1)
36         le_de2 = le_de(edge2)
37         le_de3 = le_de(edge3)
38         le_de4 = le_de(edge4)
39         le_de5 = le_de(edge5)
40         sign1 = primal_ne(1,ij)
41         sign2 = primal_ne(2,ij)
42         sign3 = primal_ne(3,ij)
43         sign4 = primal_ne(4,ij)
44         sign5 = primal_ne(5,ij)
45         !DIR$ SIMD
46         DO l = 1, llm
47            div_ij=0.
48            div_ij = div_ij + sign1*le_de1*u(l,edge1)
49            div_ij = div_ij + sign2*le_de2*u(l,edge2)
50            div_ij = div_ij + sign3*le_de3*u(l,edge3)
51            div_ij = div_ij + sign4*le_de4*u(l,edge4)
52            div_ij = div_ij + sign5*le_de5*u(l,edge5)
53            divu(l,ij) = div_ij / Ai(ij)
54         END DO
55      CASE(6)
56         edge1 = primal_edge(1,ij)
57         edge2 = primal_edge(2,ij)
58         edge3 = primal_edge(3,ij)
59         edge4 = primal_edge(4,ij)
60         edge5 = primal_edge(5,ij)
61         edge6 = primal_edge(6,ij)
62         le_de1 = le_de(edge1)
63         le_de2 = le_de(edge2)
64         le_de3 = le_de(edge3)
65         le_de4 = le_de(edge4)
66         le_de5 = le_de(edge5)
67         le_de6 = le_de(edge6)
68         sign1 = primal_ne(1,ij)
69         sign2 = primal_ne(2,ij)
70         sign3 = primal_ne(3,ij)
71         sign4 = primal_ne(4,ij)
72         sign5 = primal_ne(5,ij)
73         sign6 = primal_ne(6,ij)
74         !DIR$ SIMD
75         DO l = 1, llm
76            div_ij=0.
77            div_ij = div_ij + sign1*le_de1*u(l,edge1)
78            div_ij = div_ij + sign2*le_de2*u(l,edge2)
79            div_ij = div_ij + sign3*le_de3*u(l,edge3)
80            div_ij = div_ij + sign4*le_de4*u(l,edge4)
81            div_ij = div_ij + sign5*le_de5*u(l,edge5)
82            div_ij = div_ij + sign6*le_de6*u(l,edge6)
83            divu(l,ij) = div_ij / Ai(ij)
84         END DO
85      CASE DEFAULT
86         !DIR$ SIMD
87         DO l = 1, llm
88            div_ij=0.
89            DO iedge = 1, primal_deg(ij)
90               edge = primal_edge(iedge,ij)
91               div_ij = div_ij + primal_ne(iedge,ij)*le_de(edge)*u(l,edge)
92            END DO
93            divu(l,ij) = div_ij / Ai(ij)
94         END DO
95      END SELECT
96   END DO
97   !$OMP END DO
98   !---------------------------- div ----------------------------------
99   !--------------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.