source: codes/icosagcm/devel/src/kernels_unst/coriolis.k90 @ 683

Last change on this file since 683 was 683, checked in by dubos, 6 years ago

devel/unstructured : cleanup

File size: 9.1 KB
Line 
1   !--------------------------------------------------------------------------
2   !---------------------------- coriolis ----------------------------------
3   !
4   DO iq=1,nqdyn
5      !$OMP DO SCHEDULE(STATIC)
6      DO edge = 1, edge_num
7         ij_left = left(edge)
8         ij_right = right(edge)
9         !DIR$ SIMD
10         DO l = 1, llm
11            Ftheta(l,edge) = .5*(theta(l,ij_left,iq)+theta(l,ij_right,iq))*hflux(l,edge)
12         END DO
13      END DO
14      !$OMP END DO
15      !$OMP DO SCHEDULE(STATIC)
16      DO ij = 1, primal_num
17         ! this VLOOP iterates over primal cell edges
18         SELECT CASE(primal_deg(ij))
19         CASE(4)
20            edge1 = primal_edge(1,ij)
21            edge2 = primal_edge(2,ij)
22            edge3 = primal_edge(3,ij)
23            edge4 = primal_edge(4,ij)
24            sign1 = primal_ne(1,ij)
25            sign2 = primal_ne(2,ij)
26            sign3 = primal_ne(3,ij)
27            sign4 = primal_ne(4,ij)
28            !DIR$ SIMD
29            DO l = 1, llm
30               divF=0.
31               divF = divF + Ftheta(l,edge1)*sign1
32               divF = divF + Ftheta(l,edge2)*sign2
33               divF = divF + Ftheta(l,edge3)*sign3
34               divF = divF + Ftheta(l,edge4)*sign4
35               dtheta_rhodz(l,ij,iq) = -divF / Ai(ij)
36            END DO
37         CASE(5)
38            edge1 = primal_edge(1,ij)
39            edge2 = primal_edge(2,ij)
40            edge3 = primal_edge(3,ij)
41            edge4 = primal_edge(4,ij)
42            edge5 = primal_edge(5,ij)
43            sign1 = primal_ne(1,ij)
44            sign2 = primal_ne(2,ij)
45            sign3 = primal_ne(3,ij)
46            sign4 = primal_ne(4,ij)
47            sign5 = primal_ne(5,ij)
48            !DIR$ SIMD
49            DO l = 1, llm
50               divF=0.
51               divF = divF + Ftheta(l,edge1)*sign1
52               divF = divF + Ftheta(l,edge2)*sign2
53               divF = divF + Ftheta(l,edge3)*sign3
54               divF = divF + Ftheta(l,edge4)*sign4
55               divF = divF + Ftheta(l,edge5)*sign5
56               dtheta_rhodz(l,ij,iq) = -divF / Ai(ij)
57            END DO
58         CASE(6)
59            edge1 = primal_edge(1,ij)
60            edge2 = primal_edge(2,ij)
61            edge3 = primal_edge(3,ij)
62            edge4 = primal_edge(4,ij)
63            edge5 = primal_edge(5,ij)
64            edge6 = primal_edge(6,ij)
65            sign1 = primal_ne(1,ij)
66            sign2 = primal_ne(2,ij)
67            sign3 = primal_ne(3,ij)
68            sign4 = primal_ne(4,ij)
69            sign5 = primal_ne(5,ij)
70            sign6 = primal_ne(6,ij)
71            !DIR$ SIMD
72            DO l = 1, llm
73               divF=0.
74               divF = divF + Ftheta(l,edge1)*sign1
75               divF = divF + Ftheta(l,edge2)*sign2
76               divF = divF + Ftheta(l,edge3)*sign3
77               divF = divF + Ftheta(l,edge4)*sign4
78               divF = divF + Ftheta(l,edge5)*sign5
79               divF = divF + Ftheta(l,edge6)*sign6
80               dtheta_rhodz(l,ij,iq) = -divF / Ai(ij)
81            END DO
82         CASE DEFAULT
83            !DIR$ SIMD
84            DO l = 1, llm
85               divF=0.
86               DO iedge = 1, primal_deg(ij)
87                  edge = primal_edge(iedge,ij)
88                  divF = divF + Ftheta(l,edge)*primal_ne(iedge,ij)
89               END DO
90               dtheta_rhodz(l,ij,iq) = -divF / Ai(ij)
91            END DO
92         END SELECT
93      END DO
94      !$OMP END DO
95   END DO ! iq
96   !
97   !$OMP DO SCHEDULE(STATIC)
98   DO ij = 1, primal_num
99      ! this VLOOP iterates over primal cell edges
100      SELECT CASE(primal_deg(ij))
101      CASE(4)
102         edge1 = primal_edge(1,ij)
103         edge2 = primal_edge(2,ij)
104         edge3 = primal_edge(3,ij)
105         edge4 = primal_edge(4,ij)
106         sign1 = primal_ne(1,ij)
107         sign2 = primal_ne(2,ij)
108         sign3 = primal_ne(3,ij)
109         sign4 = primal_ne(4,ij)
110         !DIR$ SIMD
111         DO l = 1, llm
112            divF=0.
113            divF = divF + hflux(l,edge1)*sign1
114            divF = divF + hflux(l,edge2)*sign2
115            divF = divF + hflux(l,edge3)*sign3
116            divF = divF + hflux(l,edge4)*sign4
117            convm(l,ij) = -divF / Ai(ij)
118         END DO
119      CASE(5)
120         edge1 = primal_edge(1,ij)
121         edge2 = primal_edge(2,ij)
122         edge3 = primal_edge(3,ij)
123         edge4 = primal_edge(4,ij)
124         edge5 = primal_edge(5,ij)
125         sign1 = primal_ne(1,ij)
126         sign2 = primal_ne(2,ij)
127         sign3 = primal_ne(3,ij)
128         sign4 = primal_ne(4,ij)
129         sign5 = primal_ne(5,ij)
130         !DIR$ SIMD
131         DO l = 1, llm
132            divF=0.
133            divF = divF + hflux(l,edge1)*sign1
134            divF = divF + hflux(l,edge2)*sign2
135            divF = divF + hflux(l,edge3)*sign3
136            divF = divF + hflux(l,edge4)*sign4
137            divF = divF + hflux(l,edge5)*sign5
138            convm(l,ij) = -divF / Ai(ij)
139         END DO
140      CASE(6)
141         edge1 = primal_edge(1,ij)
142         edge2 = primal_edge(2,ij)
143         edge3 = primal_edge(3,ij)
144         edge4 = primal_edge(4,ij)
145         edge5 = primal_edge(5,ij)
146         edge6 = primal_edge(6,ij)
147         sign1 = primal_ne(1,ij)
148         sign2 = primal_ne(2,ij)
149         sign3 = primal_ne(3,ij)
150         sign4 = primal_ne(4,ij)
151         sign5 = primal_ne(5,ij)
152         sign6 = primal_ne(6,ij)
153         !DIR$ SIMD
154         DO l = 1, llm
155            divF=0.
156            divF = divF + hflux(l,edge1)*sign1
157            divF = divF + hflux(l,edge2)*sign2
158            divF = divF + hflux(l,edge3)*sign3
159            divF = divF + hflux(l,edge4)*sign4
160            divF = divF + hflux(l,edge5)*sign5
161            divF = divF + hflux(l,edge6)*sign6
162            convm(l,ij) = -divF / Ai(ij)
163         END DO
164      CASE DEFAULT
165         !DIR$ SIMD
166         DO l = 1, llm
167            divF=0.
168            DO iedge = 1, primal_deg(ij)
169               edge = primal_edge(iedge,ij)
170               divF = divF + hflux(l,edge)*primal_ne(iedge,ij)
171            END DO
172            convm(l,ij) = -divF / Ai(ij)
173         END DO
174      END SELECT
175   END DO
176   !$OMP END DO
177   !
178   !$OMP DO SCHEDULE(STATIC)
179   DO edge = 1, edge_num
180      ! this VLOOP iterates over the TRISK stencil
181      SELECT CASE(trisk_deg(edge))
182      CASE(4)
183         !DIR$ SIMD
184         DO l = 1, llm
185            du_trisk=0.
186            itrisk = 1
187            edge_trisk = trisk(1,edge)
188            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
189            itrisk = 2
190            edge_trisk = trisk(2,edge)
191            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
192            itrisk = 3
193            edge_trisk = trisk(3,edge)
194            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
195            itrisk = 4
196            edge_trisk = trisk(4,edge)
197            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
198            du(l,edge) = du(l,edge) + .5*du_trisk
199         END DO
200      CASE(10)
201         !DIR$ SIMD
202         DO l = 1, llm
203            du_trisk=0.
204            itrisk = 1
205            edge_trisk = trisk(1,edge)
206            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
207            itrisk = 2
208            edge_trisk = trisk(2,edge)
209            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
210            itrisk = 3
211            edge_trisk = trisk(3,edge)
212            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
213            itrisk = 4
214            edge_trisk = trisk(4,edge)
215            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
216            itrisk = 5
217            edge_trisk = trisk(5,edge)
218            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
219            itrisk = 6
220            edge_trisk = trisk(6,edge)
221            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
222            itrisk = 7
223            edge_trisk = trisk(7,edge)
224            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
225            itrisk = 8
226            edge_trisk = trisk(8,edge)
227            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
228            itrisk = 9
229            edge_trisk = trisk(9,edge)
230            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
231            itrisk = 10
232            edge_trisk = trisk(10,edge)
233            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
234            du(l,edge) = du(l,edge) + .5*du_trisk
235         END DO
236      CASE DEFAULT
237         !DIR$ SIMD
238         DO l = 1, llm
239            du_trisk=0.
240            DO itrisk = 1, trisk_deg(edge)
241               edge_trisk = trisk(itrisk,edge)
242               du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk))
243            END DO
244            du(l,edge) = du(l,edge) + .5*du_trisk
245         END DO
246      END SELECT
247   END DO
248   !$OMP END DO
249   !---------------------------- coriolis ----------------------------------
250   !--------------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.