I would throw down the following:

1. There is one programmer here. Screw politics. They know their trade. You know yours. Mark that territory even if you have to piss on it. They're scientists. They can respect that sort of thing or should since they're pretty much constantly doing the same themselves. Through whatever means you can, mark the boundaries now. This is what I'll fix. This is what I can't be responsible for.

2. Scientists write/test the algorithms. Scientists who want to can write their own algorithms in 1-3 languages everybody can agree on for you to convert to core code. That puts testing their stuff on them. Beyond that, they're going to have to help you isolate the important science stuff vs. the good-god-knows-what they did for architecture. The codebase is hosed. There's lots of slash and burn that's going to need to be done. Give them options to hand you working versions of stuff that employs what they know best so you can do what you do best. Stick their knowledge in a box that they're responsible for but that you can work with. Ideally when things go well on a mega-refactor conversations will be more about what sorts of exciting things you can do with interface rather than what tentacle Z9 of drBobsFuncStructObjThingMk2_0109 did when it pissed off global var X19a91.

3. Use an event-driven-friendly language with first class functions if you can. When all else fails, triggering an event or tossing a callback to some object with an interface and state mechanism that actually makes sense can be a huge time-saver when you're knee-deep in code that makes no bloody sense and quite possibly never will. Scientists seem to like Python. Not hard to glue lower-level math-intensive C stuff with that. Just sayin'

4. Look for somebody who has solved this or a similar problem. Spend some serious time researching. These guys heard about G2 from somebody.

5. Design Patterns. Adapters. Use 'em. Use 'em a lot in situations like this.

6. Learn what you can of the science. The more you know, the better you can determine intent in the code.