Ignore:
Timestamp:
12/30/17 02:00:38 (7 years ago)
Author:
dubos
Message:

devel/unstructured : updated kernels

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/kernels_unst/coriolis.k90

    r614 r658  
    77         ij_left = left(edge) 
    88         ij_right = right(edge) 
     9         !DIR$ SIMD 
    910         DO l = 1, llm 
    1011            Ftheta(l,edge) = .5*(theta(l,ij_left,iq)+theta(l,ij_right,iq))*hflux(l,edge) 
     
    1415      !$OMP DO SCHEDULE(STATIC) 
    1516      DO ij = 1, primal_num 
    16          DO l = 1, llm 
    17             divF=0. 
    18             DO iedge = 1, primal_deg(ij) 
    19                edge = primal_edge(iedge,ij) 
    20                divF = divF + Ftheta(l,edge)*primal_ne(iedge,ij) 
    21             END DO 
    22             dtheta_rhodz(l,ij,iq) = -divF / Ai(ij) 
    23          END DO 
     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 
    2493      END DO 
    2594      !$OMP END DO 
     
    2897   !$OMP DO SCHEDULE(STATIC) 
    2998   DO ij = 1, primal_num 
    30       DO l = 1, llm 
    31          divF=0. 
    32          DO iedge = 1, primal_deg(ij) 
    33             edge = primal_edge(iedge,ij) 
    34             divF = divF + hflux(l,edge)*primal_ne(iedge,ij) 
    35          END DO 
    36          convm(l,ij) = -divF / Ai(ij) 
    37       END DO 
     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 
    38175   END DO 
    39176   !$OMP END DO 
     
    41178   !$OMP DO SCHEDULE(STATIC) 
    42179   DO edge = 1, edge_num 
    43       DO l = 1, llm 
    44          du_trisk=0. 
    45          DO itrisk = 1, trisk_deg(edge) 
    46             edge_trisk = trisk(itrisk,edge) 
    47             du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk)) 
    48          END DO 
    49          du(l,edge) = du(l,edge) + .5*du_trisk 
    50       END DO 
     180      ! this VLOOP iterates over the TRISK stencil 
     181      SELECT CASE(trisk_deg(edge)) 
     182      CASE(10) 
     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            itrisk = 5 
     199            edge_trisk = trisk(5,edge) 
     200            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk)) 
     201            itrisk = 6 
     202            edge_trisk = trisk(6,edge) 
     203            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk)) 
     204            itrisk = 7 
     205            edge_trisk = trisk(7,edge) 
     206            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk)) 
     207            itrisk = 8 
     208            edge_trisk = trisk(8,edge) 
     209            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk)) 
     210            itrisk = 9 
     211            edge_trisk = trisk(9,edge) 
     212            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk)) 
     213            itrisk = 10 
     214            edge_trisk = trisk(10,edge) 
     215            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk)) 
     216            du(l,edge) = du(l,edge) + .5*du_trisk 
     217         END DO 
     218      CASE(4) 
     219         !DIR$ SIMD 
     220         DO l = 1, llm 
     221            du_trisk=0. 
     222            itrisk = 1 
     223            edge_trisk = trisk(1,edge) 
     224            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk)) 
     225            itrisk = 2 
     226            edge_trisk = trisk(2,edge) 
     227            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk)) 
     228            itrisk = 3 
     229            edge_trisk = trisk(3,edge) 
     230            du_trisk = du_trisk + wee(itrisk,edge)*hflux(l,edge_trisk)*(qu(l,edge)+qu(l,edge_trisk)) 
     231            itrisk = 4 
     232            edge_trisk = trisk(4,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 
    51247   END DO 
    52248   !$OMP END DO 
Note: See TracChangeset for help on using the changeset viewer.