- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello Intel Community,
I am facing an interesting problem when attempting to compile couple of routines to create .dlls which are to be used by the Ansys FE software.
Currently, we are trying to compile a simple example of a user-material subroutine (fsimple.f attached) which has an INCLUDE statement for neml_interface.f (attached). For more information on the origin of this example, refer to the open source code here https://github.com/Argonne-National-Laboratory/neml/tree/dev/util/f_interface. The NEML libraries were built following the instructions here: https://neml.readthedocs.io/en/dev/install/windows.html
When invoking (local machine is Win 10, Intel Compiler 2019 Update 3, VS v15.0.2..)
ifort fsimple.f neml_interface.f
in Intel shell, the following error emerges
neml_interface.f(78): error #5082: Syntax error, found END-OF-FILE when expecting one of: <LABEL> <END-OF-STATEMENT> ; <IDENTIFIER> TYPE MODULE ELEMENTAL IMPURE NON_RECURSIVE ...
end interface
-------------------^
compilation aborted for neml_interface.f (code 1)
The same happens when attempting to compile the purpose-built user-material source code and attempting to link it to Ansys by calling Ansys-specific .bat file which builds the dlls (this batch file virtually defines machine/compiler settings and issues ifort commands etc).
The issue is puzzling because other collaborators have shared that the sample test code above, as well as the user-material Ansys routines, compile and build dlls without facing issues with the INTERFACE block on other Windows setups (e.g Win 10, Intel API 2020+, VS 2019). Any feedback would be greatly appreciated!
Many thanks,
M
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
A better solution, instead including the file with the interface blocks in every place where those interfaces are needed, is to put the interfaces inside a module, and add a USE statement for that module where needed.
Regarding the unresolved external symbols, please note that providing interfaces only gives the compiler information regarding what argument types are expected, etc.; in other words, the interface. You still need to provide (in an OBJ or LIB file) the implementations of those routines. Whether these implementations are provided by Ansys, you or a fourth party, I cannot tell. You will have to obtain that information elsewhere.
The topic of interfaces, implementations, etc., is the topic of Fortran books and tutorials, of which many are available on the Web and easily found using a search engine.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The explanation is quite simple. The source file neml_interface.f contains just an interface block, which is not quite a complete and compilable program unit. In fact, your fsimple.f contains an include statement for neml_interface.f.
You would be better off by naming a source file containing a code section that is meant to be included in another source file with a ".inc" suffix rather than a ".f" or ".f90" suffix. Alternatively, configure your project so that neml_interface.f is not regarded as a self-contained Fortran source file and a compilation attempted.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the info, mecej4. For the second option, would that mean placing the INTERFACE block inside the fsimple.f program? When I do that, error LNK2019: unresolved external symbol appears for al the functions/subroutines inside the INTERFACE block.
Would you be able to provide more info on the .inc file option ? Thanks in advance!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
A better solution, instead including the file with the interface blocks in every place where those interfaces are needed, is to put the interfaces inside a module, and add a USE statement for that module where needed.
Regarding the unresolved external symbols, please note that providing interfaces only gives the compiler information regarding what argument types are expected, etc.; in other words, the interface. You still need to provide (in an OBJ or LIB file) the implementations of those routines. Whether these implementations are provided by Ansys, you or a fourth party, I cannot tell. You will have to obtain that information elsewhere.
The topic of interfaces, implementations, etc., is the topic of Fortran books and tutorials, of which many are available on the Web and easily found using a search engine.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you mecej4. I will explore the module and use option. Much appreciated!
![](/skins/images/45C6C2D737ED71F4C51F0145C8CB1E9C/responsive_peak/images/icon_anonymous_message.png)
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page