The most simple and safe solution I can up with is to make FormData an immutable class (so notwhen the form data is shared and passed around between different calculations without copying will be ever needed to make sure, there arewill no side effects, even in a multithreaded context). Then pass one FormData object into the calculation where it makes most sense and reuse this "freezed" set of data throughout the calculation.
This might involve some work in the code where the FormData gets uploaded to make it immutable. But if that ends up in "a lot of work" in the calculation code, I think you are doing something utterly wrong: holding the data in a new member variable and using the data for the individual calcucation from there instead from a single, shared static global variable looks to me only like a slight change, not a huge one.