Nat aveva ragione che ad Aspen non importa quanto il compilatore può produrre una DLL dal codice Fortran 90 (che la maggior parte fa). Tuttavia, ho trovato che i file Aspen che devono essere inclusi nella maggior parte dei modelli utente sono scritti in formato fisso (lo stile di formattazione usato con Fortran 77). Quindi, quando si utilizza il codice di Fortran 90 in formato gratuito si ottiene un sacco di errori del compilatore a causa del mix di formattazione fissa e gratuita. C'è un soluzione comunque: metti le direttive intorno alle righe include che passano al formato fisso solo per i file inclusi.
Ecco un esempio che ho ricevuto dal centro di supporto Aspen. È un modello utente che dovrebbe calcolare la viscosità di un composto.
SUBROUTINE MUL2U (T, P, Z, N, IDX, &
IRW, IIW, KCALC, KOP, NDS, &
KDIAG, QMX, DQMX, KER)
IMPLICIT REAL*8 (A-H,O-Z)
#include "dms_plex.cmn"
#include "ppexec_user.cmn"
integer b(1)
equivalence (b(1), ib(1))
integer dms_ifcmnc
integer limuusr
limuusr=dms_ifcmnc('MUUSR')
! The following input language is required to define A and B
! (just define them for the 1st component in the list)
! PROPERTIES RKS-MU SOLU-WATER=2
! PROPERTIES RK-SOAVE
! PROP-REPLACE RKS-MU RK-SOAVE
! PROP MULMX MULMXUSR
! USER-PROPS MUUSR 1 1 2
!
! PROP-DATA MUUSR-1
! PROP-LIST MUUSR
! PVAL WATER -5 20
! To check that parameters are correctly transferred, set global diagnostics:
! HISTORY PROP-LEVEL=5
AA = B(limuusr + 1)
BB = B(limuusr + 2)
if (KDIAG .GE. 5) then
WRITE (USER_NHSTRY, *)'A = ', AA, ' B = ', BB
endif
qmx = exp(AA + BB / T)
dqmx = - BB * qmx / (T * T)
RETURN
END subroutine mul2u
L'esempio è stato originariamente scritto per Fortran 77 (quindi ha utilizzato la formattazione fissa) e ho apportato le poche modifiche necessarie per la sua compilazione utilizzando la formattazione libera. Tuttavia, durante la compilazione ottieni una stringa di errori che provengono dai file Aspen inclusi nella subroutine (quindi dms_plex.cmn e ppexec_user.cmn). Ecco un esempio di uno degli errori:
c:\Program Files (x86)\AspenTech\AprSystem V8.8\Engine\commons/ppexec_user.cmn(7): error #5082: Syntax error, found END-OF-STATEMENT when expecting one of: %FILL <IDENTIFIER>
INTEGER USER_IUMISS, USER_NGBAL, USER_IPASS,
-------------------------------------------------------^
Di nuovo, sembra che il compilatore dia l'errore perché i file Aspen sono scritti in formato fisso e stiamo compilando con il formato libero. Per aggirare questo uso, le direttive passano al formato fisso e viceversa.
!DEC $ NOFREEFORM
#include "dms_plex.cmn"
#include "ppexec_user.cmn"
! Dicembre $ FORMA LIBERA
Quando uso queste direttive attorno all'istruzione include, il compilatore funziona senza errori e posso usare un modello utente Fortran 90 in Aspen.