rich-iannone / splitr

Use the HYSPLIT model from inside R and do more with it
Other
141 stars 60 forks source link

fix: enable proper running of backward dispersion models #82

Open AlFontal opened 1 year ago

AlFontal commented 1 year ago

This addresses #81, and also could be considered to address #66.

Basically, there were 2 really small errors that made the logic of running backwards dispersion models not work.

For starters, the run_model function has a hardcoded 'forward' parameter, so no matter the direction specified in add_dispersion_params, the hysplit_dispersion function always received 'forward' as the parameter. This is fixed in commit caead2f.

Second, the add_dispersion_params function has no duration parameter. The value of duration that is passed onto hysplit_dispersion is computed by the difference in hours between start_time and end_time:

https://github.com/rich-iannone/splitr/blob/44851122514e1296291f0e9b082326717549715f/R/run_model.R#L51

In a backwards model, the end_time is before the start_time, so this variable takes negative values.

When writing the CONTROL file, however, there is an ifelse clause that prepends a '-' to the duration value. In the case of an already negative value, this writes a line with --duration, leading to a faulty CONTROL file that HYSPLIT doesn't accept and it just doesn't run. Removing the ifelse clause seems to work and is what I did in d4ca419.

It would be also nice to add some examples on how to run backward dispersion models, as there is none as of now.

I think that without this PR, a hacky way of running backward dispersion models is to simply use an end_time that is earlier than the start_time by as many hours as is desired, and then simply input forward in the direction parameter. This will write a negative duration value to the CONTROL file and HYSPLIT will read it and run it in backward mode anyway.

I am rather unfamiliar on R package development as I am mainly a python developer, so I am pretty sure this PR might need several extra steps to make it workable.