Skip to content

Multi-phase CCD causes ArCTIc to crash #72

Description

@AstroSaad

Hello!

I'm currently trying to use ArCTIc to look at serial CTI effects on the Gaia data. I used the latest git commit and built ArCTIc through the source. Gaia uses a 2-phase serial register design. However, whenever I try to run a 2-phase simulation, the code crashes and python restarts. The code I've been using looks like the following

roe = ac.ROE(
    dwell_times = [0.5, 0.5],
    empty_traps_between_columns=True,
    empty_traps_for_first_transfers=False,
    use_integer_express_matrix=False    
)
# 2-phase CCD design details
Serial_ccd = ac.CCD(
    phases=[ac.CCDPhase(
                full_well_depth=475000,
                well_notch_depth=0.0,
                well_fill_power=0.58),
            ac.CCDPhase(
                full_well_depth=475000,
                well_notch_depth=0.0,
                well_fill_power=0.58)],
    fraction_of_traps_per_phase=[0.5,0.5]
    )
image_cti = ac.add_cti(
    image=image1,
    parallel_traps=None,
    parallel_ccd=None,
    parallel_roe=None,
    serial_traps = serial_traps1,
    serial_ccd=Serial_ccd,
    serial_roe=roe)

The image and traps are as follows:

serial_traps1 = [
    ac.TrapInstantCapture(density=0.05,release_timescale = 0.5/t_clock),
    ac.TrapInstantCapture(density=4.0,release_timescale = 1.25e-7/t_clock),
    ac.TrapInstantCapture(density=1.5,release_timescale = 6e-7/t_clock)
    ]
image1 = np.zeros((4,1966))
image1[0:2,20:25] = 10000.0
image1[2:4,1945:1950] = 10000.0

I've tried setting OMP_NUM_THREADS=1 but this also causes the code to crash with segmentation errors in Python.

I ran the python code with lldb and used bt to backtrace the error.

* thread #4, stop reason = EXC_BAD_ACCESS (code=1, address=0x40c3880000000018)
  * frame #0: 0x00000001014a3afc wrapper.cpython-310-darwin.soclock_charge_in_one_direction(std::__1::valarray<std::__1::valarray<double>>&, ROE*, CCD*, std::__1::valarray<TrapInstantCapture>*, std::__1::valarray<TrapSlowCapture>*, std::__1::valarray<TrapInstantCaptureContinuum>*, std::__1::valarray<TrapSlowCaptureContinuum>*, int, int, int, int, int, int, int, int, double, int, int, int) (.omp_outlined) + 1788
    frame #1: 0x000000010090d81c libomp.dylib__kmp_invoke_microtask + 156
    frame #2: 0x00000001008a7ccc libomp.dylib__kmp_invoke_task_func + 336
    frame #3: 0x00000001008a6988 libomp.dylib__kmp_launch_thread + 420
    frame #4: 0x00000001008eebcc libomp.dylib__kmp_launch_worker(void*) + 280
    frame #5: 0x000000018a58dc58 libsystem_pthread.dylib_pthread_start + 136

The code runs fine if I change it to a single phase device so it seems like it is the multi-phase aspect that it doesn't like.

Please let me know if there is an easy fix. In your 2025 paper, you said single phase is a good approximation for multi-phase if the densities are re-scaled. Can you confirm that is still the case?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions