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

Last change on this file since 913 was 784, checked in by jisesh, 6 years ago

devel/unstructured : laplacian operator

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