OceanParcels / Parcels

Main code for Parcels (Probably A Really Computationally Efficient Lagrangian Simulator)
https://www.oceanparcels.org
MIT License
289 stars 127 forks source link

(Windows only) "access violation" when running simulations with custom kernels #1671

Open VeckoTheGecko opened 2 weeks ago

VeckoTheGecko commented 2 weeks ago

parcels 3.0.4

When running on Windows, occasionally (without seeming to have changed any code) one can run into an access violation error.

E.g.,

INFO: Compiled GalapagosParticleAdvectionRK4SampleGalapagosAge ==> C:\Users\ADMINI~1\AppData\Local\Temp\parcels-tmp\b3cd2748cfdf0ad1ba5ba70184487415.dll
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-19-5733fa7ebae1> in <module>
     19 
     20 pset.execute(AdvectionRK4+pset.Kernel(SampleGalapagos)+Age, dt=delta(hours=1), output_file=outfile,
---> 21              recovery={ErrorCode.ErrorOutOfBounds: DeleteParticle})

E:\ProgramData\Anaconda3\envs\parcels\lib\site-packages\parcels\particleset.py in execute(self, pyfunc, endtime, runtime, dt, moviedt, recovery, output_file, movie_background_field, verbose_progress)
    418             else:
    419                 time = max(next_prelease, next_input, next_output, next_movie, endtime)
--> 420             self.kernel.execute(self, endtime=time, dt=dt, recovery=recovery, output_file=output_file)
    421             if abs(time-next_prelease) < tol:
    422                 pset_new = ParticleSet(fieldset=self.fieldset, time=time, lon=self.repeatlon,

E:\ProgramData\Anaconda3\envs\parcels\lib\site-packages\parcels\kernel.py in execute(self, pset, endtime, dt, recovery, output_file)
    274         # Execute the kernel over the particle set
    275         if self.ptype.uses_jit:
--> 276             self.execute_jit(pset, endtime, dt)
    277         else:
    278             self.execute_python(pset, endtime, dt)

E:\ProgramData\Anaconda3\envs\parcels\lib\site-packages\parcels\kernel.py in execute_jit(self, pset, endtime, dt)
    203         particle_data = pset._particle_data.ctypes.data_as(c_void_p)
    204         self._function(c_int(len(pset)), particle_data,
--> 205                        c_double(endtime), c_float(dt), *fargs)
    206 
    207     def execute_python(self, pset, endtime, dt):

OSError: exception: access violation reading 0x00000186DEE83138

It's an issue we've encountered a few times before (#793 , #1232). This issue is due to the conversion of the kernels to C, although why this would only crop up on Windows is a mystery to me

First step is to come up with a minimal reproducible example.

VeckoTheGecko commented 2 weeks ago

@erikvansebille ignore that comment I just deleted and don't click on any links from it. GitHub is experiencing a malware spam problem the last couple of days.

I thought a genuine response with a reproducible example would be a bit quick