You are on page 1of 6

Appunti sull’uso di ABAQUS°

R
User Subroutines scritte in linguaggio C++

Antonio Lorenzo Mendicino


Università della Calabria - Laboratorio di Meccanica Computazionale

Premessa
Negli appunti che seguono sono riportate alcune informazioni relative all’uso
di Abaqus User Subroutines scritte in linguaggio C++. Tali informazioni sono
state raccolte durante la stesura della tesi di laurea “Analisi di solidi elastici
3D mediante elementi finiti ad alta continuità. Formulazione del modello
numerico e implementazione nel codice ABAQUS“ [6].

1 Introduzione
ABAQUS° R
è una suite di programmi di simulazione ingegneristica della
compagnia Simulia° R
.
Abaqus offre la possibilità di ampliare le proprie capacità. L’utente infatti
può implementare elementi finiti, modelli materiali e altro ancora [2], utiliz-
zando un’apposita interfaccia per scrivere le proprie procedure, la Abaqus
User Subroutine Interface.
La scrittura delle procedure definite dall’utente può essere effettuata in
Fortran (linguaggio della Abaqus User Subroutine Interface) oppure in un
altro linguaggio, come ad esempio il C++ 1 , in tal caso però si aumenta la
complessità della fase di programmazione. L’Abaqus On Line Support infatti
raccomanda di scrivere le proprie user subroutine in Fortran [1].

2 Requisiti di sistema
Se si sta utilizzando un sistema operativo Windows XP, sono necessari i
seguenti software per poter eseguire Abaqus 6.7-1 [5]:

• Intel Fortran 8.1, Intel Fortran 9.1,

• Microsoft Visual C++ .NET 2003, Microsoft Visual C++ .NET 2005,
1
Il C++ in generale offre migliore efficienza nelle prestazioni rispetto al Fortran.

1
• Microsoft Platform SDK for Windows Server 2003 R2.
In particolare nella stesura di [6] sono stati usati Abaqus 6.6-1 e 6.7-1,
Intel Fortran 8.1 e 9.1, Microsoft Visual C++ .NET 2003 (indicato anche
come Ms Visual C++ 7.1).
È inoltre necessario aggiungere al valore di alcune variabili di ambiente gli
indirizzi di alcune directory. In particolare alle seguenti variabili d’ambiente
si aggiungano gli indirizzi delle directory indicate:
• PATH:
Intel\Compiler\Fortran\9.1\IA32\Bin,
Microsoft Visual Studio .NET 2003\Vc7\bin,
Microsoft Visual Studio .NET 2003\Common7\IDE,
Microsoft Platform SDK for Windows Server 2003 R2\Bin
• LIB:
Microsoft Visual Studio .NET 2003\SDK\v1.1\Lib,
Intel\Compiler\Fortran\9.1\IA32\Lib,
Microsoft Visual Studio .NET 2003\Vc7\lib,
Microsoft Platform SDK for Windows Server 2003 R2\Lib
• INCLUDE:
Microsoft Visual Studio .NET 2003\SDK\v1.1\include,
Intel\Compiler\Fortran\9.1\IA32\include,
Microsoft Visual Studio .NET 2003\Vc7\include

3 Scrittura del file sorgente .cpp


La procedura di chiamata di una C++ function da un’applicazione For-
tran è machine dependent (dipende dalla piattaforma e dal compilatore) e
richiederebbe la conoscenza delle convenzioni dei compilatori e dei sistemi
operativi. Fra gli argomenti utili ci sono:

• corrispondenza fra gli external C++ names e gli external Fortran names,
• corrispondenza fra i C++ data types e i Fortran data types (in par-
ticolare conosciamo le corrispondenze: int, integer; float, real; double,
double precision),
• convenzioni per le chiamate di procedure inter-language.

2
Nella user subroutine bisogna adottare opportune accortezze, fra cui ad
esempio:

• impostare la giusta convenzione di chiamata in base alla macchina usata


(ad esempio la convenzione di chiamata stdcall si è rivelata adatta per
la macchina usata per le sperimentazioni condotte nell’ambito di [6]),

• usare solo puntatori (poichè in Fortran le variabili sono passate tutte


per riferimento e non per valore),

• considerare gli array come monodimensionali ordinati per colonne (poichè


è cosı̀ che avviene il loro storage in Fortran). Ad esempio sia data la
matrice M di dimensione nxn memorizzata in un’applicazione C++
tramite il puntatore **m. Sia la componente generica di M , individuata
in un’applicazione C++, tramite

m[i][j]

In una procedura C++ callable from Fortran, M sarà memorizzata


tramite il puntatore *m, e la componente generica di M sarà individu-
ata da
m[j ∗ n + i]

Per impostare la giusta convenzione di chiamata si possono dichiarare le


function invocabili da Fortran come segue:

...F OR N AM E(subnam, SU BN AM )(...)

e nell’intestazione del file sorgente si possono sistemare le direttive seguen-


ti:

#if defined FOR TRAIL


#define FOR NAME(lc name,uc name) lc name ##
#define CALL NAME(lc name,uc name) lc name ##

#elif defined CRAY


#define FOR NAME(lc name,uc name) uc name
#define CALL NAME(lc name,uc name) uc name

#elif defined VMS

3
#define FOR NAME(lc name,uc name) uc name
#define CALL NAME(lc name,uc name) uc name

#elif defined HKS NT


#define FOR NAME(lc name,uc name) stdcall uc name
#define CALL NAME(lc name,uc name) uc name

#else
#define FOR NAME(lc name,uc name) lc name
#define CALL NAME(lc name,uc name) lc name

#endif

La macro FOR NAME permette che si implementi direttamente nel file


sorgente il system-dependent handling dei nomi delle funzioni. Ad esempio
l’opzione di compilazione FOR TRAIL dovrebbe essere invocata su quei sis-
temi che richiedono che un trattino basso sia appeso ai FORTRAN entry
point symbols. Questo è comune sui sistemi UNIX.

4 Eseguire l’analisi
Per lanciare un’analysis job con un input file che richiama procedure defi-
nite dall’utente in C++ occorre prima creare il file .obj, compilando il file
sorgente. Il file .obj deve essere contenuto nella directory da cui si andrà a
lanciare l’analysis job. La linea di comando da eseguire per lanciare il job
associato all’input file inpfilename.inp e al file object objfilename.obj (file
.obj ottenuto compilando il file sorgente contenente la procedura invocata
dall’analysis job) è la seguente:

abaqus job = inpf ilename user = objf ilename interactive

5 Abaqus User defined Element


Gli elementi definiti dall’utente disponibili in Abaqus possono essere elemen-
ti finiti nel senso usuale di rappresentare una parte geometrica del modello
e possono essere lineari o non lineari. Un analysis job che usi user-defined

4
element può essere definito solo tramite Input file Usage (non è possibile da
Abaqus/CAE definire e invocare un elemento di tipo user-defined) [6]. Gli
elementi user-defined possono essere di tipo linear o di tipo general. Quel-
li di tipo linear forniscono le matrici dell’elemento, o tramite la lettura di
esse da un Abaqus/Standard results file, o tramite la scrittura diretta del-
la loro espressione numerica nell’input file Per usare un elemento general
user-defined in un analysis job occorre disporre del file sorgente o del file
oggetto relativi alla subroutine UEL [3] in cui preventivamente si siano im-
plementati il contributo locale allo jacobiano (con la variabile AMATRX) e
il contributo locale al residuo (con la variabile RHS), per le varie procedure
di soluzione (individuate dalla variabile LFLAG). Inoltre si dovrà definire
e invocare l’elemento nell’input file. L’invocazione di un elemento definito
dall’utente all’interno dell’input file (che avviene quando si definisce, all’in-
terno del modello, un elemento finito del tipo definito dall’utente) avviene
allo stesso modo con cui viene invocato un elemento predefinito di Abaqus:
vale a dire, che nella definizione dell’elemento è sufficiente specificare l’ele-
mento tipo, il numero dell’elemento e i nodi connessi ad esso. Il tipo di
elemento si specifica tramite la chiave (element type key) associata ad esso,
che per gli elementi nativi di Abaqus è predefinita, mentre per gli elemen-
ti user-defined deve essere indicata nella definizione dell’elemento all’interno
dell’input file. Nella definizione dell’elemento, oltre all’element type key de-
vono essere specificati i gradi attivi dell’elemento e l’ordinamento di essi, che
saranno poi assunti nell’implementazione contenuta nella UEL subroutine.
Per usare uno general user-defined element di Abaqus occorre utilizzare la
user subroutine interface di Abaqus . La user subroutine interface di Abaqus
consente all’utente di scrivere delle procedure che gli servono per estendere
le capacità di Abaqus . La User subroutine interface di Abaqus è scritta nel
linguaggio di programmazione Fortran, tuttavia è possibile scrivere le user
subroutine non solo in Fortran ma anche in altri linguaggi quali il C++ (lin-
guaggio generalmente usato per ottenere alte prestazioni computazionali),
con il vincolo però che il codice sia invocabile da Fortran.

Ringraziamenti
Grazie per aver usato questo breve documento. Per segnalare incongruenze
su quanto qui scritto o per chiedere info scrivi a merengue82@libero.it

5
Riferimenti bibliografici
[1] Sito internet http://abaqus.custhelp.com. Answer Writing
ABAQUS/Standard user subroutines in C++.

[2] Abaqus User Subroutines Reference Manual, version 6.7.

[3] Abaqus User Subroutines Reference Manual, version 6.7, UEL.

[4] Abaqus Analysis User’s Manual, version 6.7, chapter 3 - Execution


Procedures.

[5] Abaqus Installation and Licensing Guide, version 6.7, appendix A -


System Requirements.

[6] Antonio Lorenzo Mendicino, Analisi di solidi elastici 3D mediante el-


ementi finiti ad alta continuità. Formulazione del modello numerico e
implementazione nel codice ABAQUS. Tesi di laurea magistrale, a.a.
2006/07, Laboratorio di Meccanica Computazionale, Università della
Calabria.

You might also like