* fichier : acqulata.dgibi ************************************************************************ ************************************************************************ 'OPTION' 'ECHO' 0 ; ************************************************************************ * NOM : ACQULATA * DESCRIPTION : Lecture de fichiers au format LATA v2.1 (Trio_U) en GIBI * On utilise ACQU BRUT et d'autres évolutions * (fiches 7922-7928) * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : stephane.gounand@cea.fr ********************************************************************** * VERSION : v1, 13/01/2014, version initiale * HISTORIQUE : v1, 13/01/2014, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * * interact = FAUX ; graph = FAUX ; ****************************************************************** * P R O C E D U R E S * * SPLITLIG * * On a une chaine de caractères LALIG comprenant des mots séparés * par des espaces. On crée une table indexée par des entiers * contenant chaque mot de la ligne : * tab . I = Ieme mot de LALIG * 'DEBPROC' SPLITLIG ; *'LISTE' ('DIME' lalig) ; *'LISTE' ('TYPE' lalig) ; * Splitte la ligne dans une table tmot = 'TABLE' ; itab = 0 ; ii = &idx ; ideb = 'EXTRAIRE' lesp ii ; ifin = 'EXTRAIRE' lesp ('+' ii 1) ; 'SI' ('>' ifin ('+' ideb 1)) ; itab = '+' itab 1 ; tmot . itab = 'EXTRAIRE' lalig ('+' ideb 1) ('-' ifin 1) ; 'FINSI' ; 'FIN' idx ; 'RESPRO' tmot ; 'FINPROC' ; * * VALARG * * On a une table crée par SPLITLIG. Elle peut contenir des chaines * telles que : 'toto=30'. En entrée, on a la table, le mot 'toto' et * le type de la donnée cherchée (ici ENTIER). * En sortie, on a la valeur 30 * * 'DEBPROC' VALARG ; 'ARGUMENT' tlig*'TABLE' ; mot2 = 'CHAINE' motcher '=' ; ok = faux ; 'REPETER' ilig nlig ; * Sinon pb si l'indice de la table est un nom d'operateur ind = 'CHAINE' tlig . &ilig ; *dbg 'MESSAGE' 'ind=' ind ; *dbg 'MESSAGE' 'fi=' fi ; ok = 'EGA' fi 1 ; 'SI' ok ; ideb = '+' lon2 1 ; valcher = 'EXTRAIRE' ind ideb ifin ; 'QUITTER' ilig ; 'FINSI' ; 'FIN' ilig ; 'SI' ('NON' ok) ; 'ERREUR' ('CHAINE' motcher ' not found') ; 'FINSI' ; *'MESSAGE' ('CHAINE' 'valcher=' valcher) ; 'SI' ('EGA' typcher 'ENTIER') ; valcher = 'ENTIER' valcher ; 'FINSI' ; 'SI' ('EGA' typcher 'FLOTTANT') ; valcher = 'FLOTTANT' valcher ; 'FINSI' ; 'FINSI' ; 'RESPRO' valcher ; 'FINPROC' ; * * MAKELEM * * Cette procédure génère les noeuds et les éléments en lisant un fichier * fic est le nom de fichier * nelem est le nombre d'éléments à lire * nnoe est le nombre de noeuds par élément * Si nnoe=1, on génère la table des noeuds à partir des coordonnées * données dans le fichier * Si nnoe>1, on génère la table des simplexes à partir de leurs * numéros de noeuds, il faut alors donner la table des noeuds * tabnode comme argument supplémentaire à la procédure * 'DEBPROC' MAKELEM ; 'ARGUMENT' nelem*'ENTIER' ; 'ARGUMENT' nnoe*'ENTIER' ; * 'SI' ('OU' ('<' nnoe 1) ('>' nnoe ('+' dim 1))) ; 'ERREUR' ('CHAINE' 'nnoe=' nnoe ' incorrect') ; 'FINSI' ; 'SI' ('NEG' nnoe 1) ; 'ARGUMENT' tabnode*'TABLE' ; 'FINSI' ; * tab = 'TABLE' 'ESCLAVE' ; 'MESSAGE' ('CHAINE' 'Reading ' fic ) ; *'OPTI' 'ACQU' fic ; MONACQU globfic tfic fic ; * 'SI' ('EGA' nnoe 1) ; 'REPETER' bcl nelem ; i = &bcl ; 'FIN' bcl ; 'SINON' ; 'REPETER' bcl nelem ; i = &bcl ; 'REPETER' inoe nnoe ; po = 'EXTRAIRE' lnode &inoe ; mpo = 'ET' mpo 'FIN' inoe ; tyel = 'EXTRAIRE' lmot ('-' nnoe 1) ; 'FIN' bcl ; 'FINSI' ; 'RESPRO' tab ; 'FINPROC' ; * * MAKCHAM * * Génère les champs en lisant les fichiers correspondant * Il faut donner en entrée une table contenant les temps à lire, * les différents champs et les noms de fichiers. * Celle-ci est modifiée en sortie et contient les valeurs des champs. * Ce sont des champoints pour les champs définis aux noeuds * et des champs par éléments pour les champs définis aux faces ou * aux éléments. * * 'DEBPROC' MAKCHAM ; 'ARGUMENT' tabcham*'TABLE' ; * * Les champs * 'SI' ('>' ntemp 0) ; 'REPETER' itemp ntemp ; i = &itemp ; tabi = tabcham . i ; itabi = 'INDEX' tabi ; idx = itabi . &ntabi ; tabin = tabi . idx ; fic = tabin . 'fic' ; 'MESSAGE' ('CHAINE' 'Reading ' fic) ; * 'OPTI' 'ACQU' fic ; MONACQU globfic tfic fic ; nat = tabin . 'nat' ; 'SI' ('EGA' nat 'vector') ; ncomp = dim ; 'SINON' ; ncomp = 1 ; 'FINSI' ; tvcomp = 'TABLE' ; 'REPETER' icomp ncomp ; 'FIN' icomp ; loc = tabin . 'loc' ; mod = tabcham . loc ; mmod = mod ; mmod = 'EXTRAIRE' mmod 'MAIL' ; 'FINSI' ; * 'REPETER' icomp ncomp ; tvcomp . &icomp = 'ET' (tvcomp . &icomp) 'FIN' icomp ; 'FIN' bcl ; 'SI' ('EGA' loc 'som') ; 'SI' ('EGA' ncomp 1) ; 'FINSI' ; 'SI' ('EGA' ncomp 2) ; 'UY' (tvcomp . 2) ; 'FINSI' ; 'SI' ('EGA' ncomp 3) ; 'UY' (tvcomp . 2) 'UZ' (tvcomp . 3) ; 'FINSI' ; tabin . 'chpoint' = chp ; * 'LISTE' chp; 'SINON' ; 'SI' ('EGA' ncomp 1) ; 'GRAVITE' ; 'FINSI' ; 'SI' ('EGA' ncomp 2) ; 'UY' (tvcomp . 2) 'GRAVITE' ; 'FINSI' ; 'SI' ('EGA' ncomp 3) ; 'UY' (tvcomp . 2) 'UZ' (tvcomp . 3) 'GRAVITE' ; 'FINSI' ; tabin . 'chamelem' = cha ; * 'LISTE' cha ; 'FINSI' ; 'FINSI' ; 'FIN' ntabi ; 'FIN' itemp ; 'FINSI' ; * 'RESPRO' tabcham ; 'FINPROC' ; * * SAUTLIG * * Saute n lignes dans un fichier en cours de lecture avec ACQU * 'DEBPROC' SAUTLIG ; 'ARGUMENT' ilig*'ENTIER' ; 'ARGUMENT' jlig*'ENTIER' ; 'REPETER' bcl ; ilig = ilig '+' 1 ; 'SI' ('<' ilig jlig) ; 'SINON' ; ilig = '-' ilig 1 ; 'QUITTER' bcl ; 'FINSI' ; 'FIN' bcl ; 'RESPRO' ilig ; 'FINPROC' ; * * MONACQU * * * On se positionne dans le fichier fic juste après la ligne * FICHIER fic2 * dont le numéro est dans tfic . fic2 * si multific = vrai (variable globale), MONACQU est equivalent a 'OPTI * 'ACQU' ; * 'DEBPROC' MONACQU ; 'ARGUMENT' tfic*'TABLE' ; * 'SI' multific ; 'SINON' ; *'MESSAGE' ('CHAINE' 'Reading ' fic) ; nlig = tfic . fic2 ; *'MESSAGE' 'nlig=' nlig ; 'SI' ('>' nlig 0) ; 'REPETER' bcl nlig ; 'FIN' bcl ; 'FINSI' ; 'FINSI' ; 'FINPROC' ; * * * Fin des P R O C E D U R E S ****************************************************************** * * Début du jeu de données * * multific est un logique global qui dit si les fichiers .lata sont mis * sequentiellement dans un seul fichier globfic (typiquement le .dgibi * courant) ou si ils sont en fichiers separes dans le repertoire courant * multific = faux ; * * 1ere passe pour localiser les débuts de fichier dans globfic * si multific = faux ; * On fait une table tfic . 'nomfic' = i avec i ligne début tfic = 'TABLE' ; globfic = 'CHAINE' divers '/../dgibi/acqulata.dgibi' ; 'SI' ('NON' multific) ; * ilig = 0 ; 'REPETER' bcl ; * 'SI' ('NEG' tlig . 1 '*') ; * prem = 'CHAINE' IEME lalig 1 ; * mcle = 'CHANGER' 'MINU' (IEME lalig 1) ; tlig = SPLITLIG lalig ; * Eviter l'interprétation de tlig . 1 'SI' ('NEG' tlig . 1 '*') ; mcle = 'CHANGER' 'MINU' tlig . 1 ; 'SI' ('EGA' mcle 'fichier') ; tfic . (tlig . 2) = ilig ; 'FINSI' ; 'SI' ('EGA' mcle 'stop') ; 'QUITTER' bcl ; 'FINSI' ; 'FINSI' ; 'FINSI' ; 'FIN' bcl ; * 'LISTE' tfic ; 'FINSI' ; * nomcas = 'stokes_2d' ; * * Traitement du fichier stokes_2d.lata * * 1 Lecture du nombre d'entrees CHAMP GEOM et TEMP. On s'arrete à * l'entrée FIN * fic = 'CHAINE' nomcas '.lata' ; 'MESSAGE' ('CHAINE' 'Reading ' fic ' pass 1') ; *'OPTI' 'ACQU' fic ; MONACQU globfic tfic fic ; ilig = 0 ; tmot = 'TABLE' ; tmot . 'CHAMP' = 1 ; tmot . 'GEOM' = 2 ; tmot . 'TEMPS' = 3 ; tmot . 'FIN' = 4 ; * 'REPETER' bcl ; * 'LISTE' mot1 ; ilig = '+' ilig 1 ; 'SI' ('EXISTE' tmot mot1) ; ikas = tmot . ('CHAINE' mot1) ; 'SINON' ; ikas = 0 ; 'FINSI' ; 'SI' ('EGA' ikas 4) ; 'QUITTER' bcl ; 'FINSI' ; 'FIN' bcl ; * 'MESSAGE' ('CHAINE' 'Nombre de geometries : ' ngeom) ; 'MESSAGE' ('CHAINE' 'Nombre de temps sauves : ' ntemp) ; 'SI' ('>' ntemp 0) ; 'SI' ('>' ntemp 1) ; ncham = '-' ('-' ('EXTRAIRE' ltemp 2) ('EXTRAIRE' ltemp 1)) 1 ; 'SINON' ; ncham = '-' ('-' ifin ('EXTRAIRE' ltemp 1)) 1 ; 'FINSI' ; 'FINSI' ; 'MESSAGE' ('CHAINE' 'Nombre de champs par temps sauves : ' ncham) ; * * On lit uniquement la première géométrie * 'MESSAGE' ('CHAINE' 'Reading ' fic ' pass 2') ; *'OPTI' 'ACQU' fic ; MONACQU globfic tfic fic ; ilig = 0 ; igeom = 'EXTRAIRE' lgeom 1 ; ilig = SAUTLIG ilig ('+' igeom 1) ; * Les noeuds tlig = SPLITLIG lalig ; ficnode = 'CHAINE' tlig . 3 ; nnode = VALARG tlig 'size' 'ENTIER' ; dim = VALARG tlig 'composantes' 'ENTIER' ; 'MESSAGE' ('CHAINE' 'Nom du fichier des noeuds : ' ficnode) ; 'MESSAGE' ('CHAINE' 'Nombre de noeuds : ' nnode) ; 'MESSAGE' ('CHAINE' 'Dimension du probleme : ' dim ) ; * Les éléments tlig = SPLITLIG lalig ; ficelem = 'CHAINE' tlig . 3 ; nelem = VALARG tlig 'size' 'ENTIER' ; nnoe = VALARG tlig 'composantes' 'ENTIER' ; 'MESSAGE' ('CHAINE' 'Nom du fichier des éléments : ' ficelem) ; 'MESSAGE' ('CHAINE' 'Nombre déléments : ' nelem) ; * Les faces igeom = 'EXTRAIRE' lgeom ngeom ; ilig = SAUTLIG ilig ('+' igeom 3) ; tlig = SPLITLIG lalig ; ficface = 'CHAINE' tlig . 3 ; nface = VALARG tlig 'size' 'ENTIER' ; nnof = VALARG tlig 'composantes' 'ENTIER' ; 'MESSAGE' ('CHAINE' 'Nom du fichier des faces : ' ficface) ; 'MESSAGE' ('CHAINE' 'Nombre de faces : ' nface) ; * Les champs aux différents instants tabcham = 'TABLE' ; 'SI' ('>' ntemp 0) ; 'REPETER' itemp ntemp ; i = &itemp ; ilig = SAUTLIG ilig ('EXTRAIRE' ltemp i) ; tabcham . i = 'TABLE' ; tabi = tabcham . i ; tlig = SPLITLIG lalig ; tem = 'FLOTTANT' tlig . 2 ; tabi . 'INSTANT' = tem ; 'REPETER' icham ncham ; tlig = SPLITLIG lalig ; quoi = 'CHANGER' 'MINU' ('CHAINE' tlig . 2) ; nomcham = 'CHAINE' quoi loc ; tabi . nomcham = 'TABLE' ; tabin = tabi . nomcham ; tabin . 'fic' = 'CHAINE' tlig . 3 ; * 'LISTE' tabin ; 'FIN' icham ; 'FIN' itemp ; 'FINSI' ; * * On a lu tous les noms de fichiers, maintenant, on peut créer les objets * * les noeuds tabnode = MAKELEM ficnode nnode 1 ; pmt = 'ET' tabnode ; * Les éléments tabelem = MAKELEM ficelem nelem nnoe tabnode ; mt = 'ET' tabelem ; * Les faces tabface = MAKELEM ficface nface nnof tabnode ; fac = 'ET' tabface ; *'TRACER' fac 'TITR' 'fac' ; * _mt = 'CHANGER' mt 'QUAF' ; _fac = 'CHANGER' fac 'QUAF' ; 'ELIMINATION' ('ET' _mt _fac) 1.D-6 ; * tabcham . 'ltemps' = ltem ; tabcham . 'som' = pmt ; * Lire les champs tabcham = MAKCHAM tabcham ; *fic = 'CHAINE' nomdir nomcas '.sauv' ; *'MESSAGE' ('CHAINE' 'Saving ' fic) ; *'OPTI' 'SAUVER' fic ; *'SAUVER' tabcham ; * tt = tabcham . ntemps ; vit = tt . 'vitessefaces' . 'chpoint' ; mvit = 'MAXIMUM' vit 'ABS' ; prep1 = tt . 'pressionsom' . 'chpoint' ; prep0 = tt . 'pressionelem' . 'chamelem' ; mpre1 = 'MAXIMUM' prep1 'ABS' ; mpre0 = 'MAXIMUM' prep0 'ABS' ; 'MESSAGE' ('CHAINE' 'mvit=' mvit) ; 'MESSAGE' ('CHAINE' 'mpre1=' mpre1) ; 'MESSAGE' ('CHAINE' 'mpre0=' mpre0) ; * 'SI' graph ; tit = 'CHAINE' 'Vitesse ; mvit=' mvit ; 'TRACER' vvit mt 'TITR' tit ; tit = 'CHAINE' 'Pression P1 ; mpre1=' mpre1 ; 'TRACER' prep1 mt 'TITR' tit ; tit = 'CHAINE' 'Pression P0 ; mpre0=' mpre0 ; 'FINSI' ; * On fait quelques tests bateaux sur les résultats obtenus t1 = 'EGA' nnode 86 ; t2 = 'EGA' nelem 138 ; t3 = 'EGA' nface 223 ; t4 = 'EGA' mvit 1.18928E-4 1.E-8 ; t5 = 'EGA' mpre0 6.04218E-1 1.E-5 ; t6 = 'EGA' mpre1 6.64172E-1 1.E-4 ; t7 = 'EGA' y47 1.83565006e-1 1.e-9 ; * ok = t1 'ET' t2 'ET' t3 'ET' t4 'ET' t5 'ET' t6 'ET' t7 ; * 'SI' ('NON' ok) ; 'MESSAGE' ('CHAINE' 'Il y a eu des erreurs') ; 'ERREUR' 5 ; 'SINON' ; 'MESSAGE' ('CHAINE' 'Tout sest bien passe !') ; 'FINSI' ; * 'SI' interact ; 'OPTION' 'ECHO' 1 ; 'OPTION' 'DONN' 5 ; 'FINSI' ; * * End of dgibi file ACQULATA *
© Cast3M 2003 - Tous droits réservés.
Mentions légales