Changeset 650 for codes/icosagcm


Ignore:
Timestamp:
12/22/17 01:35:23 (6 years ago)
Author:
dubos
Message:

devel/unstructured : more loop unrolling

Location:
codes/icosagcm/devel
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/Python/src/macros.jin

    r615 r650  
    1010  
    1111{% macro define(key,val) %}  
    12 {{ flat }}undef {{ key }}  
     12{{ flat }}undef {{ key }} 
    1313{{ flat }}define {{ key }} {{ val }}  
    1414{%- endmacro %} 
     
    2323{{ flat }}define {{ key }} {{ key }}_UNDEFINED_HERE 
    2424{%- endmacro %} 
     25 
     26{% macro cdef(code, key,val) %}  
     27{{ define(key,val) if key in code }} 
     28{%- endmacro %} 
     29 
     30{% macro cundef(code, keys) %}  
     31{% for key in keys %} 
     32{{ undef(key) if key in code }} 
     33{%- endfor %} 
     34{%- endmacro %} 
     35 
    2536 
    2637{% macro dummy() -%} 
  • codes/icosagcm/devel/Python/src/unstructured/macros.jin

    r647 r650  
    8686{%- endmacro %} 
    8787 
     88{# ---------------------- PRELOAD STENCIL INDICES ---------------------- #} 
     89 
     90{% macro get_edges(thecode, mesh,degree) %} 
     91{% for iedge in range(1,degree+1) %}  
     92{{ 'edge%d = %s_edge(%d,ij)'%(iedge,mesh,iedge) if 'EDGE' in thecode }}  
     93{% endfor %} 
     94{% for iedge in range(1,degree+1) %}  
     95{{ 'le_de%d = le_de(edge%d)'%(iedge,iedge) if 'LE_DE' in thecode }}       
     96{% endfor %} 
     97{% for iedge in range(1,degree+1) %}  
     98{{ 'sign%d = %s_ne(%d,ij)'%(iedge,mesh,iedge) if 'SIGN' in thecode }}    
     99{% endfor %} 
     100{% for iedge in range(1,degree+1) %}  
     101{{ 'ij_up%d = up(edge%d)'%(iedge,iedge) if 'VERTEX1' in thecode }} 
     102{% endfor %} 
     103{% for iedge in range(1,degree+1) %}  
     104{{ 'ij_down%d = down(edge%d)'%(iedge,iedge) if 'VERTEX2' in thecode }} 
     105{% endfor %} 
     106{% endmacro %} 
     107 
     108{% macro get_vertices(thecode, mesh,degree) %} 
     109{% for ivertex in range(1,degree+1) %}  
     110{{ 'vertex%d = %s_vertex(%d,ij)'%(ivertex,mesh,ivertex) if 'VERTEX' in thecode }}  
     111{% endfor %} 
     112{% endmacro %} 
     113 
    88114{# ------------------------------ MESHES --------------------------- #} 
    89  
    90 {% macro get_edges(thecode, mesh,degree) %} 
    91 {% for iedge in range(1,degree+1) %}  
    92 {{ 'edge%d = %s_edge(%d,ij)'%(iedge,mesh,iedge) }}  
    93 {% endfor %} 
    94 {% for iedge in range(1,degree+1) %}  
    95 {{ 'le_de%d = le_de(edge%d)'%(iedge,iedge) }}       
    96 {% endfor %} 
    97 {% for iedge in range(1,degree+1) %}  
    98 {{ 'sign%d = %s_ne(%d,ij)'%(iedge,mesh,iedge) }}    
    99 {% endfor %} 
    100 {% for iedge in range(1,degree+1) %}  
    101 {{ 'ij_up%d = up(edge%d)'%(iedge,iedge) if 'VERTEX1' in thecode }} 
    102 {% endfor %} 
    103 {% for iedge in range(1,degree+1) %}  
    104 {{ 'ij_down%d = down(edge%d)'%(iedge,iedge) if 'VERTEX2' in thecode }} 
    105 {% endfor %} 
    106 {% endmacro %} 
    107115 
    108116{# argument 'code' is the body enclosed by ON_XXX ... END_BLOCK ; it takes arguments : mesh,degree=0 #} 
     
    148156SELECT CASE(dual_deg(ij)) 
    149157CASE(3) 
     158{{ get_edges(thecode, mesh, 3) }} 
     159{{ get_vertices(thecode,mesh,3) }} 
    150160{{ vloop(mesh, lrange, flags, code, 3) }} 
    151161CASE(4) 
     162{{ get_edges(thecode, mesh, 4) }} 
     163{{ get_vertices(thecode,mesh,4) }} 
    152164{{ vloop(mesh, lrange, flags, code, 4) }} 
    153165CASE DEFAULT 
     
    243255{% set thecode = caller(mesh) %} 
    244256{{ define('EDGE', 'l,edge') }} 
    245 {{ define('LE_DE', 'le_de(edge)') }} 
    246 {{ define('SIGN', '1.') }} 
    247 {{ define('CELL1', 'l,ij_left') }} 
    248 {{ define('CELL2',  'l,ij_right') }} 
    249 {{ define('VERTEX1', 'l,ij_down') }} 
    250 {{ define('VERTEX2', 'l,ij_up') }} 
     257{{ cdef(thecode, 'LE_DE', 'le_de(edge)') }} 
     258{{ cdef(thecode, 'SIGN', '1.') }} 
     259{{ cdef(thecode, 'CELL1', 'l,ij_left') }} 
     260{{ cdef(thecode, 'CELL2',  'l,ij_right') }} 
     261{{ cdef(thecode, 'VERTEX1', 'l,ij_down') }} 
     262{{ cdef(thecode, 'VERTEX2', 'l,ij_up') }} 
    251263!$OMP DO SCHEDULE(STATIC) 
    252264DO edge = 1, edge_num 
     
    258270END DO 
    259271!$OMP END DO 
    260 {{ undef('EDGE') }} 
    261 {{ undef('LE_DE') }} 
    262 {{ undef('SIGN') }} 
    263 {{ undef('CELL1') }} 
    264 {{ undef('CELL2') }} 
    265 {{ undef('VERTEX1') }} 
    266 {{ undef('VERTEX2') }} 
     272{{ cundef(thecode, ('EDGE','LE_DE','SIGN','CELL1','CELL2','VERTEX1','VERTEX2') ) }} 
    267273{%- endmacro %} 
    268274 
     
    272278{% if degree>1 %} 
    273279{% for iedge in range(1,degree+1) %} 
    274 {{ define('EDGE', 'l,edge%d'%iedge) }} 
    275 {{ define('SIGN', 'sign%d'%iedge) }} 
    276 {{ define('LE_DE', 'le_de%d'%iedge) }} 
    277 {{ define('VERTEX1', 'l,ij_up%d'%iedge) }} 
    278 {{ define('VERTEX2', 'l,ij_down%d'%iedge) }} 
     280{{ cdef(thecode, 'EDGE', 'l,edge%d'%iedge) }} 
     281{{ cdef(thecode, 'SIGN', 'sign%d'%iedge) }} 
     282{{ cdef(thecode, 'LE_DE', 'le_de%d'%iedge) }} 
     283{{ cdef(thecode, 'VERTEX1', 'l,ij_up%d'%iedge) }} 
     284{{ cdef(thecode, 'VERTEX2', 'l,ij_down%d'%iedge) }} 
    279285  {{ thecode }} 
    280286{% endfor %} 
    281287{% else %} 
    282 {{ define('EDGE', 'l,edge') }} 
    283 {{ define('SIGN', mesh + '_ne(iedge,ij)') }} 
    284 {{ define('LE_DE', 'le_de(edge)') }} 
    285 {{ define('VERTEX1', 'l,ij_up') }} 
    286 {{ define('VERTEX2', 'l,ij_down') }} 
     288{{ cdef(thecode, 'EDGE', 'l,edge') }} 
     289{{ cdef(thecode, 'SIGN', mesh + '_ne(iedge,ij)') }} 
     290{{ cdef(thecode, 'LE_DE', 'le_de(edge)') }} 
     291{{ cdef(thecode, 'VERTEX1', 'l,ij_up') }} 
     292{{ cdef(thecode, 'VERTEX2', 'l,ij_down') }} 
    287293DO iedge = 1, {{ mesh }}_deg(ij) 
    288294  edge = {{ mesh }}_edge(iedge,ij) 
     
    292298END DO 
    293299{% endif %} 
    294  
    295 {{ undef('EDGE') }} 
    296 {{ undef('SIGN') }} 
    297 {{ undef('LE_DE') }} 
    298 {{ undef('VERTEX1') }} 
    299 {{ undef('VERTEX2') }} 
     300{{ cundef(thecode, ('EDGE', 'SIGN', 'LE_DE', 'VERTEX1', 'VERTEX2') ) }} 
    300301{%- endmacro %} 
    301302 
     
    320321{% macro forall_vertices(mesh,degree) -%} 
    321322{% set thecode = caller() %} 
    322 {{ define('VERTEX', 'l,vertex') }} 
    323323{% if degree>1 %} 
    324324{% for ivertex in range(1,degree+1) %} 
    325   ivertex = {{ ivertex }} 
    326   vertex = {{ mesh }}_vertex({{ ivertex }},ij)  
     325{{ define('RIV2', 'Riv2(%d,ij)'%ivertex ) }} 
     326{{ define('VERTEX', 'l,vertex%d'%ivertex ) }} 
    327327  {{ thecode }} 
    328328{% endfor %} 
    329329{% else %} 
     330{{ define('RIV2', 'Riv2(ivertex,ij)') }} 
     331{{ define('VERTEX', 'l,vertex') }} 
    330332DO ivertex = 1, {{ mesh }}_deg(ij) 
    331333  vertex = {{ mesh }}_vertex(ivertex,ij) 
     
    334336{% endif %} 
    335337{{ undef('VERTEX') }} 
     338{{ undef('RIV2') }} 
    336339{%- endmacro %} 
    337340 
     
    357360#define _FALSE_ (0==1) 
    358361 
    359 #define RIV2 Riv2(ivertex,ij) 
    360362#define AI Ai(ij) 
    361363#define AV Av(ij) 
  • codes/icosagcm/devel/src/unstructured/caldyn_unstructured.F90

    r645 r650  
    88CONTAINS 
    99 
     10#define DBL REAL(C_DOUBLE) 
     11 
    1012#define INDICES1 ij,l,iq,iedge,edge,ivertex,vertex,ij_left,ij_right 
    1113#define INDICES2 ij_up,ij_down,itrisk,edge_trisk,kup,kdown 
     14#define EDGES edge1,edge2,edge3,edge4,edge5,edge6 
     15#define VERTICES vertex1,vertex2,vertex3,vertex4,vertex5,vertex6 
     16#define SIGNS sign1,sign2,sign3,sign4,sign5,sign6 
     17#define EDGE_ENDS ij_up1,ij_up2,ij_up3,ij_up4,ij_up5,ij_up6,ij_down1,ij_down2,ij_down3,ij_down4,ij_down5,ij_down6 
     18#define LENGTHS le_de1,le_de2,le_de3,le_de4,le_de5,le_de6 
    1219#define DECLARE_INDICES INTEGER INDICES1,INDICES2 
     20#define DECLARE_EDGES DBL SIGNS,LENGTHS ; INTEGER EDGES, EDGE_ENDS 
     21#define DECLARE_VERTICES INTEGER VERTICES 
    1322#define PHI_BOT(ij) Phi_bot 
    1423#define PHI_BOT_VAR 0. 
     
    1726#define BINDC(thename) BINDC_(dynamico_ ## thename) 
    1827 
    19 #define DBL REAL(C_DOUBLE) 
    2028#define DOUBLE1(m) DBL, DIMENSION(m) 
    2129#define DOUBLE2(m,n) DBL, DIMENSION(m,n) 
     
    4957  FIELD_UL     :: DePhil, v_el, G_el, F_el ! LOCAL 
    5058  DECLARE_INDICES 
     59  DECLARE_EDGES 
    5160  DBL :: W_el, W2_el, gPhi2, dP, divG, u2, uu 
    5261#include "../kernels_unst/caldyn_slow_NH.k90" 
     
    9099  FIELD_U     :: u,hflux,du ! IN, OUT, OUT 
    91100  DECLARE_INDICES 
     101  DECLARE_EDGES 
    92102  LOGICAL, PARAMETER :: zero=.TRUE. 
    93103  DBL :: ke, uu 
     
    118128  FIELD_THETA :: theta, dtheta_rhodz 
    119129  DECLARE_INDICES 
     130  DECLARE_EDGES 
    120131  DBL :: divF, du_trisk 
    121132#include "../kernels_unst/coriolis.k90" 
     
    136147  FIELD_Z    :: qv 
    137148  DECLARE_INDICES 
     149  DECLARE_EDGES 
     150  DECLARE_VERTICES 
    138151  DBL :: etav, hv 
    139152#include "../kernels_unst/pvort_only.k90" 
     
    147160  FIELD_U      :: u,du      ! INOUT,INOUT 
    148161  DECLARE_INDICES 
     162  DECLARE_EDGES 
    149163  DBL          :: due 
    150164 
     
    166180  DOUBLE2(llm,edge_num)  :: u 
    167181  DECLARE_INDICES 
     182  DECLARE_EDGES 
    168183  DBL :: div_ij 
    169184  !$OMP PARALLEL NUM_THREADS(nb_threads) 
Note: See TracChangeset for help on using the changeset viewer.