1 subroutine gbitos ( nfdico, lfdico, codret)
2 c ______________________________________________________________________
6 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
8 c Version originale enregistree le 18 juin 1996 sous le numero 96036
9 c aupres des huissiers de justice Simart et Lavoir a Clamart
10 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
11 c aupres des huissiers de justice
12 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
14 c HOMARD est une marque deposee d'Electricite de France
20 c ______________________________________________________________________
22 c fonction d'initialisation des tables de description des
23 c types d'objet structure.
24 c ______________________________________________________________________
26 c . nom . e/s . taille . description .
27 c .____________________________________________________________________.
28 c . nfdico . e . ch<200 . nom du fichier des objets structures .
29 c . lfdico . e . 1 . longueur du nom du fichier .
30 c . . . . si =0, on a les tables par gmitob .
31 c . codret . s . 1 . code de retour .
32 c . . . . -6 : impossible de decoder la date du .
33 c . . . . fichier des types .
34 c . . . . -5 : erreur : type interdit .
35 c . . . . -4 : erreur : fichier de type d'objet vide .
36 c . . . . -3 : erreur : erreur de format dans le .
37 c . . . . fichier d'entree .
38 c . . . . -2 : erreur : type de champ non defini .
39 c . . . . -1 : erreur : dimensionnement des tables .
40 c . . . . insuffisant .
42 c . . . . 3 ou 9 : fermeture impossible du fichier .
43 c ______________________________________________________________________
46 c 0. declarations et dimensionnement
49 c 0.1. ==> generalites
55 parameter ( nompro = 'GBITOS' )
81 integer lfdico, codret
83 c 0.4. ==> variables locales
87 integer lelm(nelx), nelm, lgtot, ns
88 integer nftypo, ipart, ncham, ncha, iadr, it
90 character*8 datefr, heurfr, textem
91 character*80 chaine,elem(nelx)
96 character*8 chatyp(nchpx)
99 parameter ( nbmess = 20 )
100 character*80 texte(nblang,nbmess)
102 c 0.5. ==> initialisations
104 data sepa / ' ' , ',' , ';' , ' ' /
106 c ______________________________________________________________________
114 #ifdef _DEBUG_HOMARD_
115 write (ulsort,texte(langue,1)) 'Entree', nompro
119 texte(1,17) = '(''Decodage du fichier typobj.stu :'')'
120 texte(1,4) = '(''Erreur a la ligne numero'',i6,'' :'')'
122 > '(''Le nombre maximum de types,'',i6,'' est atteint.'',/)'
124 > '(''Le nombre maximum de champs,'',i6,'' est atteint.'',/)'
125 texte(1,7) = '(''Fin de fichier inattendue.'',/)'
127 > '(''Chaque texte doit avoir moins de 8 caracteres.'')'
128 texte(1,9) = '(''Aucun type n''''a ete trouve ?'')'
129 texte(1,10) = '(''Aucun type ne correspond au champ '',a8)'
130 texte(1,11) = '(''Le nom de type '',a8,'' est interdit.'')'
131 texte(1,12) = '(''Impossible de decoder la date '',a8)'
133 > '(''ATTENTION : les deux premiers caracteres d''''un nom'')'
135 > '(''de champ ne devraient pas etre deux chiffres : '',a8)'
136 texte(1,15) = '(''... nom du type : '',a8)'
137 texte(1,18) = '(/,''Dictionnaire des types d''''objets :'')'
138 texte(1,19) = '(''. Version : '',i11)'
139 texte(1,20) = '(''. Sous-version : '',i6,/,''. Date : '',a8)'
141 texte(2,17) = '(''Uncoding of file typobj.stu :'')'
142 texte(2,4) = '(''Error on line #'',i6,'' :'')'
144 > '(''The maximum number of types,'',i6,'' is reached.'',/)'
146 > '(''The maximum number of fields,'',i6,'' is reached.'',/)'
147 texte(2,7) = '(''Unexpected end of file.'',/)'
148 texte(2,8) = '(''Each text must be less than 8 characters.'')'
149 texte(2,9) = '(''No type was found ?'')'
150 texte(2,10) = '(''No type is declared as field '',a8)'
152 > '(''The name of this type '',a8,'' is forbidden.'')'
153 texte(2,12) = '(''Date '',a8,'' cannot be uncoded.'')'
155 > '(''WARNING : The first two characters of a field name'')'
157 > '(''should not be both numeric : field name '',a8)'
158 texte(2,15) = '(''... name of the type : '',a8)'
159 texte(2,18) = '(/,''Object types dictionnary :'')'
160 texte(2,19) = '(''. Version : '',i6)'
161 texte(2,20) = '(''. Release : '',i6,/,''. Date : '',a8)'
166 c 2. - noms des types de base pour les donnees
167 c l'ordre des types doit etre respecte
168 c - les tailles des types de donnees sont en octets
171 c 2.1. ==> les noms des types de bases
175 nomtyb(1) = 'entier '
177 nomtyb(3) = 'chaine '
178 nomtyb(4) = 'struct '
180 c 2.2. ==> mise de l'information dans les noms de types de base
183 do 21 iaux = 1 , ntybma
184 nomtbp(-iaux) = nomtyb(iaux)
187 c 2.3. ==> les tailles des types de donnees sont en octets
189 call dmsize (tentie,treel,tchain)
192 c 3. initialisation a des valeurs non definies des differents tableaux
193 c decrivant les types et les champs declares et des numeros de
194 c version et de sous-version
197 do 31 iaux = 1 , ntypx
198 nomtbp(iaux) = sindef
199 nomtyp(iaux) = sindef
200 nbcham(iaux) = iindef
201 nbratt(iaux) = iindef
202 adrdst(iaux) = iindef
205 do 32 iaux = 1 , nchpx
206 chatyp(iaux) = sindef
207 nomcha(iaux) = sindef
208 typcha(iaux) = iindef
217 c 4. initialisation des tables d'objets
220 if ( lfdico.eq.0 ) then
222 cgn write (ulsort,*) 'appel de gmitob'
227 c 4. lecture du fichier de declaration des types d'objets
232 call guoufs ( nfdico, lfdico, nftypo, codret )
241 c 4.1. ==> boucle 41 : jusqu'a ce que la ligne demarre par le
247 read (nftypo,'(a)',end=50) chaine
249 call gbpart(chaine,elem,lelm,nelm,lgtot,sepa,ns,ipart)
251 if ( ipart.eq.-1 ) then
254 if ( elem(1)(1:6).eq.'>>TYPE' ) then
257 else if ( elem(1)(1:9).eq.'>>VERSION' ) then
265 c 4.2. ==> boucle 42 : jusqu'a ce que la ligne ne soit ni blanche,
267 c quand c'est bon, elle contient la description d'un type
272 c 4.2.1 ==> lecture de la ligne suivante
275 read (nftypo,'(a)',end=73) chaine
277 call gbpart(chaine,elem,lelm,nelm,lgtot,sepa,ns,ipart)
279 if ( (ipart.eq.-1) .or. (elem(1)(1:2).eq.'$$') ) then
283 c 4.2.2. ==> controle de la longueur de chacun des textes
285 if ( lelm(1).gt.8 .or.
287 > lelm(3).gt.8 ) then
291 c 4.2.3. ==> decodage d'un type
293 if ( jaux.eq.1 ) then
295 c 4.2.3.1. ==> les trois termes de la chaine :
297 c 2 : nombre de champs
298 c 3 : nombre d'attributs
301 if (nbrtyp.gt.ntypx) then
305 nomtyp(nbrtyp) = elem(1)(1:8)
307 read (elem(2),'(i8)') ncham
308 nbcham(nbrtyp) = ncham
310 read (elem(3),'(i8)') nbratt(nbrtyp)
312 if (nbrtyp.gt.1) then
313 adrdst(nbrtyp) = adrdst(nbrtyp-1)+nbcham(nbrtyp-1)
316 c 4.2.3.2. ==> controle du nom du type
318 do 4232 iaux = 1 , ntybma
319 if ( nomtyp(nbrtyp).eq.nomtyb(iaux) ) then
321 write (ulsort,texte(langue,17))
322 write (ulsort,*) nfdico
323 write (ulsort,texte(langue,11)) nomtyp(nbrtyp)
327 nomtbp(nbrtyp) = nomtyp(nbrtyp)
329 c 4.2.3.3. ==> boucle 4233 : decodage de chacun des champs du type
330 c jusqu'a ce que les ncham champs aient ete lus.
331 c quand c'est fini, on repasse a une nouvelle ligne (goto 41)
338 read (nftypo,'(a)',end=73) chaine
340 call gbpart(chaine,elem,lelm,nelm,lgtot,sepa,ns,ipart)
342 if ( (ipart.eq.-1) .or. (elem(1)(1:2).eq.'$$') ) then
345 if ( (ncha.eq.ncham) .and. (elem(1)(1:5).eq.'>>FIN') ) then
348 if ( (lelm(1).gt.8) .or. (lelm(2).gt.8) ) then
352 iadr = adrdst(nbrtyp)+ncha
353 if (iadr.gt.nchpx) then
356 nomcha(iadr) = elem(1)(1:8)
358 c les deux premiers caracteres d'un nom de champ ne devraient pas etre
359 c tous deux numeriques : risque de conflit entre generateurs de noms
360 c d'objets (temporaires, cf. gbntcr, et voir aussi les sous-programmes
361 c gbgeno). Au mieux, cela risque de ralentir l'execution ...
362 c ... cela dit, on ne fait qu'imprimer un avertissement.
364 if ( index('0123456789',nomcha(iadr)(1:1)).gt.0 .and.
365 > index('0123456789',nomcha(iadr)(2:2)).gt.0 ) then
366 write (ulsort,texte(langue,1)) 'Sortie', nompro
367 write (ulsort,texte(langue,17))
368 write (ulsort,*) nfdico
369 write (ulsort,texte(langue,13))
370 write (ulsort,texte(langue,14)) nomcha(iadr)
371 write (ulsort,texte(langue,15)) nomtbp(nbrtyp)
374 chatyp(iadr) = elem(2)(1:8)
379 c 4.2.4. ==> decodage de la reference de la version
381 else if ( jaux.eq.2 ) then
383 c 4.2.4.1. ==> le numero de version
385 if ( elem(1)(1:5).eq.'>>FIN' ) then
390 if ( elem(1)(1:7).eq.'Version' ) then
391 read (elem(2),'(i8)') nuveto
393 else if ( elem(1)(1:8).eq.'SousVers' ) then
394 read (elem(2),'(i8)') nusvto
396 else if ( elem(1)(1:4).eq.'Date' ) then
398 datefr(1:2) = elem(2)(1:2)
399 datefr(4:5) = elem(3)(1:2)
400 datefr(7:8) = elem(4)(1:2)
411 c 5. enregistrement des informations
416 c 5.1. ==> decodage du type de chaque champ
418 if (nbrtyp.ne.0) then
420 c 5.1.1. ==> decodage du type de chaque champ
422 do 51 iaux = 1, nbrtyp
424 do 511 jaux = adrdst(iaux), adrdst(iaux)+nbcham(iaux)-1
426 call gbminu(chatyp(jaux),textem)
428 if (textem.eq.nomtyb(1)) then
430 else if (textem.eq.nomtyb(2)) then
432 else if (textem.eq.nomtyb(3)) then
436 do 5111 it = 1, nbrtyp
437 if (nomtyp(it).eq.chatyp(jaux)) then
443 write (ulsort,texte(langue,1)) 'Sortie', nompro
444 write (ulsort,texte(langue,17))
445 write (ulsort,*) nfdico
446 write (ulsort,texte(langue,10)) chatyp(jaux)
457 c 5.2. ==> probleme : aucun type n'a ete trouve dans le fichier
459 write (ulsort,texte(langue,1)) 'Sortie', nompro
460 write (ulsort,texte(langue,17))
461 write (ulsort,*) nfdico
462 write (ulsort,texte(langue,9))
469 c 6. enregistrement de la date des types d'objets
475 call ugdhfc ( daheto, nuanto,
479 if ( iaux.ne.0 ) then
486 c 7. gestion des messages d'erreur
490 write (ulsort,texte(langue,1)) 'Sortie', nompro
491 write (ulsort,texte(langue,17))
492 write (ulsort,*) nfdico
493 write (ulsort,texte(langue,4)) nrolig
494 write (ulsort,*) chaine
495 write (ulsort,texte(langue,5)) ntypx
500 write (ulsort,texte(langue,1)) 'Sortie', nompro
501 write (ulsort,texte(langue,17))
502 write (ulsort,*) nfdico
503 write (ulsort,texte(langue,4)) nrolig
504 write (ulsort,*) chaine
505 write (ulsort,texte(langue,6)) nchpx
510 write (ulsort,texte(langue,1)) 'Sortie', nompro
511 write (ulsort,texte(langue,17))
512 write (ulsort,*) nfdico
513 write (ulsort,texte(langue,4)) nrolig
514 write (ulsort,*) chaine
515 write (ulsort,texte(langue,7))
520 write (ulsort,texte(langue,1)) 'Sortie', nompro
521 write (ulsort,texte(langue,17))
522 write (ulsort,*) nfdico
523 write (ulsort,texte(langue,4)) nrolig
524 write (ulsort,*) chaine
525 write (ulsort,texte(langue,8))
530 write (ulsort,texte(langue,1)) 'Sortie', nompro
531 write (ulsort,texte(langue,17))
532 write (ulsort,*) nfdico
533 write (ulsort,texte(langue,12)) datefr
538 c 8. fermer le fichier dictionnaire
543 call gufefi ( nfdico, lfdico, codret )
547 #ifdef _DEBUG_HOMARD_
548 write (ulsort,texte(langue,18))
549 write (ulsort,texte(langue,19)) nuveto
550 write (ulsort,texte(langue,20)) nusvto, datefr
554 c 9. initialisation des quantites gerant les objets alloues
555 c les tables : nomobj , nomobc
556 c les pointeurs : iptobj , iptchp
557 c et : indnom , iptatt
558 c attention : il vaut mieux initialiser les attributs
559 c a une valeur indefinie, ca evite des surprises ...
562 do 91 iaux = 1, nobjx
563 typobj(iaux) = iindef
564 adrdso(iaux) = iindef
565 adrdsa(iaux) = iindef
566 nomobj(iaux) = sindef
569 do 92 iaux = 1, nobcx
570 nomobc(iaux) = sindef
571 valatt(iaux) = iindef