Changeset 644
- Timestamp:
- 12/20/17 15:40:06 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/Python/src/unstructured/macros.jin
r615 r644 14 14 #define FORALL_CELLS(...) {% call(lrange,flags) forall_cells(__VA_ARGS__) %} 15 15 #define FORALL_CELLS_EXT(...) {% call(lrange,flags) forall_cells(__VA_ARGS__) %} 16 #define ON_PRIMAL {% call(mesh, lrange) on_mesh('primal',lrange,flags) %}17 #define ON_DUAL {% call(mesh, lrange) on_mesh('dual',lrange,flags) %}18 #define ON_EDGES {% call(mesh, lrange) on_edges('edge',lrange,flags) %}19 #define FORALL_EDGES {% call forall_edges(mesh ) %}20 #define FORALL_VERTICES {% call forall_vertices(mesh ) %}21 #define FORALL_TRISK {% call forall_trisk( ) %}16 #define ON_PRIMAL {% call(mesh, degree=0) on_mesh('primal',lrange,flags) %} 17 #define ON_DUAL {% call(mesh, degree=0) on_mesh('dual',lrange,flags) %} 18 #define ON_EDGES {% call(mesh, degree=0) on_edges('edge',lrange,flags) %} 19 #define FORALL_EDGES {% call forall_edges(mesh,degree) %} 20 #define FORALL_VERTICES {% call forall_vertices(mesh,degree) %} 21 #define FORALL_TRISK {% call forall_trisk(degree) %} 22 22 #define END_BLOCK {% endcall %} 23 23 #define SEQUENCE {% call sequence() %} … … 39 39 {# -------------------------- Design notes ------------------------------ 40 40 41 The syntax 42 {% call(ARGNAMES) macro(ARGS) %} 43 ... 44 {% endcall %} 45 passes ARGS to macro ; this macro "calls" the body using the syntax 'caller(arg1,...)' ; these arguments 46 are available in the body under the names ARGNAMES, as if it were a macro caller(ARGNAMES). 47 41 48 Using its optional argument 'options', forall_cells() sets variable 'flags' 42 49 and passes it on to on_mesh() / on_edges() … … 45 52 46 53 -------------------------------------------------------------------------- #} 54 47 55 48 56 {# ----------------------- SEQUENCE, FORALL ----------------------- #} … … 80 88 {# ------------------------------ MESHES --------------------------- #} 81 89 82 {% macro vloop(mesh, lrange, flags, code) %} 90 {# argument 'code' is the body enclosed by ON_XXX ... END_BLOCK ; it takes arguments : mesh,degree=0 #} 91 92 {% macro vloop_unroll(mesh, lrange, flags, code) %} 93 94 {% set thecode, has_primal, has_dual, has_trisk, has_none = code(mesh), False, False, False, True %} 95 96 {% if 'primal_deg' in thecode %} 97 ! this VLOOP iterates over primal cell edges 98 {% set has_primal, has_none = True,False %} 99 {% endif %} 100 {% if 'dual_deg' in thecode %} 101 ! this VLOOP iterates over dual cell edges 102 {% set has_dual,has_none = True,False %} 103 {% endif %} 104 {% if 'trisk_deg' in thecode %} 105 ! this VLOOP iterates over the TRISK stencil 106 {% set has_trisk,has_none = True,False %} 107 {% endif %} 108 109 {% if has_none %} 110 {{ vloop(mesh, lrange, flags, code) }} 111 {% endif %} 112 113 {% if has_primal %} 114 SELECT CASE(primal_deg(ij)) 115 CASE(4) 116 {{ vloop(mesh, lrange, flags, code, 4) }} 117 CASE(5) 118 {{ vloop(mesh, lrange, flags, code, 5) }} 119 CASE(6) 120 {{ vloop(mesh, lrange, flags, code, 6) }} 121 CASE DEFAULT 122 {{ vloop(mesh, lrange, flags, code) }} 123 END SELECT 124 {% endif %} 125 126 {% if has_dual %} 127 SELECT CASE(dual_deg(ij)) 128 CASE(3) 129 {{ vloop(mesh, lrange, flags, code, 3) }} 130 CASE(4) 131 {{ vloop(mesh, lrange, flags, code, 4) }} 132 CASE DEFAULT 133 {{ vloop(mesh, lrange, flags, code) }} 134 END SELECT 135 {% endif %} 136 137 {% if has_trisk %} 138 SELECT CASE(trisk_deg(edge)) 139 CASE(10) 140 {{ vloop(mesh, lrange, flags, code, 10) }} 141 CASE(4) 142 {{ vloop(mesh, lrange, flags, code, 4) }} 143 CASE DEFAULT 144 {{ vloop(mesh, lrange, flags, code) }} 145 END SELECT 146 {% endif %} 147 148 {%- endmacro %} 149 150 {% macro vloop(mesh, lrange, flags, code, degree=0) %} 151 83 152 {% set start,end = lrange %} 84 {% set thecode, is_top_layer, is_top_inter = code(mesh ), False, False %}153 {% set thecode, is_top_layer, is_top_inter = code(mesh,degree), False, False %} 85 154 86 155 {{ define('IS_TOP_LAYER', '_FALSE_') }} … … 140 209 !$OMP DO SCHEDULE(STATIC) 141 210 DO ij = 1, {{ mesh }}_num 142 {{ vloop (mesh, lrange, flags, caller) }}211 {{ vloop_unroll(mesh, lrange, flags, caller) }} 143 212 END DO 144 213 !$OMP END DO … … 164 233 {{ 'ij_up = up(edge)' if 'VERTEX1' in thecode }} 165 234 {{ 'ij_down = down(edge)' if 'VERTEX2' in thecode }} 166 {{ vloop (mesh, lrange, flags, caller) }}235 {{ vloop_unroll(mesh, lrange, flags, caller) }} 167 236 END DO 168 237 !$OMP END DO … … 176 245 {%- endmacro %} 177 246 178 {% macro forall_edges(mesh ) -%}247 {% macro forall_edges(mesh,degree) -%} 179 248 {% set thecode = caller() %} 180 249 {{ define('EDGE', 'l,edge') }} … … 183 252 {{ define('SIGN', mesh + '_ne(iedge,ij)') }} 184 253 {{ define('LE_DE', 'le_de(edge)') }} 254 255 {% if degree>1 %} 256 {% for iedge in range(1,degree+1) %} 257 iedge = {{ iedge }} 258 edge = {{ mesh }}_edge({{ iedge }},ij) 259 {{ 'ij_up = up(edge)' if 'VERTEX1' in thecode }} 260 {{ 'ij_down = down(edge)' if 'VERTEX2' in thecode }} 261 {{ thecode }} 262 {% endfor %} 263 {% else %} 185 264 DO iedge = 1, {{ mesh }}_deg(ij) 186 265 edge = {{ mesh }}_edge(iedge,ij) 187 {{ 'ij_up = up(edge)' if 'VERTEX1' in thecode }} 188 {{ 'ij_down = down(edge)' if 'VERTEX2' in thecode }} 189 {{ thecode }} 190 END DO 266 {{ 'ij_up = up(edge)' if 'VERTEX1' in thecode }} 267 {{ 'ij_down = down(edge)' if 'VERTEX2' in thecode }} 268 {{ thecode }} 269 END DO 270 {% endif %} 271 191 272 {{ undef('EDGE') }} 192 273 {{ undef('SIGN') }} … … 194 275 {%- endmacro %} 195 276 196 {% macro forall_trisk() -%} 277 {% macro forall_trisk(degree) -%} 278 {% set thecode = caller() %} 197 279 {{ define('EDGE_TRISK', 'l,edge_trisk') }} 280 {% if degree>1 %} 281 {% for itrisk in range(1,degree+1) %} 282 edge_trisk = trisk({{ itrisk }},edge) 283 {{ thecode }} 284 {% endfor %} 285 {% else %} 198 286 DO itrisk = 1, trisk_deg(edge) 199 287 edge_trisk = trisk(itrisk,edge) 200 {{ caller() }} 201 END DO 288 {{ thecode }} 289 END DO 290 {% endif %} 202 291 {{ undef('EDGE_TRISK') }} 203 292 {%- endmacro %} 204 293 205 {% macro forall_vertices(mesh) -%} 294 {% macro forall_vertices(mesh,degree) -%} 295 {% set thecode = caller() %} 206 296 {{ define('VERTEX', 'l,vertex') }} 297 {% if degree>1 %} 298 {% for ivertex in range(1,degree+1) %} 299 ivertex = {{ ivertex }} 300 vertex = {{ mesh }}_vertex({{ ivertex }},ij) 301 {{ thecode }} 302 {% endfor %} 303 {% else %} 207 304 DO ivertex = 1, {{ mesh }}_deg(ij) 208 305 vertex = {{ mesh }}_vertex(ivertex,ij) 209 {{ caller() }} 210 END DO 306 {{ thecode }} 307 END DO 308 {% endif %} 211 309 {{ undef('VERTEX') }} 212 310 {%- endmacro %}
Note: See TracChangeset
for help on using the changeset viewer.