Changeset 685 for codes/icosagcm/devel
- Timestamp:
- 03/07/18 18:43:51 (6 years ago)
- Location:
- codes/icosagcm/devel/Python/src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/Python/src/hexagonal/macros.jin
r615 r685 41 41 #define FORALL_TRISK {% call(itrisk,edge_trisk) forall_trisk() %} 42 42 #define END_BLOCK {% endcall %} 43 #define SEQUENCE {% call(ext) sequence() %} 44 #define SEQUENCE_EXT {% call(ext) sequence_ext() %} 45 #define PROLOGUE(level) {% call at_level(level,ext) %} 46 #define BODY(range){% call body(range,ext) %} 47 #define EPILOGUE(level){% call at_level(level,ext) %} 43 #define SEQUENCE_C0 {% call(body,at_level,ext) sequence() %} 44 #define SEQUENCE_C1 {% call(body,at_level,ext) sequence_ext() %} 45 #define SEQUENCE_E0 {% call(body,at_level,ext) sequence_edge() %} 46 #define PROLOGUE(level) {% call(edge,neighbour) at_level(level,ext) %} 47 #define BODY(range){% call(edge,neighbour) body(range,ext) %} 48 #define EPILOGUE(level){% call(edge,neighbour) at_level(level,ext) %} 48 49 49 50 #define CST_IF(condition, action) {{ cst_if(#condition, #action) }} … … 58 59 59 60 {% macro sequence() -%} 60 {{ caller( '') }}61 {{ caller(body_primal,at_level_primal,'') }} 61 62 {%- endmacro %} 62 63 63 64 {% macro sequence_ext() -%} 64 {{ caller( '_ext') }}65 {%- endmacro %} 66 67 {% macro at_level (lev,ext) -%}65 {{ caller(body_primal,at_level_primal,'_ext') }} 66 {%- endmacro %} 67 68 {% macro at_level_primal(lev,ext) -%} 68 69 {{ define('LL', lev) }} 69 70 DO ij=ij_omp_begin{{ext}},ij_omp_end{{ext}} … … 72 73 {%- endmacro %} 73 74 74 {% macro body (range,ext) -%}75 {% macro body_primal(range,ext) -%} 75 76 {{ define('LL', 'l') }} 76 77 DO l = {{ range }} 77 78 DO ij=ij_omp_begin{{ext}},ij_omp_end{{ext}} 78 79 {{ caller() }} 80 END DO 81 END DO 82 {%- endmacro %} 83 84 {% macro sequence_edge() -%} 85 {{ caller(body_edge,at_level_edge,'') }} 86 {%- endmacro %} 87 88 {% macro at_level_edge(lev,ext) -%} 89 {{ define('LL', lev) }} 90 DO ij=ij_omp_begin{{ext}},ij_omp_end{{ext}} 91 {{ caller('u_right','t_right') }} 92 {{ caller('u_lup','t_lup') }} 93 {{ caller('u_ldown','t_ldown') }} 94 END DO 95 {%- endmacro %} 96 97 {% macro body_edge(range,ext) -%} 98 {{ define('LL', 'l') }} 99 DO l = {{ range }} 100 DO ij=ij_omp_begin{{ext}},ij_omp_end{{ext}} 101 {{ caller('u_right','t_right') }} 102 {{ caller('u_lup','t_lup') }} 103 {{ caller('u_ldown','t_ldown') }} 79 104 END DO 80 105 END DO … … 272 297 #define HIDX(ij,l) ij 273 298 #define VIDX(ij,l) l 274 #endif 299 #define AT_LEVEL(ij,l,lev) ij,lev 300 #endif -
codes/icosagcm/devel/Python/src/kernels_caldyn_NH.jin
r659 r685 1 1 {% macro compute_p_and_Aik() %} 2 2 {% set p_and_c2_from_theta=caller %} 3 SEQUENCE_ EXT3 SEQUENCE_C1 4 4 BODY('1,llm') 5 5 rho_ij = (g*m_ik(CELL))/(Phi_il(UP(CELL))-Phi_il(CELL)) … … 20 20 21 21 ! compute Phi_star 22 SEQUENCE_ EXT22 SEQUENCE_C1 23 23 BODY('1,llm+1') 24 24 Phi_star_il(CELL) = Phi_il(CELL) + tau*g2*(W_il(CELL)/m_il(CELL)-tau) … … 50 50 ! Solve -A(l-1)x(l-1) + B(l)x(l) - A(l)x(l+1) = R(l) using Thomas algorithm 51 51 52 SEQUENCE_ EXT52 SEQUENCE_C1 53 53 ! Compute residual R_il and B_il 54 54 PROLOGUE(1) -
codes/icosagcm/devel/Python/src/kernels_caldyn_hevi.jin
r625 r685 1 1 KERNEL(caldyn_wflux) 2 SEQUENCE 2 SEQUENCE_C0 3 3 BODY('llm-1,1,-1') 4 4 ! cumulate mass flux convergence from top to bottom … … 101 101 ! so that the DOFs are the same whatever caldyn_eta 102 102 ! in DYNAMICO mass_col is prognosed rather than rhodz 103 SEQUENCE_ EXT103 SEQUENCE_C1 104 104 PROLOGUE(0) 105 105 mass_col(HIDX(CELL))=0. -
codes/icosagcm/devel/Python/src/kernels_caldyn_hydro.jin
r615 r685 7 7 #define BALANCE(formula) {% call(thecell) balance() %} formula {% endcall %} 8 8 {% macro balance() %} {% set formula=caller %} 9 SEQUENCE_ EXT9 SEQUENCE_C1 10 10 PROLOGUE(llm) 11 11 pk(CELL) = ptop + .5*g*{{ formula('CELL') }} … … 29 29 #define GEOPOT(var) {% call geopot(var) %} 30 30 {% macro geopot(var) %} {% set formula=caller %} 31 SEQUENCE_ EXT31 SEQUENCE_C1 32 32 BODY('1,llm') 33 33 p_ik = pk(CELL) … … 48 48 ! now pk contains the Lagrange multiplier (pressure) 49 49 ! specific volume 1 = dphi/g/rhodz 50 SEQUENCE_ EXT50 SEQUENCE_C1 51 51 BODY('1,llm') 52 52 geopot(UP(CELL)) = geopot(CELL) + g*rhodz(CELL) -
codes/icosagcm/devel/Python/src/kernels_transport.jin
r615 r685 158 158 ! First diagnose geopotential and temperature, column-wise 159 159 BARRIER 160 SEQUENCE_ EXT160 SEQUENCE_C1 161 161 PROLOGUE(llm) 162 162 pk(CELL) = ptop + .5*g*rhodz(CELL) … … 225 225 226 226 END_BLOCK 227 228 KERNEL(remap_eta) 229 ! IN : rhodz, mass_dak, mass_dbk 230 ! TMP : mass_col, cur_lev, new_rhodz_cum 231 ! OUT : rhodz, old_rhodz, eta 232 SEQUENCE_C1 233 PROLOGUE('1') 234 rhodz_cum(CELL)=0. 235 cur_lev(HIDX(CELL))=1 236 eta(CELL)=0. 237 new_rhodz_cum(HIDX(CELL))=0. 238 END_BLOCK 239 BODY('1,llm') 240 rhodz_cum(UP(CELL)) = rhodz_cum(CELL) + rhodz(CELL) 241 END_BLOCK 242 EPILOGUE('llm+1') 243 mass_col(HIDX(CELL)) = rhodz_cum(CELL) 244 END_BLOCK 245 246 BODY('1,llm') 247 old_rhodz(CELL) = rhodz(CELL) 248 rhodz(CELL) = mass_dak(CELL) + mass_col(HIDX(CELL))*mass_dbk(CELL) 249 rhodz_cum_target = new_rhodz_cum(HIDX(CELL)) + rhodz(CELL) 250 DO level = cur_lev(HIDX(CELL)), llm 251 rhodz_cum_levp1 = rhodz_cum(AT_LEVEL(CELL,level+1)) 252 IF(rhodz_cum_target<=rhodz_cum_levp1) EXIT 253 END DO 254 rhodz_cum_lev = rhodz_cum(AT_LEVEL(CELL,level)) 255 ! now rhodz_cum_lev <= rhodz_cum_target <= rhodz_cum_levp1 256 cur_lev(HIDX(CELL)) = level 257 new_rhodz_cum(HIDX(CELL)) = rhodz_cum_target 258 eta(UP(CELL)) = level + (rhodz_cum_target-rhodz_cum_lev)/(rhodz_cum_levp1-rhodz_cum_lev) 259 END_BLOCK 260 END_BLOCK 261 END_BLOCK 262 263 KERNEL(remap_theta) 264 ! IN : thetarhodz, eta 265 ! TMP : thetarhodz_cum, new_thetarhodz_cum 266 ! OUT : thetarhodz 267 SEQUENCE_C1 268 PROLOGUE('1') 269 thetarhodz_cum(CELL)=0. 270 END_BLOCK 271 BODY('1,llm') 272 thetarhodz_cum(UP(CELL)) = thetarhodz_cum(CELL) + thetarhodz(CELL) 273 END_BLOCK 274 275 BODY('1,llm+1') 276 X = eta(CELL) 277 level = FLOOR(X) 278 X = X-level 279 new_thetarhodz_cum(CELL) = thetarhodz_cum(AT_LEVEL(CELL,level))+X*thetarhodz(AT_LEVEL(CELL,level)) 280 END_BLOCK 281 BODY('1,llm') 282 thetarhodz(CELL)) = new_thetarhodz_cum(UP(CELL)) - new_thetarhodz_cum(CELL) 283 END_BLOCK 284 END_BLOCK 285 END_BLOCK 286 287 KERNEL(remap_u) 288 ! IN : u, old_rhodz, rhodz, eta 289 ! TMP : urhodz_cum, new_urhodz_cum 290 ! OUT : u 291 SEQUENCE_E0 292 PROLOGUE('1') 293 urhodz_cum(EDGE)=0. 294 END_BLOCK 295 BODY('1,llm') 296 urhodz(EDGE) = u(EDGE)*(old_rhodz(CELL1)+old_rhodz(CELL2)) 297 urhodz_cum(UP(EDGE)) = urhodz_cum(EDGE) + urhodz(EDGE) 298 END_BLOCK 299 300 BODY('1,llm+1') 301 X = .5*(eta(CELL1)+eta(CELL2)) 302 level = FLOOR(X) 303 X = X-level 304 new_urhodz_cum(EDGE) = urhodz_cum(AT_LEVEL(EDGE,level))+X*urhodz(AT_LEVEL(EDGE,level)) 305 END_BLOCK 306 BODY('1,llm') 307 u(EDGE) = (new_urhodz_cum(UP(EDGE)) - new_urhodz_cum(EDGE)) / (rhodz(CELL1)+rhodz(CELL2)) 308 END_BLOCK 309 END_BLOCK 310 END_BLOCK -
codes/icosagcm/devel/Python/src/unstructured/macros.jin
r653 r685 21 21 #define FORALL_TRISK {% call forall_trisk(degree) %} 22 22 #define END_BLOCK {% endcall %} 23 #define SEQUENCE {% call sequence() %} 24 #define SEQUENCE_EXT {% call sequence() %} 23 #define SEQUENCE_C0 {% call(body,at_level) sequence_primal() %} 24 #define SEQUENCE_C1 {% call(body,at_level) sequence_primal() %} 25 #define SEQUENCE_E0 {% call(body,at_level) sequence_edge() %} 25 26 #define PROLOGUE(level) {% call at_level(level) %} 26 27 #define EPILOGUE(level) {% call at_level(level) %} 27 #define BODY(range) {% call (cell_up,cell_down)body(range) %}28 #define BODY(range) {% call body(range) %} 28 29 29 30 #define CST_IF(condition, action) {{ cst_if(#condition, #action) }} … … 59 60 {# ----------------------- SEQUENCE, FORALL ----------------------- #} 60 61 61 {% macro sequence() -%} 62 62 {% macro sequence_primal() -%} 63 63 !$OMP DO SCHEDULE(STATIC) 64 64 DO ij=1,primal_num 65 {{ caller( ) }}65 {{ caller(body_primal, at_level_primal) }} 66 66 END DO 67 67 !$OMP END DO 68 69 {%- endmacro %} 70 71 {% macro body(range) -%} 68 {%- endmacro %} 69 70 {% macro sequence_edge() -%} 71 {% set thecode = caller(body_edge, at_level_edge) %} 72 !$OMP DO SCHEDULE(STATIC) 73 DO edge=1,edge_num 74 {{ 'ij_left = left(edge)' if 'CELL1' in thecode }} 75 {{ 'ij_right = right(edge)' if 'CELL2' in thecode }} 76 {{ 'ij_up = up(edge)' if 'VERTEX1' in thecode }} 77 {{ 'ij_down = down(edge)' if 'VERTEX2' in thecode }} 78 {{ thecode }} 79 END DO 80 !$OMP END DO 81 {%- endmacro %} 82 83 {% macro body_primal(range) -%} 72 84 {{ define('CELL','l,ij') }} 73 85 DO l = {{ range }} … … 77 89 {%- endmacro %} 78 90 79 {% macro at_level(lev) -%} 80 {{ define('CELL','l,ij') }} 81 l={{ lev }} 91 {% macro body_edge(range) -%} 92 {% set thecode = caller() %} 93 {{ define('EDGE', 'l,edge') }} 94 {{ cdef(thecode, 'LE_DE', 'le_de(edge)') }} 95 {{ cdef(thecode, 'SIGN', '1.') }} 96 {{ cdef(thecode, 'CELL1', 'l,ij_left') }} 97 {{ cdef(thecode, 'CELL2', 'l,ij_right') }} 98 {{ cdef(thecode, 'VERTEX1', 'l,ij_down') }} 99 {{ cdef(thecode, 'VERTEX2', 'l,ij_up') }} 100 DO l = {{ range }} 101 {{ thecode }} 102 END DO 103 {{ cundef(thecode, ('EDGE','LE_DE','SIGN','CELL1','CELL2','VERTEX1','VERTEX2') ) }} 104 {%- endmacro %} 105 106 {% macro at_level_primal(lev) -%} 107 {{ define('CELL','%s,ij'%lev) }} 82 108 {{ caller() }} 83 109 {{ undef('CELL') }} 110 {%- endmacro %} 111 112 {% macro at_level_edge(lev) -%} 113 {{ define('EDGE','%s,edge'%lev) }} 114 {{ caller() }} 115 {{ undef('EDGE') }} 84 116 {%- endmacro %} 85 117 … … 365 397 366 398 #ifdef PASS_POST2 399 #define AT_LEVEL(l,ij,lev) lev,ij 367 400 #define KUP(l,ij) kup,ij 368 401 #define KDOWN(l,ij) kdown,ij
Note: See TracChangeset
for help on using the changeset viewer.