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/caldyn_slow_NH.k90

    r614 r658  
    77      l=1 
    88      w_il(l,ij) = 2.*W(l,ij)/rhodz(kup,ij) 
     9      !DIR$ SIMD 
    910      DO l = 2, llm 
    1011         kdown = l-1 
     
    3435      v_el(l,edge) = .5*le_de(edge)*(u(kup,edge)+u(kdown,edge)) ! checked 
    3536      G_el(l,edge) = v_el(l,edge)*W_el - DePhil(l,edge)*W2_el 
     37      !DIR$ SIMD 
    3638      DO l = 2, llm 
    3739         kdown = l-1 
     
    6466   !$OMP DO SCHEDULE(STATIC) 
    6567   DO ij = 1, primal_num 
    66       DO l = 1, llm+1 
    67          gPhi2=0. 
    68          dP=0. 
    69          divG=0 
    70          DO iedge = 1, primal_deg(ij) 
    71             edge = primal_edge(iedge,ij) 
    72             gPhi2 = gPhi2 + le_de(edge)*DePhil(l,edge)**2 
    73             dP = dP + le_de(edge)*DePhil(l,edge)*v_el(l,edge) 
    74             divG = divG + primal_ne(iedge,ij)*G_el(l,edge) ! -div(G_el), G_el already has le_de 
    75          END DO 
    76          gradPhi2(l,ij) = 1./(2.*Ai(ij)) * gPhi2 
    77          dPhi(l,ij) = gradPhi2(l,ij)*w_il(l,ij) - 1./(2.*Ai(ij))*dP 
    78          dW(l,ij) = (-1./Ai(ij))*divG 
    79       END DO 
     68      ! this VLOOP iterates over primal cell edges 
     69      SELECT CASE(primal_deg(ij)) 
     70      CASE(4) 
     71         edge1 = primal_edge(1,ij) 
     72         edge2 = primal_edge(2,ij) 
     73         edge3 = primal_edge(3,ij) 
     74         edge4 = primal_edge(4,ij) 
     75         le_de1 = le_de(edge1) 
     76         le_de2 = le_de(edge2) 
     77         le_de3 = le_de(edge3) 
     78         le_de4 = le_de(edge4) 
     79         sign1 = primal_ne(1,ij) 
     80         sign2 = primal_ne(2,ij) 
     81         sign3 = primal_ne(3,ij) 
     82         sign4 = primal_ne(4,ij) 
     83         !DIR$ SIMD 
     84         DO l = 1, llm+1 
     85            gPhi2=0. 
     86            dP=0. 
     87            divG=0 
     88            gPhi2 = gPhi2 + le_de1*DePhil(l,edge1)**2 
     89            dP = dP + le_de1*DePhil(l,edge1)*v_el(l,edge1) 
     90            divG = divG + sign1*G_el(l,edge1) ! -div(G_el), G_el already has le_de 
     91            gPhi2 = gPhi2 + le_de2*DePhil(l,edge2)**2 
     92            dP = dP + le_de2*DePhil(l,edge2)*v_el(l,edge2) 
     93            divG = divG + sign2*G_el(l,edge2) ! -div(G_el), G_el already has le_de 
     94            gPhi2 = gPhi2 + le_de3*DePhil(l,edge3)**2 
     95            dP = dP + le_de3*DePhil(l,edge3)*v_el(l,edge3) 
     96            divG = divG + sign3*G_el(l,edge3) ! -div(G_el), G_el already has le_de 
     97            gPhi2 = gPhi2 + le_de4*DePhil(l,edge4)**2 
     98            dP = dP + le_de4*DePhil(l,edge4)*v_el(l,edge4) 
     99            divG = divG + sign4*G_el(l,edge4) ! -div(G_el), G_el already has le_de 
     100            gradPhi2(l,ij) = 1./(2.*Ai(ij)) * gPhi2 
     101            dPhi(l,ij) = gradPhi2(l,ij)*w_il(l,ij) - 1./(2.*Ai(ij))*dP 
     102            dW(l,ij) = (-1./Ai(ij))*divG 
     103         END DO 
     104      CASE(5) 
     105         edge1 = primal_edge(1,ij) 
     106         edge2 = primal_edge(2,ij) 
     107         edge3 = primal_edge(3,ij) 
     108         edge4 = primal_edge(4,ij) 
     109         edge5 = primal_edge(5,ij) 
     110         le_de1 = le_de(edge1) 
     111         le_de2 = le_de(edge2) 
     112         le_de3 = le_de(edge3) 
     113         le_de4 = le_de(edge4) 
     114         le_de5 = le_de(edge5) 
     115         sign1 = primal_ne(1,ij) 
     116         sign2 = primal_ne(2,ij) 
     117         sign3 = primal_ne(3,ij) 
     118         sign4 = primal_ne(4,ij) 
     119         sign5 = primal_ne(5,ij) 
     120         !DIR$ SIMD 
     121         DO l = 1, llm+1 
     122            gPhi2=0. 
     123            dP=0. 
     124            divG=0 
     125            gPhi2 = gPhi2 + le_de1*DePhil(l,edge1)**2 
     126            dP = dP + le_de1*DePhil(l,edge1)*v_el(l,edge1) 
     127            divG = divG + sign1*G_el(l,edge1) ! -div(G_el), G_el already has le_de 
     128            gPhi2 = gPhi2 + le_de2*DePhil(l,edge2)**2 
     129            dP = dP + le_de2*DePhil(l,edge2)*v_el(l,edge2) 
     130            divG = divG + sign2*G_el(l,edge2) ! -div(G_el), G_el already has le_de 
     131            gPhi2 = gPhi2 + le_de3*DePhil(l,edge3)**2 
     132            dP = dP + le_de3*DePhil(l,edge3)*v_el(l,edge3) 
     133            divG = divG + sign3*G_el(l,edge3) ! -div(G_el), G_el already has le_de 
     134            gPhi2 = gPhi2 + le_de4*DePhil(l,edge4)**2 
     135            dP = dP + le_de4*DePhil(l,edge4)*v_el(l,edge4) 
     136            divG = divG + sign4*G_el(l,edge4) ! -div(G_el), G_el already has le_de 
     137            gPhi2 = gPhi2 + le_de5*DePhil(l,edge5)**2 
     138            dP = dP + le_de5*DePhil(l,edge5)*v_el(l,edge5) 
     139            divG = divG + sign5*G_el(l,edge5) ! -div(G_el), G_el already has le_de 
     140            gradPhi2(l,ij) = 1./(2.*Ai(ij)) * gPhi2 
     141            dPhi(l,ij) = gradPhi2(l,ij)*w_il(l,ij) - 1./(2.*Ai(ij))*dP 
     142            dW(l,ij) = (-1./Ai(ij))*divG 
     143         END DO 
     144      CASE(6) 
     145         edge1 = primal_edge(1,ij) 
     146         edge2 = primal_edge(2,ij) 
     147         edge3 = primal_edge(3,ij) 
     148         edge4 = primal_edge(4,ij) 
     149         edge5 = primal_edge(5,ij) 
     150         edge6 = primal_edge(6,ij) 
     151         le_de1 = le_de(edge1) 
     152         le_de2 = le_de(edge2) 
     153         le_de3 = le_de(edge3) 
     154         le_de4 = le_de(edge4) 
     155         le_de5 = le_de(edge5) 
     156         le_de6 = le_de(edge6) 
     157         sign1 = primal_ne(1,ij) 
     158         sign2 = primal_ne(2,ij) 
     159         sign3 = primal_ne(3,ij) 
     160         sign4 = primal_ne(4,ij) 
     161         sign5 = primal_ne(5,ij) 
     162         sign6 = primal_ne(6,ij) 
     163         !DIR$ SIMD 
     164         DO l = 1, llm+1 
     165            gPhi2=0. 
     166            dP=0. 
     167            divG=0 
     168            gPhi2 = gPhi2 + le_de1*DePhil(l,edge1)**2 
     169            dP = dP + le_de1*DePhil(l,edge1)*v_el(l,edge1) 
     170            divG = divG + sign1*G_el(l,edge1) ! -div(G_el), G_el already has le_de 
     171            gPhi2 = gPhi2 + le_de2*DePhil(l,edge2)**2 
     172            dP = dP + le_de2*DePhil(l,edge2)*v_el(l,edge2) 
     173            divG = divG + sign2*G_el(l,edge2) ! -div(G_el), G_el already has le_de 
     174            gPhi2 = gPhi2 + le_de3*DePhil(l,edge3)**2 
     175            dP = dP + le_de3*DePhil(l,edge3)*v_el(l,edge3) 
     176            divG = divG + sign3*G_el(l,edge3) ! -div(G_el), G_el already has le_de 
     177            gPhi2 = gPhi2 + le_de4*DePhil(l,edge4)**2 
     178            dP = dP + le_de4*DePhil(l,edge4)*v_el(l,edge4) 
     179            divG = divG + sign4*G_el(l,edge4) ! -div(G_el), G_el already has le_de 
     180            gPhi2 = gPhi2 + le_de5*DePhil(l,edge5)**2 
     181            dP = dP + le_de5*DePhil(l,edge5)*v_el(l,edge5) 
     182            divG = divG + sign5*G_el(l,edge5) ! -div(G_el), G_el already has le_de 
     183            gPhi2 = gPhi2 + le_de6*DePhil(l,edge6)**2 
     184            dP = dP + le_de6*DePhil(l,edge6)*v_el(l,edge6) 
     185            divG = divG + sign6*G_el(l,edge6) ! -div(G_el), G_el already has le_de 
     186            gradPhi2(l,ij) = 1./(2.*Ai(ij)) * gPhi2 
     187            dPhi(l,ij) = gradPhi2(l,ij)*w_il(l,ij) - 1./(2.*Ai(ij))*dP 
     188            dW(l,ij) = (-1./Ai(ij))*divG 
     189         END DO 
     190      CASE DEFAULT 
     191         !DIR$ SIMD 
     192         DO l = 1, llm+1 
     193            gPhi2=0. 
     194            dP=0. 
     195            divG=0 
     196            DO iedge = 1, primal_deg(ij) 
     197               edge = primal_edge(iedge,ij) 
     198               gPhi2 = gPhi2 + le_de(edge)*DePhil(l,edge)**2 
     199               dP = dP + le_de(edge)*DePhil(l,edge)*v_el(l,edge) 
     200               divG = divG + primal_ne(iedge,ij)*G_el(l,edge) ! -div(G_el), G_el already has le_de 
     201            END DO 
     202            gradPhi2(l,ij) = 1./(2.*Ai(ij)) * gPhi2 
     203            dPhi(l,ij) = gradPhi2(l,ij)*w_il(l,ij) - 1./(2.*Ai(ij))*dP 
     204            dW(l,ij) = (-1./Ai(ij))*divG 
     205         END DO 
     206      END SELECT 
    80207   END DO 
    81208   !$OMP END DO 
     
    85212   !$OMP DO SCHEDULE(STATIC) 
    86213   DO ij = 1, primal_num 
    87       DO l = 1, llm 
    88          u2=0. 
    89          DO iedge = 1, primal_deg(ij) 
    90             edge = primal_edge(iedge,ij) 
    91             u2 = u2 + le_de(edge)*u(l,edge)**2 
    92          END DO 
    93          berni(l,ij) = 1./(4.*Ai(ij)) * u2 - .25*( gradPhi2(l,ij)*w_il(l,ij)**2 + gradPhi2(l+1,ij)*w_il(l+1,ij)**2 ) 
    94       END DO 
     214      ! this VLOOP iterates over primal cell edges 
     215      SELECT CASE(primal_deg(ij)) 
     216      CASE(4) 
     217         edge1 = primal_edge(1,ij) 
     218         edge2 = primal_edge(2,ij) 
     219         edge3 = primal_edge(3,ij) 
     220         edge4 = primal_edge(4,ij) 
     221         le_de1 = le_de(edge1) 
     222         le_de2 = le_de(edge2) 
     223         le_de3 = le_de(edge3) 
     224         le_de4 = le_de(edge4) 
     225         !DIR$ SIMD 
     226         DO l = 1, llm 
     227            u2=0. 
     228            u2 = u2 + le_de1*u(l,edge1)**2 
     229            u2 = u2 + le_de2*u(l,edge2)**2 
     230            u2 = u2 + le_de3*u(l,edge3)**2 
     231            u2 = u2 + le_de4*u(l,edge4)**2 
     232            berni(l,ij) = 1./(4.*Ai(ij)) * u2 - .25*( gradPhi2(l,ij)*w_il(l,ij)**2 + gradPhi2(l+1,ij)*w_il(l+1,ij)**2 ) 
     233         END DO 
     234      CASE(5) 
     235         edge1 = primal_edge(1,ij) 
     236         edge2 = primal_edge(2,ij) 
     237         edge3 = primal_edge(3,ij) 
     238         edge4 = primal_edge(4,ij) 
     239         edge5 = primal_edge(5,ij) 
     240         le_de1 = le_de(edge1) 
     241         le_de2 = le_de(edge2) 
     242         le_de3 = le_de(edge3) 
     243         le_de4 = le_de(edge4) 
     244         le_de5 = le_de(edge5) 
     245         !DIR$ SIMD 
     246         DO l = 1, llm 
     247            u2=0. 
     248            u2 = u2 + le_de1*u(l,edge1)**2 
     249            u2 = u2 + le_de2*u(l,edge2)**2 
     250            u2 = u2 + le_de3*u(l,edge3)**2 
     251            u2 = u2 + le_de4*u(l,edge4)**2 
     252            u2 = u2 + le_de5*u(l,edge5)**2 
     253            berni(l,ij) = 1./(4.*Ai(ij)) * u2 - .25*( gradPhi2(l,ij)*w_il(l,ij)**2 + gradPhi2(l+1,ij)*w_il(l+1,ij)**2 ) 
     254         END DO 
     255      CASE(6) 
     256         edge1 = primal_edge(1,ij) 
     257         edge2 = primal_edge(2,ij) 
     258         edge3 = primal_edge(3,ij) 
     259         edge4 = primal_edge(4,ij) 
     260         edge5 = primal_edge(5,ij) 
     261         edge6 = primal_edge(6,ij) 
     262         le_de1 = le_de(edge1) 
     263         le_de2 = le_de(edge2) 
     264         le_de3 = le_de(edge3) 
     265         le_de4 = le_de(edge4) 
     266         le_de5 = le_de(edge5) 
     267         le_de6 = le_de(edge6) 
     268         !DIR$ SIMD 
     269         DO l = 1, llm 
     270            u2=0. 
     271            u2 = u2 + le_de1*u(l,edge1)**2 
     272            u2 = u2 + le_de2*u(l,edge2)**2 
     273            u2 = u2 + le_de3*u(l,edge3)**2 
     274            u2 = u2 + le_de4*u(l,edge4)**2 
     275            u2 = u2 + le_de5*u(l,edge5)**2 
     276            u2 = u2 + le_de6*u(l,edge6)**2 
     277            berni(l,ij) = 1./(4.*Ai(ij)) * u2 - .25*( gradPhi2(l,ij)*w_il(l,ij)**2 + gradPhi2(l+1,ij)*w_il(l+1,ij)**2 ) 
     278         END DO 
     279      CASE DEFAULT 
     280         !DIR$ SIMD 
     281         DO l = 1, llm 
     282            u2=0. 
     283            DO iedge = 1, primal_deg(ij) 
     284               edge = primal_edge(iedge,ij) 
     285               u2 = u2 + le_de(edge)*u(l,edge)**2 
     286            END DO 
     287            berni(l,ij) = 1./(4.*Ai(ij)) * u2 - .25*( gradPhi2(l,ij)*w_il(l,ij)**2 + gradPhi2(l+1,ij)*w_il(l+1,ij)**2 ) 
     288         END DO 
     289      END SELECT 
    95290   END DO 
    96291   !$OMP END DO 
     
    99294      ij_left = left(edge) 
    100295      ij_right = right(edge) 
     296      !DIR$ SIMD 
    101297      DO l = 1, llm 
    102298         ! Compute mass flux and grad(berni) 
Note: See TracChangeset for help on using the changeset viewer.