coveralls: ## Pull Request Test Coverage Report for [Build 1508](https://coveralls.io/builds/26755043)

* **-2** of **43**   **(95.35%)**  changed or added relevant lines in **4** files are covered.
* No unchanged relevant lines lost coverage.
* Overall coverage decreased (**-0.06%**) to **95.575%**

---

|  Changes Missing Coverage | Covered Lines | Changed/Added Lines | % |
| :-----|--------------|--------|---: |
| [pyuvsim/mpi.py](https://coveralls.io/builds/26755043/source?filename=pyuvsim%2Fmpi.py#L215) | 8 | 10 | 80.0%
<!-- | **Total:** | **41** | **43** | **95.35%** | -->


|  Totals | [![Coverage Status](https://coveralls.io/builds/26755043/badge)](https://coveralls.io/builds/26755043) |
| :-- | --: |
| Change from base [Build 1490](https://coveralls.io/builds/26477601): |  -0.06% |
| Covered Lines: | 1771 |
| Relevant Lines: | 1853 |

---
##### 💛  - [Coveralls](https://coveralls.io)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 207edc0..274d505 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
 
 ## [Unreleased]
 
+
+## Added
+- A function for checking the memory usage on each Node
+
 ### Changed
 - Replaced init_uvdata_out function with complete_uvdata
 - init_uvdata_out function is more modular.
@@ -10,6 +14,8 @@
 - Added functions to read healpix maps and added support for frequency axis
 
 ### Fixed
+- skymodel splitting was not working correctly to avoid running out of memory.
+- Flush stderr in excepthook, so stack trace is printed when an exception is raised in MPI.
 - No longer calling UVBeam.interp with freq_interp_kind, for updated pyuvdata.
 - Circular-installation bug
 - Bug in how integration_time array is set in setup
diff --git a/environment.yml b/environment.yml
index 1909c52..295e3f0 100644
--- a/environment.yml
+++ b/environment.yml
@@ -9,7 +9,7 @@ dependencies:
   - scipy>=1.0.1
   - PyYAML>=5.1
   - mpi4py>=3.0.0
-  - astropy>=2.0
+  - astropy>=2.0.16
   - pip
   - psutil
   - line_profiler
diff --git a/pyuvsim/mpi.py b/pyuvsim/mpi.py
index 4a7d70a..7187ee4 100644
--- a/pyuvsim/mpi.py
+++ b/pyuvsim/mpi.py
@@ -7,6 +7,7 @@ from __future__ import absolute_import, division, print_function
 import sys
 from array import array
 from threading import Thread
+import resource
 
 import mpi4py
 import numpy as np
@@ -16,7 +17,6 @@ from mpi4py import MPI
 
 rank = 0  # COMM_WORLD rank
 Npus = 1
-Npus_node = 1
 world_comm = None
 node_comm = None
 rank_comm = None
@@ -27,15 +27,23 @@ def set_mpi_excepthook(mpi_comm):
 
     def mpi_excepthook(exctype, value, traceback):  # pragma: no cover
         sys.__excepthook__(exctype, value, traceback)
+        sys.stderr.flush()
         mpi_comm.Abort(1)
 
     sys.excepthook = mpi_excepthook
 
 
-def start_mpi():
+def start_mpi(block_nonroot_stdout=True):
     """
     Check if MPI has already been initialized. If so, just set the communicators,
     Npus, and rank variables.
+
+    Parameters
+    ----------
+
+    block_nonroot_stdout : bool (True)
+        Redirect stdout on nonzero ranks to /dev/null, for cleaner output.
+
     """
     global world_comm, node_comm, rank_comm, rank, Npus
     if not MPI.Is_initialized():
@@ -51,10 +59,9 @@ def start_mpi():
 
     world_comm.Barrier()
 
-    if not rank == 0:  # pragma: no cover
+    if (not rank == 0) and block_nonroot_stdout:  # pragma: no cover
         # For non-root ranks, do not print to stdout.
         # (Uncovered until we have multi-rank tests)
-        global stdout
         sys.stdout = open('/dev/null', 'w')
 
 
@@ -97,7 +104,7 @@ def shared_mem_bcast(arr, root=0):
 
     if node_comm.rank == root:
         # Now fill the window on each node with the data.
-        sh_arr[:] = arr
+        sh_arr[:] = arr[()]
 
     sh_arr.flags['WRITEABLE'] = False  # Do not want ranks overwriting the data.
 
@@ -180,6 +187,40 @@ class Counter(object):
         return val
 
 
+def get_max_node_rss(return_per_node=False):
+    """
+    Find the maximum memory usage on any node in the job in bytes.
+
+    Parameters
+    ----------
+
+    return_per_node : bool (optional)
+        Return the total memory on the node to each rank on
+        that node. (Default is False)
+
+    Returns
+    -------
+
+    max_mem : float
+        Maximum memory usage in GiB across the job.
+        Only returns to the zero-th rank on the world_comm.
+    """
+
+    # On linux, getrusage returns in kiB
+    # On Mac systems, getrusage returns in B
+    scale = 1.0
+    if 'linux' in sys.platform:
+        scale = 2**10
+
+    memory_usage_GiB = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss * scale / 2**30
+    node_mem_tot = node_comm.allreduce(memory_usage_GiB, op=MPI.SUM)
+    if return_per_node:
+        return node_mem_tot
+
+    max_mem = world_comm.reduce(node_mem_tot, op=MPI.MAX, root=0)
+    return max_mem
+
+
 def get_rank():
     """
     Current rank on COMM_WORLD
diff --git a/pyuvsim/source.py b/pyuvsim/source.py
index 5a64b3c..1a3bc81 100644
--- a/pyuvsim/source.py
+++ b/pyuvsim/source.py
@@ -20,18 +20,45 @@ from . import utils as simutils
 from . import spherical_coordinates_basis_transformation as scbt
 
 
-def _skymodel_basesize():
+def estimate_skymodel_memory_usage(Ncomponents, Nfreqs):
     """
-    Estimate the memory footprint of a SkyModel with a single source.
+    Estimate the memory footprint of a SkyModel by summing the sizes
+    of the data types that go into SkyModel.
 
-    Sum the sizes of the data types that go into SkyModel
+    This aims to anticipate the full memory required to handle a SkyModel
+    class in simulation, accounting for its attributes as well as temporary
+    and intermediate data.
+
+    Parameters
+    ----------
+
+    Ncomponents : int
+        Number of source components.
+    Nfreqs : int
+        Number of frequencies per source component.
+        (size of SkyModel.freq_array)
+
+    Returns
+    -------
+    mem_est : float
+        Estimate of memory usage in bytes
     """
-    attrs = [
-        '', Quantity(1.0, 'Hz'), [0.0] * 4,
-        Angle(np.pi, 'rad'), Angle(np.pi, 'rad'),
-        [1.5] * 4, [0.3] * 2, [0.0] * 3
-    ]
-    return np.sum([sys.getsizeof(a) for a in attrs])
+
+    base_float = [1.5]    # A float
+    base_bool = [True]
+    base_str = ["source_name"]
+
+    Ncomp_attrs = {'ra': base_float, 'dec': base_float,
+                   'alt_az': 2 * base_float, 'rise_lst': base_float, 'set_lst': base_float,
+                   'pos_lmn': 3 * base_float, 'name': base_str, 'horizon_mask': base_bool}
+    Ncomp_Nfreq_attrs = {'stokes': 4 * base_float,
+                         'coherency_radec': 4 * base_float,
+                         'coherency_local': 4 * base_float}
+
+    mem_est = np.sum([sys.getsizeof(v) * Ncomponents for k, v in six.iteritems(Ncomp_attrs)])
+    mem_est += np.sum([sys.getsizeof(v) * Ncomponents * Nfreqs
+                       for k, v in six.iteritems(Ncomp_Nfreq_attrs)])
+    return mem_est
 
 
 class SkyModel(object):
@@ -68,8 +95,6 @@ class SkyModel(object):
 
     Ncomponents = None  # Number of point source components represented here.
 
-    _basesize = _skymodel_basesize()
-
     _Ncomp_attrs = ['ra', 'dec', 'coherency_radec', 'coherency_local',
                     'stokes', 'alt_az', 'rise_lst', 'set_lst', 'freq',
                     'pos_lmn', 'name', 'horizon_mask']
@@ -389,7 +414,7 @@ class SkyModel(object):
         """
         Estimate the SkyModel memory footprint in bytes
         """
-        return self.Ncomponents * self._basesize
+        return estimate_skymodel_memory_usage(self.Ncomponents, self.Nfreqs)
 
 
 def read_healpix_hdf5(hdf5_filename):
diff --git a/pyuvsim/utils.py b/pyuvsim/utils.py
index 069b4ca..a57795b 100644
--- a/pyuvsim/utils.py
+++ b/pyuvsim/utils.py
@@ -36,7 +36,14 @@ def get_version_string():
 
 class progsteps:
     """
-        Similar to a progress bar, this prints a percentage of task completion.
+    Similar to a progress bar, this prints a percentage of task completion.
+
+    Parameters
+    ----------
+
+    maxval : int
+        Maximum value to count to.
+
     """
 
     def __init__(self, maxval=None):
@@ -51,15 +58,25 @@ class progsteps:
         self.curval = -1
 
     def update(self, count):
+        """
+        Update the progress bar.
+
+        Parameters
+        ----------
+        count : int
+            Current value of counter
+        """
         if count >= self.curval + self.step:
             doprint = False
             if not self.curval == count:
                 doprint = True
                 self.curval = count
             if doprint:
-                print("{:0.2f}% completed. {:0.3f} minutes elapsed \n".format(
-                    (count / self.maxval) * 100., (pytime.time() - self.t0) / 60.))
-            sys.stdout.flush()
+                ostr = "{:0.2f}% completed. {:0.3f} minutes elapsed".format(
+                    (count / self.maxval) * 100., (pytime.time() - self.t0) / 60.)
+                ostr += '\n'
+                print(ostr)
+                sys.stdout.flush()
 
     def finish(self):
         self.update(self.maxval)
diff --git a/pyuvsim/uvsim.py b/pyuvsim/uvsim.py
index aa3bf79..9aa104c 100644
--- a/pyuvsim/uvsim.py
+++ b/pyuvsim/uvsim.py
@@ -23,7 +23,7 @@ from . import simsetup
 from . import utils as simutils
 from .antenna import Antenna
 from .baseline import Baseline
-from .source import SkyModel
+from .source import estimate_skymodel_memory_usage
 from .telescope import Telescope
 
 __all__ = ['UVTask', 'UVEngine', 'uvdata_to_task_iter', 'run_uvsim', 'run_uvdata_uvsim',
@@ -178,13 +178,13 @@ def _make_task_inds(Nbls, Ntimes, Nfreqs, Nsrcs, rank, Npus):
         Ntasks_local = Nbltf
     else:
         task_inds, Ntasks_local = simutils.iter_array_split(rank, Nbltf, Npus)
-        src_inds = range(Nsrcs)
+        src_inds = slice(None)
         Nsrcs_local = Nsrcs
 
     return task_inds, src_inds, Ntasks_local, Nsrcs_local
 
 
-def uvdata_to_task_iter(task_ids, input_uv, catalog, beam_list, beam_dict):
+def uvdata_to_task_iter(task_ids, input_uv, catalog, beam_list, beam_dict, Nsky_parts=1):
     """
     Generate local tasks, reusing quantities where possible.
 
@@ -212,17 +212,12 @@ def uvdata_to_task_iter(task_ids, input_uv, catalog, beam_list, beam_dict):
         raise TypeError("catalog must be a record array")
 
     # Splitting the catalog for memory's sake.
-    # Total memory footprint will be \approx Npus (on node) * (size of skymodel)
     Nsrcs_total = len(catalog)
-    mem_avail = simutils.get_avail_memory()
-    Npus_node = mpi.Npus_node
-    skymodel_mem_footprint = SkyModel._basesize * Nsrcs_total * Npus_node
-    if skymodel_mem_footprint > mem_avail:
-        Nsky_parts = np.ceil(skymodel_mem_footprint / float(mem_avail))
-        partsize = int(np.floor(Nsrcs_total / Nsky_parts))
-        src_iter = [range(s, s + partsize) for s in range(0, Nsrcs_total, partsize)]
+    if Nsky_parts > 1:
+        Nsky_parts = int(Nsky_parts)
+        src_iter = [simutils.iter_array_split(s, Nsrcs_total, Nsky_parts)[0]
+                    for s in range(Nsky_parts)]
     else:
-        Nsky_parts = 1
         src_iter = [slice(None)]
 
     # Build the antenna list.
@@ -251,7 +246,6 @@ def uvdata_to_task_iter(task_ids, input_uv, catalog, beam_list, beam_dict):
 
     freq_array = input_uv.freq_array * units.Hz
     time_array = Time(input_uv.time_array, scale='utc', format='jd', location=telescope.location)
-
     for src_i in src_iter:
         sky = simsetup.array_to_skymodel(catalog[src_i])
         if sky.spectral_type == 'values':
@@ -282,6 +276,7 @@ def uvdata_to_task_iter(task_ids, input_uv, catalog, beam_list, beam_dict):
             task.uvdata_index = (blti, 0, freq_i)    # 0 = spectral window index
 
             yield task
+        del sky
 
 
 def serial_gather(uvtask_list, uv_out):
@@ -340,6 +335,7 @@ def run_uvdata_uvsim(input_uv, beam_list, beam_dict=None, catalog=None):
         print('Ntimes:', input_uv.Ntimes)
         print('Nfreqs:', input_uv.Nfreqs)
         print('Nsrcs:', len(catalog))
+        sys.stdout.flush()
         uv_container = simsetup._complete_uvdata(input_uv, inplace=False)
 
     Nbls = input_uv.Nbls
@@ -356,20 +352,36 @@ def run_uvdata_uvsim(input_uv, beam_list, beam_dict=None, catalog=None):
     for bm in beam_models:
         bm.interpolation_function = 'az_za_simple'
 
+    # Estimating required memory to decide how to split source array.
+
+    Nsrcs_total = len(catalog)
+    Nsrcfreqs = np.atleast_1d(catalog['frequency'][0]).size
+    mem_avail = (simutils.get_avail_memory()
+                 - mpi.get_max_node_rss(return_per_node=True) * 2**30)
+
+    Npus_node = mpi.node_comm.Get_size()
+    skymodel_mem_footprint = estimate_skymodel_memory_usage(Nsrcs_total, Nsrcfreqs) * Npus_node
+
+    # Allow up to 50% of available memory for SkyModel data.
+    skymodel_mem_max = 0.5 * mem_avail
+
+    Nsky_parts = np.ceil(skymodel_mem_footprint / float(skymodel_mem_max))
+
+    Ntasks_tot = Ntimes * Nbls * Nfreqs * Nsky_parts
+
     local_task_iter = uvdata_to_task_iter(
-        task_inds, input_uv, catalog[src_inds], beam_models, beam_dict
+        task_inds, input_uv, catalog[src_inds], beam_models, beam_dict, Nsky_parts=Nsky_parts
     )
 
     summed_task_dict = {}
+    Ntasks_tot = comm.reduce(Ntasks_tot, op=mpi.MPI.MAX, root=0)
     if rank == 0:
-        tot = Ntimes * Nbls * Nfreqs
-        print("Tasks: ", Ntimes * Nbls * Nfreqs)
+        print("Tasks: ", Ntasks_tot)
         sys.stdout.flush()
-        pbar = simutils.progsteps(maxval=tot)
+        pbar = simutils.progsteps(maxval=Ntasks_tot)
 
     engine = UVEngine()
     count = mpi.Counter()
-
     for task in local_task_iter:
         engine.set_task(task)
         if task.uvdata_index not in summed_task_dict.keys():
@@ -378,9 +390,11 @@ def run_uvdata_uvsim(input_uv, beam_list, beam_dict=None, catalog=None):
             summed_task_dict[task.uvdata_index].visibility_vector = engine.make_visibility()
         else:
             summed_task_dict[task.uvdata_index].visibility_vector += engine.make_visibility()
+
         count.next()
         if rank == 0:
             pbar.update(count.current_value())
+
     comm.Barrier()
     count.free()
     if rank == 0:

Python exceptions are not raised in MPI
When run within MPI on Oscar, if a Python exception is raised (by any rank) the stack trace is not printed. The only information given is that MPI_Abort() was called. I've resorted to inserting "print" statements to track down bugs...

This may just be an Oscar/SLURM issue.
diff --git a/pyuvsim/tests/test_mpi_uvsim.py b/pyuvsim/tests/test_mpi_uvsim.py
index 5ae5760..fa3767c 100644
--- a/pyuvsim/tests/test_mpi_uvsim.py
+++ b/pyuvsim/tests/test_mpi_uvsim.py
@@ -9,6 +9,8 @@ import os
 import mpi4py
 import numpy as np
 import yaml
+import resource
+import time
 
 mpi4py.rc.initialize = False  # noqa
 import pytest
@@ -143,6 +145,25 @@ def test_shared_mem():
     pytest.raises(ValueError, sA.itemset, 0, 3.0)
 
 
+def test_mem_usage():
+    # Check that the mpi-enabled memory check is consistent
+    # with a local memory check.
+
+    # Also check that making a variable of a given size
+    # increases memory usage by the expected amount.
+
+    mpi.start_mpi()
+
+    memory_usage_GiB = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss * 2**10 / 2**30
+    assert memory_usage_GiB == mpi.get_max_node_rss()
+    incsize = 50 * 2**20    # 50 MiB
+    arr = bytearray(incsize)
+    time.sleep(1)
+    change = mpi.get_max_node_rss() - memory_usage_GiB
+    assert np.isclose(change, incsize / 2**30, atol=5e-2)
+    del arr
+
+
 @pytest.mark.skip
 def test_mpi_counter():
     # This test should be run in parallel to check likely bug sources.
diff --git a/pyuvsim/tests/test_uvsim.py b/pyuvsim/tests/test_uvsim.py
index d3aa580..4ffea32 100644
--- a/pyuvsim/tests/test_uvsim.py
+++ b/pyuvsim/tests/test_uvsim.py
@@ -603,6 +603,7 @@ def test_task_coverage():
             task_inds, src_inds, Ntasks_local, Nsrcs_local = pyuvsim.uvsim._make_task_inds(
                 Nbls, Ntimes, Nfreqs, Nsrcs, rank, Npus
             )
+            src_inds = range(Nsrcs)[src_inds]   # Turn slice into iterator
             tasks = itertools.product(task_inds, src_inds)
             tasks_all.append(tasks)
         tasks_all = itertools.chain(*tasks_all)
@@ -652,7 +653,7 @@ def test_source_splitting():
     )
 
     # Spoof environmental parameters.
-    # Choose an absurdlly large number of Npus per node and very small available memory
+    # Choose an absurdly large number of tasks per node and very small available memory
     # to trigger the source splitting condition in uvdata_to_task_iter
     # The alternative would be to make a very large source catalog, but that's not ideal in a test.
     Npus_node = 2000
@@ -667,13 +668,6 @@ def test_source_splitting():
     Nsrcs = len(sources)
     Ntasks = Nblts * Nfreqs
     beam_dict = None
-    taskiter = pyuvsim.uvdata_to_task_iter(
-        np.arange(Ntasks), hera_uv, sources, beam_list, beam_dict
-    )
-    uvtask_list = uvtest.checkWarnings(
-        list, [taskiter], message='The default for the `center` keyword has changed.',
-        category=DeprecationWarning
-    )
 
     skymodel = pyuvsim.array_to_skymodel(sources)
     skymodel_mem_footprint = skymodel.get_size() * Npus_node
@@ -682,14 +676,20 @@ def test_source_splitting():
     Nsky_parts = np.ceil(skymodel_mem_footprint / float(mem_avail))
     partsize = int(np.floor(Nsrcs / Nsky_parts))
 
-    assert partsize * pyuvsim.SkyModel._basesize * Npus_node < mem_avail
-    print(skymodel_mem_footprint / 1e6,
-          partsize * pyuvsim.SkyModel._basesize * Npus_node / 1e6,
-          mem_avail / 1e6)
+    taskiter = pyuvsim.uvdata_to_task_iter(
+        np.arange(Ntasks), hera_uv, sources, beam_list, beam_dict, Nsky_parts=Nsky_parts
+    )
+
+    uvtask_list = uvtest.checkWarnings(
+        list, [taskiter], message='The default for the `center` keyword has changed.',
+        category=DeprecationWarning
+    )
+
+    assert pyuvsim.estimate_skymodel_memory_usage(partsize, 1) * Npus_node < mem_avail
 
     # Normally, the number of tasks is Nbls * Ntimes * Nfreqs (partsize = Nsrcs)
     # If the source list is split within the task iterator, then it will be larger.
-    assert len(uvtask_list) == Ntasks * Nsrcs / partsize
+    assert len(uvtask_list) == Ntasks * Nsky_parts
 
     # Reset spoofed parameters.
     del os.environ['SLURM_MEM_PER_NODE']

environment.yml
pip install -e .[all]
parse_log_pytest
environment.yml
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster @ file:///home/conda/feedstock_root/build_artifacts/alabaster_1704848697227/work
astropy @ file:///home/conda/feedstock_root/build_artifacts/astropy_1648762837606/work
astropy-healpix @ file:///home/conda/feedstock_root/build_artifacts/astropy-healpix_1636593173844/work
asttokens @ file:///home/conda/feedstock_root/build_artifacts/asttokens_1733250440834/work
babel @ file:///home/conda/feedstock_root/build_artifacts/babel_1738490167835/work
Brotli @ file:///home/conda/feedstock_root/build_artifacts/brotli-split_1648883617327/work
cached-property @ file:///home/conda/feedstock_root/build_artifacts/cached_property_1615209429212/work
certifi @ file:///home/conda/feedstock_root/build_artifacts/certifi_1739515848642/work/certifi
cffi @ file:///home/conda/feedstock_root/build_artifacts/cffi_1636046055389/work
charset-normalizer @ file:///home/conda/feedstock_root/build_artifacts/charset-normalizer_1735929714516/work
colorama @ file:///home/conda/feedstock_root/build_artifacts/colorama_1733218098505/work
coverage @ file:///home/conda/feedstock_root/build_artifacts/coverage_1743381221492/work
decorator @ file:///home/conda/feedstock_root/build_artifacts/decorator_1740384970518/work
docutils @ file:///home/conda/feedstock_root/build_artifacts/docutils_1733217766141/work
exceptiongroup @ file:///home/conda/feedstock_root/build_artifacts/exceptiongroup_1733208806608/work
executing @ file:///home/conda/feedstock_root/build_artifacts/executing_1733569351617/work
flake8 @ file:///home/conda/feedstock_root/build_artifacts/flake8_1739898391164/work
h2 @ file:///home/conda/feedstock_root/build_artifacts/h2_1738578511449/work
h5py @ file:///home/conda/feedstock_root/build_artifacts/h5py_1637963928098/work
hpack @ file:///home/conda/feedstock_root/build_artifacts/hpack_1737618293087/work
hyperframe @ file:///home/conda/feedstock_root/build_artifacts/hyperframe_1737618333194/work
idna @ file:///home/conda/feedstock_root/build_artifacts/idna_1733211830134/work
imagesize @ file:///home/conda/feedstock_root/build_artifacts/imagesize_1656939531508/work
importlib_metadata @ file:///home/conda/feedstock_root/build_artifacts/importlib-metadata_1737420181517/work
iniconfig @ file:///home/conda/feedstock_root/build_artifacts/iniconfig_1733223141826/work
ipython @ file:///home/conda/feedstock_root/build_artifacts/ipython_1701831663892/work
jedi @ file:///home/conda/feedstock_root/build_artifacts/jedi_1733300866624/work
Jinja2 @ file:///home/conda/feedstock_root/build_artifacts/jinja2_1741263328855/work
line-profiler @ file:///home/conda/feedstock_root/build_artifacts/line_profiler_1647944775158/work
MarkupSafe @ file:///home/conda/feedstock_root/build_artifacts/markupsafe_1648737556467/work
matplotlib-inline @ file:///home/conda/feedstock_root/build_artifacts/matplotlib-inline_1733416936468/work
mccabe @ file:///home/conda/feedstock_root/build_artifacts/mccabe_1733216466933/work
mpi4py @ file:///home/conda/feedstock_root/build_artifacts/mpi4py_1649057544067/work
numpy @ file:///home/conda/feedstock_root/build_artifacts/numpy_1651020388495/work
packaging @ file:///home/conda/feedstock_root/build_artifacts/packaging_1733203243479/work
parso @ file:///home/conda/feedstock_root/build_artifacts/parso_1733271261340/work
pexpect @ file:///home/conda/feedstock_root/build_artifacts/pexpect_1733301927746/work
pickleshare @ file:///home/conda/feedstock_root/build_artifacts/pickleshare_1733327343728/work
pluggy @ file:///home/conda/feedstock_root/build_artifacts/pluggy_1733222765875/work
prompt_toolkit @ file:///home/conda/feedstock_root/build_artifacts/prompt-toolkit_1737453357274/work
psutil @ file:///home/conda/feedstock_root/build_artifacts/psutil_1653089170447/work
ptyprocess @ file:///home/conda/feedstock_root/build_artifacts/ptyprocess_1733302279685/work/dist/ptyprocess-0.7.0-py2.py3-none-any.whl#sha256=92c32ff62b5fd8cf325bec5ab90d7be3d2a8ca8c8a3813ff487a8d2002630d1f
pure_eval @ file:///home/conda/feedstock_root/build_artifacts/pure_eval_1733569405015/work
pycodestyle @ file:///home/conda/feedstock_root/build_artifacts/pycodestyle_1733216196861/work
pycparser @ file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_pycparser_1733195786/work
pyerfa @ file:///home/conda/feedstock_root/build_artifacts/pyerfa_1649586113326/work
pyflakes @ file:///home/conda/feedstock_root/build_artifacts/pyflakes_1733216066937/work
Pygments @ file:///home/conda/feedstock_root/build_artifacts/pygments_1736243443484/work
pypandoc @ file:///home/conda/feedstock_root/build_artifacts/pypandoc_1736408856226/work
PySocks @ file:///home/conda/feedstock_root/build_artifacts/pysocks_1733217236728/work
pytest @ file:///home/conda/feedstock_root/build_artifacts/pytest_1740946542080/work
pytest-cov @ file:///home/conda/feedstock_root/build_artifacts/pytest-cov_1733223023082/work
pytest-runner @ file:///home/conda/feedstock_root/build_artifacts/pytest-runner_1646158889426/work
pytz @ file:///home/conda/feedstock_root/build_artifacts/pytz_1742920838005/work
pyuvdata @ file:///home/conda/feedstock_root/build_artifacts/pyuvdata_1645031242270/work
-e git+https://github.com/RadioAstronomySoftwareGroup/pyuvsim.git@1615bb7ec5325aebed2da75f8da075f46938c035#egg=pyuvsim
PyYAML @ file:///home/conda/feedstock_root/build_artifacts/pyyaml_1648757097602/work
requests @ file:///home/conda/feedstock_root/build_artifacts/requests_1733217035951/work
scipy @ file:///home/conda/feedstock_root/build_artifacts/scipy_1653073865807/work
setuptools-scm @ file:///home/conda/feedstock_root/build_artifacts/setuptools_scm_1742403392659/work
six @ file:///home/conda/feedstock_root/build_artifacts/six_1733380938961/work
snowballstemmer @ file:///home/conda/feedstock_root/build_artifacts/snowballstemmer_1637143057757/work
Sphinx @ file:///home/conda/feedstock_root/build_artifacts/sphinx_1721487534232/work
sphinxcontrib-applehelp @ file:///home/conda/feedstock_root/build_artifacts/sphinxcontrib-applehelp_1733754101641/work
sphinxcontrib-devhelp @ file:///home/conda/feedstock_root/build_artifacts/sphinxcontrib-devhelp_1733754113405/work
sphinxcontrib-htmlhelp @ file:///home/conda/feedstock_root/build_artifacts/sphinxcontrib-htmlhelp_1733754280555/work
sphinxcontrib-jsmath @ file:///home/conda/feedstock_root/build_artifacts/sphinxcontrib-jsmath_1733753744933/work
sphinxcontrib-qthelp @ file:///home/conda/feedstock_root/build_artifacts/sphinxcontrib-qthelp_1733753408017/work
sphinxcontrib-serializinghtml @ file:///home/conda/feedstock_root/build_artifacts/sphinxcontrib-serializinghtml_1733750479108/work
stack_data @ file:///home/conda/feedstock_root/build_artifacts/stack_data_1733569443808/work
toml @ file:///home/conda/feedstock_root/build_artifacts/toml_1734091811753/work
tomli @ file:///home/conda/feedstock_root/build_artifacts/tomli_1733256695513/work
traitlets @ file:///home/conda/feedstock_root/build_artifacts/traitlets_1733367359838/work
typing_extensions @ file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_typing_extensions_1743201626/work
urllib3 @ file:///home/conda/feedstock_root/build_artifacts/urllib3_1734859416348/work
wcwidth @ file:///home/conda/feedstock_root/build_artifacts/wcwidth_1733231326287/work
zipp @ file:///home/conda/feedstock_root/build_artifacts/zipp_1732827521216/work
zstandard @ file:///croot/zstandard_1731356346222/work

name: pyuvsim
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - alabaster=0.7.16=pyhd8ed1ab_0
  - astropy=5.0.4=py39hd257fcd_0
  - astropy-healpix=0.6=py39hce5d2b2_1
  - asttokens=3.0.0=pyhd8ed1ab_1
  - babel=2.17.0=pyhd8ed1ab_0
  - brotli-python=1.0.9=py39h5a03fae_7
  - c-ares=1.19.1=h5eee18b_0
  - ca-certificates=2025.2.25=h06a4308_0
  - cached-property=1.5.2=hd8ed1ab_1
  - cached_property=1.5.2=pyha770c72_1
  - certifi=2025.1.31=pyhd8ed1ab_0
  - cffi=1.15.0=py39h4bc2ebd_0
  - charset-normalizer=3.4.1=pyhd8ed1ab_0
  - colorama=0.4.6=pyhd8ed1ab_1
  - coverage=7.8.0=pyhe1237c8_0
  - decorator=5.2.1=pyhd8ed1ab_0
  - docutils=0.21.2=pyhd8ed1ab_1
  - exceptiongroup=1.2.2=pyhd8ed1ab_1
  - executing=2.1.0=pyhd8ed1ab_1
  - flake8=7.1.2=pyhd8ed1ab_0
  - h2=4.2.0=pyhd8ed1ab_0
  - h5py=3.6.0=nompi_py39h7e08c79_100
  - hdf5=1.12.1=h2b7332f_3
  - hpack=4.1.0=pyhd8ed1ab_0
  - hyperframe=6.1.0=pyhd8ed1ab_0
  - idna=3.10=pyhd8ed1ab_1
  - imagesize=1.4.1=pyhd8ed1ab_0
  - importlib-metadata=8.6.1=pyha770c72_0
  - iniconfig=2.0.0=pyhd8ed1ab_1
  - ipython=8.18.1=pyh707e725_3
  - jedi=0.19.2=pyhd8ed1ab_1
  - jinja2=3.1.6=pyhd8ed1ab_0
  - krb5=1.20.1=h143b758_1
  - ld_impl_linux-64=2.40=h12ee557_0
  - libblas=3.9.0=16_linux64_openblas
  - libcblas=3.9.0=16_linux64_openblas
  - libcurl=8.12.1=hc9e6f67_0
  - libedit=3.1.20230828=h5eee18b_0
  - libev=4.33=h516909a_1
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgfortran-ng=13.2.0=h69a702a_0
  - libgfortran5=13.2.0=ha4646dd_0
  - libgomp=11.2.0=h1234567_1
  - liblapack=3.9.0=16_linux64_openblas
  - libnghttp2=1.57.0=h2d74bed_0
  - libopenblas=0.3.21=h043d6bf_0
  - libssh2=1.11.1=h251f7ec_0
  - libstdcxx-ng=11.2.0=h1234567_1
  - line_profiler=3.4.0=py39hf939315_1
  - lz4-c=1.9.4=h6a678d5_1
  - markupsafe=2.1.1=py39hb9d737c_1
  - matplotlib-inline=0.1.7=pyhd8ed1ab_1
  - mccabe=0.7.0=pyhd8ed1ab_1
  - mpi=1.0=mpich
  - mpi4py=3.1.3=py39h32b9844_1
  - mpich=4.0.2=h846660c_100
  - ncurses=6.4=h6a678d5_0
  - numpy=1.22.3=py39hc58783e_2
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=pyhd8ed1ab_2
  - pandoc=3.6.4=ha770c72_0
  - parso=0.8.4=pyhd8ed1ab_1
  - pexpect=4.9.0=pyhd8ed1ab_1
  - pickleshare=0.7.5=pyhd8ed1ab_1004
  - pip=25.0.1=pyh8b19718_0
  - pluggy=1.5.0=pyhd8ed1ab_1
  - prompt-toolkit=3.0.50=pyha770c72_0
  - psutil=5.9.1=py39hb9d737c_0
  - ptyprocess=0.7.0=pyhd8ed1ab_1
  - pure_eval=0.2.3=pyhd8ed1ab_1
  - pycodestyle=2.12.1=pyhd8ed1ab_1
  - pycparser=2.22=pyh29332c3_1
  - pyerfa=2.0.0.1=py39hd257fcd_2
  - pyflakes=3.2.0=pyhd8ed1ab_1
  - pygments=2.19.1=pyhd8ed1ab_0
  - pypandoc=1.15=pyhd8ed1ab_0
  - pysocks=1.7.1=pyha55dd90_7
  - pytest=8.3.5=pyhd8ed1ab_0
  - pytest-cov=6.0.0=pyhd8ed1ab_1
  - pytest-runner=6.0.0=pyhd8ed1ab_0
  - python=3.9.21=he870216_1
  - python_abi=3.9=2_cp39
  - pytz=2025.2=pyhd8ed1ab_0
  - pyuvdata=2.2.8=py39he80948d_0
  - pyyaml=6.0=py39hb9d737c_4
  - readline=8.2=h5eee18b_0
  - requests=2.32.3=pyhd8ed1ab_1
  - scipy=1.8.1=py39he49c0e8_0
  - setuptools=75.8.2=pyhff2d567_0
  - setuptools-scm=8.2.1=pyhd8ed1ab_0
  - setuptools_scm=8.2.1=hd8ed1ab_0
  - six=1.17.0=pyhd8ed1ab_0
  - snowballstemmer=2.2.0=pyhd8ed1ab_0
  - sphinx=7.4.7=pyhd8ed1ab_0
  - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1
  - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1
  - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1
  - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1
  - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1
  - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1
  - sqlite=3.45.3=h5eee18b_0
  - stack_data=0.6.3=pyhd8ed1ab_1
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd8ed1ab_1
  - tomli=2.2.1=pyhd8ed1ab_1
  - traitlets=5.14.3=pyhd8ed1ab_1
  - typing-extensions=4.13.0=h9fa5a19_1
  - typing_extensions=4.13.0=pyh29332c3_1
  - tzdata=2025a=h04d1e81_0
  - urllib3=2.3.0=pyhd8ed1ab_0
  - wcwidth=0.2.13=pyhd8ed1ab_1
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - yaml=0.2.5=h7f98852_2
  - zipp=3.21.0=pyhd8ed1ab_1
  - zlib=1.2.13=h5eee18b_1
  - zstandard=0.23.0=py39h2c38b39_1
  - zstd=1.5.6=hc292b87_0
prefix: /opt/conda/envs/pyuvsim

pyuvsim/tests/test_mpi_uvsim.py::test_mem_usage pyuvsim/tests/test_uvsim.py::test_task_coverage
pyuvsim/tests/test_mpi_uvsim.py::test_mpi_version pyuvsim/tests/test_mpi_uvsim.py::test_run_uvsim pyuvsim/tests/test_mpi_uvsim.py::test_run_paramfile_uvsim pyuvsim/tests/test_mpi_uvsim.py::test_run_paramdict_uvsim pyuvsim/tests/test_uvsim.py::test_single_offzenith_source_uvfits pyuvsim/tests/test_uvsim.py::test_offzenith_source_multibl_uvfits pyuvsim/tests/test_uvsim.py::test_file_to_tasks pyuvsim/tests/test_uvsim.py::test_gather pyuvsim/tests/test_uvsim.py::test_local_task_gen pyuvsim/tests/test_uvsim.py::test_source_splitting
pyuvsim/tests/test_mpi_uvsim.py::test_mpi_funcs pyuvsim/tests/test_mpi_uvsim.py::test_shared_mem pyuvsim/tests/test_uvsim.py::test_visibility_single_zenith_source pyuvsim/tests/test_uvsim.py::test_visibility_source_below_horizon pyuvsim/tests/test_uvsim.py::test_visibility_source_below_horizon_radec pyuvsim/tests/test_uvsim.py::test_visibility_single_zenith_source_uvdata pyuvsim/tests/test_uvsim.py::test_redundant_baselines pyuvsim/tests/test_uvsim.py::test_pol_error pyuvsim/tests/test_uvsim.py::test_get_beam_jones
pyuvsim/mpi.py pyuvsim/uvsim.py pyuvsim/utils.py CHANGELOG.md environment.yml pyuvsim/source.py
pyuvsim/mpi.py pyuvsim/uvsim.py pyuvsim/utils.py CHANGELOG.md environment.yml pyuvsim/source.py