Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: omlins/ParallelStencil.jl
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v0.13.5
Choose a base ref
...
head repository: omlins/ParallelStencil.jl
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: main
Choose a head ref

Commits on Sep 30, 2024

  1. add PK Fields

    omlins committed Sep 30, 2024
    Copy the full SHA
    cd214a5 View commit details
  2. add PK Fields

    omlins committed Sep 30, 2024
    Copy the full SHA
    cd68b6c View commit details
  3. add PK Fields

    omlins committed Sep 30, 2024
    Copy the full SHA
    85eb821 View commit details

Commits on Oct 1, 2024

  1. add PK Fields

    omlins committed Oct 1, 2024
    Copy the full SHA
    ed077a2 View commit details
  2. add PK Fields

    omlins committed Oct 1, 2024
    Copy the full SHA
    38434cc View commit details
  3. Copy the full SHA
    a28ef8e View commit details
  4. Copy the full SHA
    7d48f0b View commit details
  5. Copy the full SHA
    9698d5e View commit details
  6. add TData creation

    omlins committed Oct 1, 2024
    Copy the full SHA
    8602448 View commit details
  7. add TData creation

    omlins committed Oct 1, 2024
    Copy the full SHA
    980e35d View commit details
  8. introduce device module

    omlins committed Oct 1, 2024
    Copy the full SHA
    2ac7ac2 View commit details
  9. introduce device module

    omlins committed Oct 1, 2024
    Copy the full SHA
    cb2771a View commit details

Commits on Oct 2, 2024

  1. add Fields.Device module

    omlins committed Oct 2, 2024
    Copy the full SHA
    2164851 View commit details
  2. Copy the full SHA
    9ed75ed View commit details
  3. Copy the full SHA
    6b0bfc1 View commit details
  4. simplify T modules

    omlins committed Oct 2, 2024
    Copy the full SHA
    4aba033 View commit details
  5. unify module if else

    omlins committed Oct 2, 2024
    Copy the full SHA
    2156512 View commit details
  6. Copy the full SHA
    17086a0 View commit details
  7. update module creation calls

    omlins committed Oct 2, 2024
    Copy the full SHA
    515e747 View commit details
  8. unify formatting

    omlins committed Oct 2, 2024
    Copy the full SHA
    220b737 View commit details

Commits on Oct 4, 2024

  1. bump Enzyme

    aelligp authored Oct 4, 2024
    Copy the full SHA
    a2f0c72 View commit details

Commits on Oct 8, 2024

  1. Add DOI

    luraess committed Oct 8, 2024
    Copy the full SHA
    4530a2d View commit details
  2. Copy the full SHA
    eafb0dc View commit details
  3. Copy the full SHA
    33e46e8 View commit details
  4. fix AD test

    aelligp committed Oct 8, 2024
    Copy the full SHA
    226a4e2 View commit details
  5. Copy the full SHA
    aa08f08 View commit details
  6. Add defaults

    GiackAloZ committed Oct 8, 2024
    Copy the full SHA
    1fdcc74 View commit details
  7. Add shared functions

    GiackAloZ committed Oct 8, 2024
    Copy the full SHA
    d98ab6f View commit details
  8. Fix shared functions

    GiackAloZ committed Oct 8, 2024
    Copy the full SHA
    649dad4 View commit details
  9. Define Metal constants

    GiackAloZ committed Oct 8, 2024
    Copy the full SHA
    f633876 View commit details
  10. Add Metal kernel int type

    GiackAloZ committed Oct 8, 2024
    Copy the full SHA
    91ab97b View commit details
  11. Copy the full SHA
    3059741 View commit details
  12. Add more Metal allocators

    GiackAloZ committed Oct 8, 2024
    Copy the full SHA
    7490133 View commit details
  13. Copy the full SHA
    8917bd8 View commit details
  14. Copy the full SHA
    0b716e2 View commit details
  15. Copy the full SHA
    b69ad03 View commit details
  16. Copy the full SHA
    0d3fdc9 View commit details
  17. Add parallel kernel calls

    GiackAloZ committed Oct 8, 2024
    Copy the full SHA
    c6c07d0 View commit details
  18. fix missing Const

    aelligp committed Oct 8, 2024
    Copy the full SHA
    408977d View commit details

Commits on Oct 9, 2024

  1. Add Metal to shared

    GiackAloZ committed Oct 9, 2024
    Copy the full SHA
    f00838e View commit details
  2. Add Metal to PS and tests

    GiackAloZ committed Oct 9, 2024
    Copy the full SHA
    740ced7 View commit details
  3. wrap args to Const

    Co-authored-by: Valentin Churavy <v.churavy@gmail.com>
    aelligp and vchuravy committed Oct 9, 2024
    Copy the full SHA
    01d4f7b View commit details
  4. Trigger CI

    luraess committed Oct 9, 2024
    Copy the full SHA
    e2edf78 View commit details
  5. Fixup

    luraess committed Oct 9, 2024
    Copy the full SHA
    c45cb9c View commit details
  6. Merge pull request #169 from aelligp/main

    Enzyme `>= 0.12` compatibility
    omlins authored Oct 9, 2024
    Copy the full SHA
    489252e View commit details
  7. Copy the full SHA
    453e64e View commit details
  8. Copy the full SHA
    0a5858c View commit details
  9. Copy the full SHA
    16105a5 View commit details
  10. Add some documentation

    GiackAloZ committed Oct 9, 2024
    Copy the full SHA
    b2a4196 View commit details
  11. Add more docs

    GiackAloZ committed Oct 9, 2024
    Copy the full SHA
    1dfaf38 View commit details
Showing with 4,350 additions and 1,823 deletions.
  1. +3 −3 .github/workflows/ci.yml
  2. +8 −5 Project.toml
  3. +7 −5 README.md
  4. +4 −0 ext/ParallelStencil_MetalExt.jl
  5. +2 −5 src/AD.jl
  6. +65 −0 src/FieldAllocators.jl
  7. +95 −93 src/FiniteDifferences.jl
  8. +1 −1 src/ParallelKernel/CUDAExt/allocators.jl
  9. +576 −203 src/ParallelKernel/Data.jl
  10. +2 −5 src/ParallelKernel/EnzymeExt/AD.jl
  11. +22 −3 src/ParallelKernel/EnzymeExt/autodiff_gpu.jl
  12. +694 −0 src/ParallelKernel/FieldAllocators.jl
  13. +29 −0 src/ParallelKernel/MetalExt/allocators.jl
  14. +18 −0 src/ParallelKernel/MetalExt/defaults.jl
  15. +30 −0 src/ParallelKernel/MetalExt/shared.jl
  16. +12 −4 src/ParallelKernel/ParallelKernel.jl
  17. +16 −2 src/ParallelKernel/allocators.jl
  18. +4 −0 src/ParallelKernel/hide_communication.jl
  19. +74 −28 src/ParallelKernel/init_parallel_kernel.jl
  20. +43 −6 src/ParallelKernel/kernel_language.jl
  21. +177 −13 src/ParallelKernel/parallel.jl
  22. +10 −4 src/ParallelKernel/reset_parallel_kernel.jl
  23. +158 −41 src/ParallelKernel/shared.jl
  24. +5 −2 src/ParallelStencil.jl
  25. +74 −33 src/init_parallel_stencil.jl
  26. +33 −34 src/kernel_language.jl
  27. +68 −27 src/parallel.jl
  28. +6 −4 src/reset_parallel_stencil.jl
  29. +41 −31 src/shared.jl
  30. +386 −4 test/ParallelKernel/test_allocators.jl
  31. +22 −5 test/ParallelKernel/test_hide_communication.jl
  32. +91 −28 test/ParallelKernel/test_init_parallel_kernel.jl
  33. +31 −9 test/ParallelKernel/test_kernel_language.jl
  34. +146 −202 test/ParallelKernel/test_parallel.jl
  35. +15 −2 test/ParallelKernel/test_reset_parallel_kernel.jl
  36. +7 −2 test/runtests.jl
  37. +80 −57 test/test_FiniteDifferences1D.jl
  38. +121 −98 test/test_FiniteDifferences2D.jl
  39. +175 −152 test/test_FiniteDifferences3D.jl
  40. +13 −1 test/test_extensions.jl
  41. +10 −1 test/test_incremental_compilation.jl
  42. +61 −32 test/test_init_parallel_stencil.jl
  43. +819 −677 test/test_parallel.jl
  44. +10 −0 test/test_projects/Diffusion3D_Revise/Project.toml
  45. +6 −0 test/test_projects/Diffusion3D_Revise/src/Diffusion3D_Revise.jl
  46. +39 −0 test/test_projects/Diffusion3D_Revise/src/diffusion3D_tmp.jl
  47. +8 −0 test/test_projects/Diffusion3D_minimal/test/localtest_diffusion_Metal.jl
  48. +13 −1 test/test_reset_parallel_stencil.jl
  49. +20 −0 test/test_revise.jl
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -12,8 +12,8 @@ jobs:
fail-fast: false
matrix:
version:
- '1.9' # Minimum version supporting extensions
- '1' # Latest stable 1.x release of Julia
- '1.10' # Minimum version supporting Data module creation
- '1' # Latest stable 1.x release of Julia
#- 'nightly'
os:
- ubuntu-latest
@@ -27,7 +27,7 @@ jobs:
with:
version: ${{ matrix.version }}
arch: ${{ matrix.arch }}
- uses: actions/cache@v1
- uses: actions/cache@v4
env:
cache-name: cache-artifacts
with:
13 changes: 8 additions & 5 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "ParallelStencil"
uuid = "94395366-693c-11ea-3b26-d9b7aac5d958"
authors = ["Samuel Omlin", "Ludovic Räss"]
version = "0.13.5"
version = "0.14.2"

[deps]
CellArrays = "d35fcfd7-7af4-4c67-b1aa-d78070614af4"
@@ -13,26 +13,29 @@ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
Polyester = "f517fe37-dbe3-4b94-8317-1923a5111588"

[extensions]
ParallelStencil_AMDGPUExt = "AMDGPU"
ParallelStencil_CUDAExt = "CUDA"
ParallelStencil_EnzymeExt = "Enzyme"
ParallelStencil_MetalExt = "Metal"

[compat]
AMDGPU = "0.6, 0.7, 0.8, 0.9, 1"
CUDA = "3.12, 4, 5"
CellArrays = "0.2.1"
Enzyme = "0.11"
CellArrays = "0.3.2"
Enzyme = "0.12, 0.13"
MacroTools = "0.5"
Metal = "1.2"
Polyester = "0.7"
StaticArrays = "1"
julia = "1.9" # Minimum version supporting extensions
julia = "1.10" # Minimum version supporting Data module creation

[extras]
TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[targets]
test = ["Test", "TOML", "AMDGPU", "CUDA", "Enzyme", "Polyester"]
test = ["Test", "TOML", "AMDGPU", "CUDA", "Metal", "Enzyme", "Polyester"]
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
<h1> <img src="docs/logo/logo_ParallelStencil.png" alt="ParallelStencil.jl" width="50"> ParallelStencil.jl </h1>

[![Build Status](https://github.com/omlins/ParallelStencil.jl/workflows/CI/badge.svg)](https://github.com/omlins/ParallelStencil.jl/actions)
[![DOI](https://proceedings.juliacon.org/papers/10.21105/jcon.00138/status.svg)](https://doi.org/10.21105/jcon.00138)

ParallelStencil empowers domain scientists to write architecture-agnostic high-level code for parallel high-performance stencil computations on GPUs and CPUs. Performance similar to CUDA C / HIP can be achieved, which is typically a large improvement over the performance reached when using only [CUDA.jl] or [AMDGPU.jl] [GPU Array programming]. For example, a 2-D shallow ice solver presented at JuliaCon 2020 \[[1][JuliaCon20a]\] achieved a nearly 20 times better performance than a corresponding [GPU Array programming] implementation; in absolute terms, it reached 70% of the theoretical upper performance bound of the used Nvidia P100 GPU, as defined by the effective throughput metric, `T_eff` (note that `T_eff` is very different from common throughput metrics, see section [Performance metric](#performance-metric)). The GPU performance of the solver is reported in green, the CPU performance in blue:

<a id="fig_teff">![Performance ParallelStencil Teff](docs/images/perf_ps2.png)</a>

ParallelStencil relies on the native kernel programming capabilities of [CUDA.jl] and [AMDGPU.jl] and on [Base.Threads] for high-performance computations on GPUs and CPUs, respectively. It is seamlessly interoperable with [ImplicitGlobalGrid.jl], which renders the distributed parallelization of stencil-based GPU and CPU applications on a regular staggered grid almost trivial and enables close to ideal weak scaling of real-world applications on thousands of GPUs \[[1][JuliaCon20a], [2][JuliaCon20b], [3][JuliaCon19], [4][PASC19]\]. Moreover, ParallelStencil enables hiding communication behind computation with a simple macro call and without any particular restrictions on the package used for communication. ParallelStencil has been designed in conjunction with [ImplicitGlobalGrid.jl] for simplest possible usage by domain-scientists, rendering fast and interactive development of massively scalable high performance multi-GPU applications readily accessible to them. Furthermore, we have developed a self-contained approach for "Solving Nonlinear Multi-Physics on GPU Supercomputers with Julia" relying on ParallelStencil and [ImplicitGlobalGrid.jl] \[[1][JuliaCon20a]\]. ParallelStencil's feature to hide communication behind computation was showcased when a close to ideal weak scaling was demonstrated for a 3-D poro-hydro-mechanical real-world application on up to 1024 GPUs on the Piz Daint Supercomputer \[[1][JuliaCon20a]\]:
ParallelStencil relies on the native kernel programming capabilities of [CUDA.jl], [AMDGPU.jl], [Metal.jl] and on [Base.Threads] for high-performance computations on GPUs and CPUs, respectively. It is seamlessly interoperable with [ImplicitGlobalGrid.jl], which renders the distributed parallelization of stencil-based GPU and CPU applications on a regular staggered grid almost trivial and enables close to ideal weak scaling of real-world applications on thousands of GPUs \[[1][JuliaCon20a], [2][JuliaCon20b], [3][JuliaCon19], [4][PASC19]\]. Moreover, ParallelStencil enables hiding communication behind computation with a simple macro call and without any particular restrictions on the package used for communication. ParallelStencil has been designed in conjunction with [ImplicitGlobalGrid.jl] for simplest possible usage by domain-scientists, rendering fast and interactive development of massively scalable high performance multi-GPU applications readily accessible to them. Furthermore, we have developed a self-contained approach for "Solving Nonlinear Multi-Physics on GPU Supercomputers with Julia" relying on ParallelStencil and [ImplicitGlobalGrid.jl] \[[1][JuliaCon20a]\]. ParallelStencil's feature to hide communication behind computation was showcased when a close to ideal weak scaling was demonstrated for a 3-D poro-hydro-mechanical real-world application on up to 1024 GPUs on the Piz Daint Supercomputer \[[1][JuliaCon20a]\]:

![Parallel efficiency of ParallelStencil with CUDA C backend](docs/images/par_eff_c_julia2.png)

@@ -32,7 +33,7 @@ Beyond traditional high-performance computing, ParallelStencil supports automati
* [References](#references)

## Parallelization and optimization with one macro call
A simple call to `@parallel` is enough to parallelize and optimize a function and to launch it. The package used underneath for parallelization is defined in a call to `@init_parallel_stencil` beforehand. Supported are [CUDA.jl] and [AMDGPU.jl] for running on GPU and [Base.Threads] for CPU. The following example outlines how to run parallel computations on a GPU using the native kernel programming capabilities of [CUDA.jl] underneath (omitted lines are represented with `#(...)`, omitted arguments with `...`):
A simple call to `@parallel` is enough to parallelize and optimize a function and to launch it. The package used underneath for parallelization is defined in a call to `@init_parallel_stencil` beforehand. Supported are [CUDA.jl], [AMDGPU.jl] and [Metal.jl] for running on GPU and [Base.Threads] for CPU. The following example outlines how to run parallel computations on a GPU using the native kernel programming capabilities of [CUDA.jl] underneath (omitted lines are represented with `#(...)`, omitted arguments with `...`):
```julia
#(...)
@init_parallel_stencil(CUDA,...)
@@ -518,11 +519,11 @@ julia>]
```

## Questions, comments and discussions
To discuss technical issues, please post on Julia Discourse in the [GPU topic] or the [Julia at Scale topic] or in the `#gpu` or `#distributed` channels on the [Julia Slack] (to join, visit https://julialang.org/slack/).
To discuss technical issues, please post on Julia Discourse in the [GPU topic] or the [Julia at Scale topic] or in the `#gpu` or `#hpc` channels on the [Julia Slack] (to join, visit https://julialang.org/slack/).
To discuss numerical/domain-science issues, please post on Julia Discourse in the [Numerics topic] or the [Modelling & Simulations topic] or whichever other topic fits best your issue.

## Your contributions
This project welcomes your contribution! Have you developed an application with ParallelStencil that could be featured as a mini-app? Please contribute it to share it with the world! Would you like to use other methods than finite differences with math-close notation in ParallelStencil kernels? Then check out the tiny `ParallelStencil.FiniteDifferences1D` submodule as an example for enabling math-close notation for a method and contribute your own submodule! Are you missing a great feature in the core of ParallelStencil? Maybe you can contribute yourself!
This project welcomes your contribution! Have you developed an application with ParallelStencil that could be featured as a mini-app? Please contribute it to share it with the world! Would you like to use other methods than finite differences with math-close notation in ParallelStencil kernels? Then check out the tiny `ParallelStencil.FiniteDifferences1D` submodule as an example for enabling math-close notation for a method and contribute your own submodule! Are you missing a great feature in the core of ParallelStencil? Maybe you can contribute yourself!
Please open an issue to discuss your idea for a contribution beforehand. Furthermore, note that a pull request should always address a significant issue in its completeness. Moreover, pull requests should blend nicely into the existing project; common sense is the primary guide in this regard (community guideline documents, e.g. [ColPrac](https://github.com/SciML/ColPrac), can be consulted in addition for inspiration). We are looking forward to your contribution!

## References
@@ -545,14 +546,15 @@ Please open an issue to discuss your idea for a contribution beforehand. Further
[JuliaCon20a]: https://www.youtube.com/watch?v=vPsfZUqI4_0
[JuliaCon20b]: https://www.youtube.com/watch?v=1t1AKnnGRqA
[JuliaCon19]: https://www.youtube.com/watch?v=b90qqbYJ58Q
[PASC19]: https://pasc19.pasc-conference.org/program/schedule/presentation/?id=msa218&sess=sess144
[PASC19]: https://pasc19.pasc-conference.org/program/schedule/index.html%3Fpost_type=page&p=10&id=msa218&sess=sess144.html
[Base.Threads]: https://docs.julialang.org/en/v1/base/multi-threading/
[ImplicitGlobalGrid.jl]: https://github.com/eth-cscs/ImplicitGlobalGrid.jl
[JULIA_NUM_THREADS]:https://docs.julialang.org/en/v1.0.0/manual/environment-variables/#JULIA_NUM_THREADS-1
[MPI.jl]: https://github.com/JuliaParallel/MPI.jl
[CellArrays.jl]: https://github.com/omlins/CellArrays.jl
[CUDA.jl]: https://github.com/JuliaGPU/CUDA.jl
[AMDGPU.jl]: https://github.com/JuliaGPU/AMDGPU.jl
[Metal.jl]: https://github.com/JuliaGPU/Metal.jl
[Enzyme.jl]: https://github.com/EnzymeAD/Enzyme.jl
[MacroTools.jl]: https://github.com/FluxML/MacroTools.jl
[StaticArrays.jl]: https://github.com/JuliaArrays/StaticArrays.jl
4 changes: 4 additions & 0 deletions ext/ParallelStencil_MetalExt.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module ParallelStencil_MetalExt
include(joinpath(@__DIR__, "..", "src", "ParallelKernel", "MetalExt", "shared.jl"))
include(joinpath(@__DIR__, "..", "src", "ParallelKernel", "MetalExt", "allocators.jl"))
end
7 changes: 2 additions & 5 deletions src/AD.jl
Original file line number Diff line number Diff line change
@@ -7,8 +7,8 @@ Provides GPU-compatible wrappers for automatic differentiation functions of the
import ParallelStencil.AD
# Functions
- `autodiff_deferred!`: wraps function `autodiff_deferred`.
- `autodiff_deferred_thunk!`: wraps function `autodiff_deferred_thunk`.
- `autodiff_deferred!`: wraps function `autodiff_deferred`, promoting all arguments that are not Enzyme.Annotations to Enzyme.Const.
- `autodiff_deferred_thunk!`: wraps function `autodiff_deferred_thunk`, promoting all arguments that are not Enzyme.Annotations to Enzyme.Const.
# Examples
const USE_GPU = true
@@ -43,9 +43,6 @@ Provides GPU-compatible wrappers for automatic differentiation functions of the
main()
!!! note "Enzyme runtime activity default"
If ParallelStencil is initialized with Threads, then `Enzyme.API.runtimeActivity!(true)` is called to ensure correct behavior of Enzyme. If you want to disable this behavior, then call `Enzyme.API.runtimeActivity!(false)` after loading ParallelStencil.
To see a description of a function type `?<functionname>`.
"""
module AD
65 changes: 65 additions & 0 deletions src/FieldAllocators.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
"""
Module FieldAllocators
Provides macros for the allocation of different kind of fields on a grid of size `gridsize`.
# Usage
using ParallelStencil.FieldAllocators
# Macros
###### Multiple fields at once
- [`@allocate`](@ref)
###### Scalar fields
- [`@Field`](@ref)
- `{X|Y|Z}Field`, e.g. [`@XField`](@ref)
- `B{X|Y|Z}Field`, e.g. [`@BXField`](@ref)
- `{XX|YY|ZZ|XY|XZ|YZ}Field`, e.g. [`@XXField`](@ref)
###### Vector fields
- [`@VectorField`](@ref)
- [`@BVectorField`](@ref)
###### Tensor fields
- [`@TensorField`](@ref)
To see a description of a macro type `?<macroname>` (including the `@`).
"""
module FieldAllocators
import ..ParallelKernel
import ..ParallelStencil: check_initialized
@doc replace(ParallelKernel.FieldAllocators.ALLOCATE_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro allocate(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@allocate($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.FIELD_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro Field(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@Field($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.VECTORFIELD_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro VectorField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@VectorField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.BVECTORFIELD_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro BVectorField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@BVectorField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.TENSORFIELD_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro TensorField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@TensorField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.VECTORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro XField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.BVECTORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro BXField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@BXField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.VECTORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro YField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@YField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.BVECTORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro BYField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@BYField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.VECTORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro ZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@ZField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.BVECTORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro BZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@BZField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.TENSORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro XXField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XXField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.TENSORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro YYField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@YYField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.TENSORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro ZZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@ZZField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.TENSORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro XYField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XYField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.TENSORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro XZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XZField($(args...)))); end
@doc replace(ParallelKernel.FieldAllocators.TENSORFIELD_COMP_DOC, "@init_parallel_kernel" => "@init_parallel_stencil") macro YZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@YZField($(args...)))); end

macro IField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@IField($(args...)))); end
macro XXYField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XXYField($(args...)))); end
macro XYYField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XYYField($(args...)))); end
macro XYZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XYZField($(args...)))); end
macro XXYZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XXYZField($(args...)))); end
macro XYYZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XYYZField($(args...)))); end
macro XYZZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XYZZField($(args...)))); end
macro XXYYField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XXYYField($(args...)))); end
macro XXZZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XXZZField($(args...)))); end
macro YYZZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@YYZZField($(args...)))); end
macro XXYYZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XXYYZField($(args...)))); end
macro XYYZZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XYYZZField($(args...)))); end
macro XXYZZField(args...) check_initialized(__module__); esc(:(ParallelStencil.ParallelKernel.FieldAllocators.@XXYZZField($(args...)))); end

export @allocate, @Field, @VectorField, @BVectorField, @TensorField, @XField, @BXField, @YField, @BYField, @ZField, @BZField, @XXField, @YYField, @ZZField, @XYField, @XZField, @YZField
end
Loading