See mod_floats.F90 for "drifters". The only example I have is 15 years old,
ATLb_floats.tar.gz there is an initial floats.input and each model run produces a floats.input_out (see floats.input_002 for example) to serve as the "restart" for the next segment (where it is renamed floats.input). The float data is a text file floats.out. I renamed all .com files as .csh, and 016.csh contains the needed floats scripting logic.
This isn't really designed for a large number of "particles", but it does provide a basic drifter capability.
Alan.