.. _usage-api: Python API ========== Imports ------- pyAMReX provides the public imports ``amrex.space1d``, ``amrex.space2d`` and ``amrex.space3d``, mirroring the compile-time option ``AMReX_SPACEDIM``. Due to limitations in AMReX, currently, only one of the imports can be used at a time in the same Python process. For example: .. code-block:: python import amrex.space3d as amr A 1D or 2D AMReX run needs its own Python process. Another dimensionality *cannot be imported into the same Python process* after choosing a specific dimensionality for import. For brevity, below the 3D APIs are shown. pyAMReX classes and functions follow the same structure as the `C++ AMReX APIs `__. .. _usage-api-base: Base ---- .. autoclass:: amrex.space3d.AMReX :members: :undoc-members: .. autoclass:: amrex.space3d.Config :members: :undoc-members: .. autofunction:: amrex.space3d.initialize .. autofunction:: amrex.space3d.finalize .. autofunction:: amrex.space3d.initialized .. autofunction:: amrex.space3d.size .. autoclass:: amrex.space3d.Arena :members: :undoc-members: .. autoclass:: amrex.space3d.Direction :members: :undoc-members: .. autoclass:: amrex.space3d.CoordSys :members: :undoc-members: .. autoclass:: amrex.space3d.DistributionMapping :members: :undoc-members: .. autoclass:: amrex.space3d.GeometryData :members: :undoc-members: .. autoclass:: amrex.space3d.Geometry :members: :undoc-members: .. automodule:: amrex.space3d.ParallelDescriptor :members: :undoc-members: .. autoclass:: amrex.space3d.Periodicity :members: :undoc-members: .. autoclass:: amrex.space3d.RealBox :members: :undoc-members: .. autofunction:: amrex.space3d.AlmostEqual Indexing: Box, IntVect and IndexType """""""""""""""""""""""""""""""""""" `Corresponding AMReX documentation `__. .. autoclass:: amrex.space3d.IntVect :members: :undoc-members: .. autoclass:: amrex.space3d.Box :members: :undoc-members: .. autoclass:: amrex.space3d.BoxArray :members: :undoc-members: .. autoclass:: amrex.space3d.Dim3 :members: :undoc-members: .. autoclass:: amrex.space3d.XDim3 :members: :undoc-members: .. autoclass:: amrex.space3d.IndexType :members: :undoc-members: Vectors """"""" .. autoclass:: amrex.space3d.RealVect :members: :undoc-members: .. autofunction:: amrex.space3d.min .. autofunction:: amrex.space3d.max ``amrex::Vector`` is implemented for many types, e.g., .. autoclass:: amrex.space3d.Vector_Real :members: :undoc-members: .. autoclass:: amrex.space3d.Vector_int :members: :undoc-members: .. autoclass:: amrex.space3d.Vector_string :members: :undoc-members: Boundary Conditions """"""""""""""""""" Boundary records describe the mathematical boundary types used for each MultiFab component and coordinate direction. A common cell-centered fill sequence is to fill interior or periodic ghost cells first and then fill physical-domain ghost cells: .. code-block:: python sd = amr.Config.spacedim bc = amr.Vector_BCRec([ amr.BCRec( lo=[amr.BCType.foextrap] * sd, hi=[amr.BCType.foextrap] * sd, ) ]) mf.fill_boundary() amr.fill_domain_boundary(mf, geom, bc) ``fill_domain_boundary`` handles extrapolation and reflection boundary types. For external Dirichlet values, ``BCType.ext_dir`` or ``BCType.ext_dir_cc``, fill the relevant ghost cells from application code. ``PhysBCFunctUser`` provides a Python callback hook with the same component-range convention as AMReX FillPatch routines: .. code-block:: python def fill_ext_dir(mf, dcomp, ncomp, nghost, time, bccomp): # Fill external Dirichlet ghost cells for mf components # [dcomp, dcomp + ncomp). pass physbc = amr.PhysBCFunctUser(fill_ext_dir) physbc(mf, 0, 1, mf.n_grow_vect, 0.0, 0) In physical boundary functors, ``dcomp`` is the first destination component in the ``MultiFab`` and ``bccomp`` is the first matching entry in the ``Vector_BCRec``. .. autoclass:: amrex.space3d.BCType :members: :undoc-members: .. autoclass:: amrex.space3d.PhysBCType :members: :undoc-members: .. autoclass:: amrex.space3d.BCRec :members: :undoc-members: .. autoclass:: amrex.space3d.Vector_BCRec :members: :undoc-members: .. autofunction:: amrex.space3d.setBC .. autofunction:: amrex.space3d.fill_domain_boundary .. autoclass:: amrex.space3d.PhysBCFunctNoOp :members: :undoc-members: .. autoclass:: amrex.space3d.CpuBndryFuncFab :members: :undoc-members: .. autoclass:: amrex.space3d.PhysBCFunct_CpuBndryFuncFab :members: :undoc-members: .. autoclass:: amrex.space3d.PhysBCFunctUser :members: :undoc-members: Data Containers """"""""""""""" ``amrex::Array4`` is implemented for many floating point and integer types, e.g., .. autoclass:: amrex.space3d.Array4_double :members: :undoc-members: .. autoclass:: amrex.space3d.BaseFab_Real :members: :undoc-members: .. autoclass:: amrex.space3d.FArrayBox :members: :undoc-members: .. autoclass:: amrex.space3d.MultiFab :members: :undoc-members: .. autoclass:: amrex.space3d.MFInfo :members: :undoc-members: .. autoclass:: amrex.space3d.MFIter :members: :undoc-members: ``amrex::PODVector`` is implemented for many allocators, e.g., .. autoclass:: amrex.space3d.PODVector_real_arena :members: :undoc-members: .. autoclass:: amrex.space3d.PODVector_int_pinned :members: :undoc-members: Small Matrices and Vectors """""""""""""""""""""""""" .. autoclass:: amrex.space3d.SmallMatrix_6x6_F_SI1_double :members: :undoc-members: Utility """"""" .. autoclass:: amrex.space3d.ParmParse :members: :undoc-members: .. autofunction:: amrex.space3d.Print .. autofunction:: amrex.space3d.d_decl .. autofunction:: amrex.space3d.concatenate .. autofunction:: amrex.space3d.write_single_level_plotfile .. _usage-api-amrcore: AmrCore ------- Python subclasses implement the AMR callbacks with pyAMReX snake-case names: ``make_new_level_from_scratch``, ``make_new_level_from_coarse``, ``remake_level``, ``clear_level`` and ``error_est``. The ``error_est`` callback receives a mutable ``TagBoxArray`` for the level being tagged. The tag array is a callback-scoped, non-owning view; mark cells for refinement with ``tags.set_val(amr.TagBox.SET, ...)`` and do not store it for later use. A particle container can be connected to an ``AmrCore`` hierarchy through the particle metadata broker returned by ``core.get_par_gdb()``. .. code-block:: python class MyCore(amr.AmrCore): def make_new_level_from_scratch(self, lev, time, ba, dm): pass def make_new_level_from_coarse(self, lev, time, ba, dm): pass def remake_level(self, lev, time, ba, dm): pass def clear_level(self, lev): pass def error_est(self, lev, tags, time, ngrow): tags.set_val(amr.TagBox.SET) core = MyCore(rb, 1, n_cell, 0, ref_ratios, is_periodic) core.init_from_scratch(0.0) particles = amr.ParticleContainer_2_1_3_1_default(core.get_par_gdb()) .. autoclass:: amrex.space3d.AmrInfo :members: :undoc-members: .. autoclass:: amrex.space3d.AmrMesh :members: :undoc-members: .. autoclass:: amrex.space3d.AmrCore :members: :undoc-members: .. autoclass:: amrex.space3d.TagBox :members: :undoc-members: .. autoclass:: amrex.space3d.TagBoxArray :members: :undoc-members: .. autoclass:: amrex.space3d.ParGDBBase :members: :undoc-members: .. autoclass:: amrex.space3d.AmrParGDB :members: :undoc-members: .. _usage-api-particles: Particles --------- Particle support is implemented for both legacy (AoS+SoA) and pure SoA particle memory layouts in AMReX. Additional runtime attributes (Real or Int) are always in SoA memory layout. ``amrex::StructOfArrays`` is implemented for many numbers of Real and Int arguments, and allocators, e.g., .. autoclass:: amrex.space3d.StructOfArrays_8_0_idcpu_default :members: :undoc-members: ``amrex::ParticleTile`` is implemented for both legacy (AoS+SoA) and pure SoA particle types, many number of Real and Int arguments, and allocators, e.g., .. autoclass:: amrex.space3d.ParticleTile_pureSoA_8_0_default :members: :undoc-members: ``amrex::ParticleTileData`` is implemented for both legacy (AoS+SoA) and pure SoA particle types, many number of Real and Int arguments, e.g., .. autoclass:: amrex.space3d.ParticleTileData_pureSoA_8_0 :members: :undoc-members: ``amrex::ParticleContainer_impl`` is implemented for both legacy (AoS+SoA) and pure SoA particle types, many number of Real and Int arguments, and allocators, e.g., .. autoclass:: amrex.space3d.ParticleContainer_2_1_3_1_default :members: :undoc-members: .. autoclass:: amrex.space3d.ParticleContainer_pureSoA_8_0_default :members: :undoc-members: Likewise for other classes accessible and usable on particle containers: .. autoclass:: amrex.space3d.ParIter_pureSoA_8_0_default :members: :undoc-members: .. autoclass:: amrex.space3d.ParConstIter_pureSoA_8_0_default .. autoclass:: amrex.space3d.ParticleInitType_2_1_3_1 :members: :undoc-members: .. TODO for pure SoA .. .. autoclass:: amrex.space3d.ParticleInitType_pureSoA_8_0 .. :members: .. :undoc-members: AoS """ This is for the legacy, AoS + SoA particle containers only: ``amrex::ArrayOfStructs`` is implemented for many numbers of extra Real and Int arguments, and allocators, e.g., .. autoclass:: amrex.space3d.ArrayOfStructs_2_1_default :members: :undoc-members: ``amrex::Particle`` is implemented for many numbers of extra Real and Int arguments, e.g., .. autoclass:: amrex.space3d.Particle_2_1 :members: :undoc-members: .. _usage-api-eb: Embedded Boundaries ------------------- Embedded boundary (EB) support in pyAMReX is still minimal. To build pyAMReX with EB support, you need to add ``-DAMReX_EB=ON`` to CMake build options. .. autofunction:: amrex.space3d.EB2_Build .. autoclass:: amrex.space3d.EBFArrayBoxFactory :members: :undoc-members: .. autofunction:: amrex.space3d.makeEBFabFactory