ONELAB scripting syntax

From ONELAB
Revision as of 17:23, 3 February 2012 by Francois (talk | contribs)

Jump to: navigation, search

Principe général

L'utilisation de ONELAB n'est cependant pas limitée aux codes encapsulés. N'importe quel autre programme de calcul scientifique peut également utiliser ONELAB, mais cette fois-ci au travers d'une interface. On appelle ces clients des clients interfacés.

La syntaxe d'interfaçage se base sur le principe du préprocesseur. Le préprocesseur ONELAB effectue des inclusions/exclusions conditionnelles de lignes de code et des substitutions de valeurs pour délivrer en sortie un fichier d'entrée valide pour le client. Etant donné que l'interface ONELAB est générique, càd qu'elle est identique pour tous les clients interfacés, toutes ces opérations sont réalisées sans jamais interpréter le code du client qui est considéré comme une suite de caractères sans signification.

Pour donner un exemple très simple, supposons qu'un client XYZ utilise un fichier d'entrée de type model.xyz contenant:

 ...
 B =  C + 2*0.005 + D
 ...
 

et que la valeur 0.005 soit celle d'un paramètre L=0.005 l'on veut mettre en commun avec un autre client via le serveur ONELAB. L'interfaçage ONELAB se fera en définissant un fichier model.xyz.ol contenant

OL.parameter L.number(0.005,Parameters/1Geometry,Length); 
...
B =  C + 2*OL.getValue(L) + D
...

La commande OL.parameter définit le paramètre Parameters/1Geometry/L sur le serveur ONELAB et lui attribue la valeur par défaut 0.005 et le label "Length". Lors de la conversion du fichier model.xyz.ol, le préprocesseur repère les commandes ONELAB grâce au tag OL., les traite et génère en sortie un fichier model.xyz syntaxiquement correct pour le client XYZ, à savoir dans ce cas-ci

...
B =  C + 2*0.004 + D
...

si la valeur du paramètre L sur le serveur ONELAB est, au moment de la génération, 0.004 et non la valeur par défaut.

Il faut également enregistrer le solveur XYZ comme client auprès du server ONELAB. Cela se fait par la création d'un fichier model.ol contenant

OL.client XYZ.register(interfaced);
OL.client XYZ.InputFiles.Set(model.sif.ol);

Syntaxe détaillée

  • Définition des clients
OL.client client_def; <client_def; ...>
client_def est une des commandes suivantes:
name.register(interfaced|encapsulated);
enregistre un client de type interfacé ou encapsulé" (obligatoire)
name.Path(path)
définit le path système de l'exécutable (interactif)
name/InputFiles.Set(file,...)
définit la liste des fichiers d'entrée (obligatoire)
name/OutputFiles.Set(file,...)
définit la liste des fichiers de sortie (facultatif)
name.PreLineOptions(options)
définit des options en ligne de commande à placer avant la liste des fichiers d'entrée (facultatif)
name.LineOptions('options)
définit des options en ligne de commande à placer après la liste des fichiers d'entrée (facultatif)
name.Active(0|1)
définit si le client est appelé ou non lors de l'exécution (valeur par défaut:1)
  • Définition des paramètres
OL.parameter param_def; <param_def; ...>
param_def est une des commandes suivantes:
name.number(Value,Path,ShortHelp)
définition d'un paramètre numérique
name.MinMax(Min,Max,Step)
attribution d'un range [Min,Max] à un paramètre numérique existant.
Step définit l'incrément qui sera utilisé lors d'une éventuelle étude paramétrique sur cet intervalle.
name.string(Value,Path,ShortHelp)
définit un paramètre de type string
  • Branchements conditionnels
OL.iftrue(param)
lignes de codes transférées si le paramètre "param est différent de 0 ou ""
OL.else
lignes de codes transférées si le paramètre "param est égal à 0 ""
OL.endif
  • Inclusion d'un fichier
OL.include(file)
insère à cet endroit le résultat de la conversion du fichier file
  • Substitution de valeur
OL.getValue(name)
insère à cet endroit la valeur du paramètre name sur le serveur ONELAB. Cette commande peut apparaître plusieurs fois sur une même ligne.


Exemple

// File "LaplacianNeumann.geo".

// We include the file containing the numbering of the geometry.
// This is usefull at the end of this file, and used to "synchronise" GMSH and GetDP
Include "param.geo";

//Caracteristic length of the finite elements (reffinement is also possible after the mesh is built):
lc = 0.05;
// This parameter could be placed for instance in "param.geo", to separate more easyly the geometry
// 	and the discretization parameters.

// The parameters of the border of the domain :
x_max = 1;
x_min = 0;
y_max= 1;
y_min = 0;

//Creation of the 4 angle points of the domain Omega (=square)
p1 = newp; Point(p1) = {x_min,y_min,0,lc};
p2 = newp; Point(p2) = {x_min,y_max,0,lc};
p3 = newp; Point(p3) = {x_max,y_max,0,lc};
p4 = newp; Point(p4) = {x_max,y_min,0,lc};
// Remarks:
// -"newp" is a GMSH function that give the first available number for describing a point.
// 	For any other entity, like Line, Surface, etc. We recommand the use of "newreg" (see below).
// - By default, GMSH create a 3D domain. The z-coordinate must always be precised.


//The four edges of the square
L1 = newreg; Line(L1) = {p1,p2};
L2 = newreg; Line(L2) = {p2,p3};
L3 = newreg; Line(L3) = {p3,p4};
L4 = newreg; Line(L4) = {p4,p1};

// Line Loop (= boundary of the square)
Bound = newreg; Line Loop(Bound) = {L1,L2,L3,L4};

//Surface of the square
SurfaceOmega = newreg; Plane Surface(SurfaceOmega) = {Bound};

// To conclude, we define the physical entities, that is "what GetDP could see/use".
// "Omega" is a number imported from the file "param.geo".
Physical Surface(Omega) = {SurfaceOmega};
// Do not forget to let a blank line at the end, this could make GMSH crash...

Direct link to file `getdp/LaplacianNeumann/GMSH_GETDP/LaplacianNeumann.geo'