What Fortran code generation tools work well with Visual Studio 2019?
We develop an technical application with a C# front end and a Fortran DLL for number crunching within Visual Studio (2013 but 2019 real soon now). One part of the code we want to improve has a lot of boiler-plate code - essentially a map/reduce over a hierarchy of derived types, but with a small number of different reduce operations (max, min, sum, weighted average, etc) for the components. Much of the code could be generated automatically from templates.
Now I come from a unix background. In the past I would have used make and awk, cpp, m4 or python to do this. I am now working in a Visual Studio environment with C# programmers and they have expressed a STRONG preference for a solution within Visual Studio.
The Intel Fortran pre-proccessor may do the job. Are there any alternatives?
if you do a search on C# in this forum you will find a note on connecting C# to Fortran -- it is not nice and it is not easy takes several hours to do it. And the results are less than brilliant, I code in both languages, not because I want to -- I don't but the main sensor we use has only C# drivers and we cannot communicate with Fortran - but if you are doing anything computational then Fortran is better -- at least twice as fast.
Good luck -- sorry I could not find the old program where I got it running - you could try doing it as a check program - run the Fortran program in the background and let the C# flag when it wants something done, this will be better as you should run in different threads -- which is always faster, I would just use a file to transfer the data, even a lot of data transferred through a file if you multithread will be faster than any single thread for most applications.
Look at the C# to C/C++ interfacing information. C# uses managed code with structured exception handling. Whereas Fortran uses unmanaged code without structured exception handling. So your C# has to call unmanaged code, either directly to Fortran or to a shell function written in C/C++ which then calls the unmanaged Fortran code. The argument passing must be compatible. IOW no C# container (e.g. string, C# array descriptor, ...).
Additionally, be aware that the typical C# multi-threaded programming paradigm is:
Spawn new thread, do work, join/terminate thread
resulting in each "do work" having separate thread ID (which may get reused after some long period).
This will not be a problem calling Fortran (or C/C++) *** provided that the Fortran (or C/C++) is serial (thread-safe) code.
If (when) your Fortran (or C/C++) is OpenMP parallel code, this will be problematic due to each C# thread (with different thread ID) calling the Fortran (or C/C++) OpenMP code will instantiate a new OpenMP thread pool. This will look like a memory leak at least, oversubscription as an annoyance, and out of memory/resources eventually at worst.
The work around (when the Fortran/C/C++ portion uses OpenMP) is to assure that the same C# thread (ID) makes all the calls to said code.