The TELEMAC-MASCARET system  trunk
damoc.f
Go to the documentation of this file.
1 ! ****************
2  SUBROUTINE damoc
3 ! ****************
4 !
5  &( adress , dimens , nmax , doc , llng , llu ,
6  & motint , motrea , motlog , motcar , motatt ,
7  & defint , defrea , deflog , defcar , defatt ,
8  & usrint , usrrea , usrlog , usrcar , usratt ,
9  & motcle , taille , trouve , utindx , nficmo , nficda ,
10  & indic , gestd , nblang , retry )
11 !
12 !***********************************************************************
13 ! DAMOCLES V7P2
14 !***********************************************************************
15 !
16 !brief MAIN ROUTINE OF THE DAMOCLES LIBRARY
17 !+ CALLED BY THE DAMOCLES EXECUTABLE (DAMOCLE.F)
18 !+ CALLED BY THE LNH COMPUTATIONAL CODES.
19 !
20 !note PORTABILITY : IBM,CRAY,HP,SUN
21 !
22 !history J-M HERVOUET (LNH); A. YESSAYAN; L. LEGUE
23 !+ 10/11/2008
24 !+ V5P9
25 !+ First version
26 !
27 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
28 !+ 13/07/2010
29 !+ V6P0
30 !+ Translation of French comments within the FORTRAN sources into
31 !+ English comments
32 !
33 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
34 !+ 21/08/2010
35 !+ V6P0
36 !+ Creation of DOXYGEN tags for automated documentation and
37 !+ cross-referencing of the FORTRAN sources
38 !
39 !history J-M HERVOUET (EDF LAB, LNHE)
40 !+ 07/03/2016
41 !+ V7P2
42 !+ Changing array SIZE into TAILLE (SIZE is a Fortran function).
43 !+ Declarations CHARACTER*... replaced by CHARACTER(LEN=...).
44 !
45 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
46 !| ADRESS |<--| TABLEAU DES ADRESSES DES MOTS CLES
47 !| DEFATT |<--| TABLEAU DES SUBMITS PAR DEFAUT
48 !| DEFCAR |<--| TABLEAU DES VALEURS CARACTERES PAR DEFAUT
49 !| DEFINT |<--| TABLEAU DES VALEURS ENTIERES PAR DEFAUT
50 !| DEFLOG |<--| TABLEAU DES VALEURS LOGIQUES PAR DEFAUT
51 !| DEFREA |<--| TABLEAU DES VALEURS REELLES PAR DEFAUT
52 !| DIMENS |<--| TABLEAU DES DIMENSIONS DES MOTS CLES
53 !| DOC |-->| LOGIQUE DE DOCUMENTATION DE LA SORTIE
54 !| | | = VRAI : IMPRIME L'AIDE (FICHIER RESULTAT)
55 !| | | = FAUX : N'IMPRIME PAS L'AIDE
56 !| GESTD |-->| LOGIQUE D'APPEL PAR LE GESTIONNAIRE D'ETUDES
57 !| INDIC |<--| TABLEAU D'INDICATEURS D'ETAT DES MOTS CLES
58 !| | | = 0 : PAS DE SUBMIT & NON TABLEAU
59 !| | | = 1 : PAS DE SUBMIT & TABLEAU
60 !| | | = 2 : AVEC SUBMIT & NON TABLEAU
61 !| | | = 3 : AVEC SUBMIT & TABLEAU
62 !| LLNG |-->| NUMERO DE LA LANGUE DE DECODAGE
63 !| LLU |-->| NUMERO DE L'UNITE LOGIQUE DES SORTIES
64 !| MOTATT |<--| TABLEAU DES SUBMITS
65 !| MOTCAR |<--| TABLEAU DES VALEURS CARACTERES
66 !| MOTCLE |<--| TABLEAU DES MOTS CLES ACTIFS
67 !| MOTINT |<--| TABLEAU DES VALEURS ENTIERES
68 !| MOTLOG |<--| TABLEAU DES VALEURS LOGIQUES
69 !| MOTREA |<--| TABLEAU DES VALEURS REELLES
70 !| NBLANG |-->| NOMBRE DE LANGUES CONNUES
71 !| NFICDA |-->| NUMERO DE CANAL DU FICHIER DES DONNEES
72 !| NFICMO |-->| NUMERO DE CANAL DU FICHIER DES MOTS-CLES
73 !| NMAX |-->| TAILLE MAXIMALE AUTORISEE POUR LES TABLEAUX
74 !| RETRY |---|
75 !| TAILLE |<--| TABLEAU DES LONGUEURS DES MOTS CLES
76 !| TROUVE |<--| INDICATEUR D'ETAT DES MOTS CLES
77 !| | | = 0 : AUCUNE VALEUR TROUVEE
78 !| | | = 1 : VALEUR PAR DEFAUT TROUVEE
79 !| | | = 2 : VALEUR TROUVEE (FICHIER DE DONNEES)
80 !| | | = 3 : AUCUNE VALEUR TROUVEE (OPTIONNELLE)
81 !| | | = 5 : TABLEAU DE MOTS A SUBMIT COMPACTE
82 !| | | = 6 : MOT CLE A SUBMIT FORCE NON AFFECTE
83 !| | | = 7 : MOT CLE A SUBMIT FORCE AFFECTE (DICO)
84 !| | | = 8 : MOT CLE A SUBMIT FORCE AFFECTE (CAS)
85 !| | | = 9 : FICHIER DICO : SUBMIT + VALEUR LANCEUR
86 !| | | =10 : FICHIER CAS : SUBMIT + VALEUR LANCEUR
87 !| USRATT |<--| TABLEAU DES SUBMITS A USAGE LOCAL
88 !| USRCAR |<--| TABLEAU DES VALEURS CARACTERES A USAGE LOCAL
89 !| USRINT |<--| TABLEAU DES VALEURS ENTIERES A USAGE LOCAL
90 !| USRLOG |<--| TABLEAU DES VALEURS LOGIQUES A USAGE LOCAL
91 !| USRREA |<--| TABLEAU DES VALEURS REELLES A USAGE LOCAL
92 !| UTINDX |<--| TABLEAU DE LOGIQUES D'UTILISATION DES INDEX
93 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
94 !
97  IMPLICIT NONE
98 !
99  INTEGER NMAX,LLNG,LLU,NFICMO,NFICDA,NBLANG,RETRY
100  INTEGER MOTINT(*),DEFINT(*),USRINT(*)
101  INTEGER TAILLE(4,*),ADRESS(4,*),DIMENS(4,*)
102  INTEGER INDIC(4,*),TROUVE(4,*)
103  LOGICAL MOTLOG(*),DEFLOG(*),USRLOG(*),UTINDX(4,*),DOC
104  CHARACTER(LEN=72) MOTCLE(4,*)
105  CHARACTER(LEN=PATH_LEN) MOTATT(4,*),DEFATT(*),USRATT(*)
106  CHARACTER(LEN=PATH_LEN) MOTCAR(*),DEFCAR(*),USRCAR(*)
107  DOUBLE PRECISION MOTREA(*),DEFREA(*),USRREA(*)
108 !
109  INTEGER INTLU,NEXT,PREV,PREVAL,LONGLU
110  LOGICAL LOGLU
111  CHARACTER(LEN=PATH_LEN) CARLU,PARAM2
112  DOUBLE PRECISION REALU
113 !
114 !-----------------------------------------------------------------------
115 !
116  INTEGER I,K,IVAL,LCAR,ICOL,JCOL,ILONG,ITYP,NUMERO,I2
117  INTEGER DEPLAC,ADD,J,OFFSET(4),NBMOT
118  INTEGER TYPIGN(100),LONIGN(100),NMAXR(4),ORDRE
119  INTEGER :: ADSRC,ADDES,NULINT,NVAL,NIGN,L1,LONPRO(15)
120  LOGICAL DYNAM,LANGUE,NULLOG,LUIGN,AIDLNG,VUMOT
121  LOGICAL ARRET,VUCMD(5),VUCMD0(5),EXECMD,GESTD
122  CHARACTER(LEN=1) PTVIRG,QUOTE
123  CHARACTER(LEN=9) :: MOTPRO(15),TYPE
124  CHARACTER(LEN=72) MOTIGN(100),LIGNE
125  CHARACTER(LEN=PATH_LEN) NULCAR,TYPE2
126  DOUBLE PRECISION NULREA
127 !
128 !-----------------------------------------------------------------------
129 !
130  EXTERNAL carlu,intlu,loglu,realu,next,prev,preval,longlu
131 !
132 !-----------------------------------------------------------------------
133 !
134  parameter( motpro = (/
135  & 'NOM ','TYPE ','INDEX ','TAILLE ','DEFAUT ',
136  & 'AIDE ','CHOIX ','RUBRIQUE ','NIVEAU ','MNEMO ',
137  & 'COMPOSE ','COMPORT ','CONTROLE ','APPARENCE','SUBMIT ' /) )
138 ! LENGTH OF THE PROTECTED WORDS
139  parameter( lonpro =(/ 3,4,5,6,6,4,5,8,6,5,7,7,8,9,6 /) )
140 !
141 !***********************************************************************
142 ! RCS AND SCCS MARKING
143 !
144 !***********************************************************************
145 !
146 ! TYPE NUMBERING : 1 : INTEGER
147 ! 2 : REAL
148 ! 3 : LOGICAL
149 ! 4 : CHARACTER
150 !
151 ! MOTPRO(I) : IEME MOT RESERVE POUR LE PROGRAMME (NOM,TYPE,...)
152 ! MOTCLE(I,J) : NOM DU JIEME MOT-CLE DE TYPE I
153 ! DIMENS(I,J) : DIMENSION DU JIEME MOT-CLE DE TYPE I
154 ! ADRESS(I,J) : ADRESSE DU JIEME MOT-CLE DE TYPE I DANS LE TABLEAU
155 ! MOTINT(I) : IEME RESULTAT ENTIER
156 ! MOTREA(I) : IEME RESULTAT REEL
157 ! MOTLOG(I) : IEME RESULTAT LOGIQUE
158 ! MOTCAR(I) : IEME RESULTAT CARACTERE
159 ! MOTATT(I,J) : JEME SUBMIT DU TYPE I
160 ! TAILLE(I,J) : LONGUEUR DU JIEME MOT-CLE DE TYPE I
161 ! TROUVE(I,J) : CONCERNE LE JIEME MOT-CLE DE TYPE I
162 ! INDIC(I,J) : CONCERNE LE JIEME MOT-CLE DE TYPE I
163 ! LUIGN : INDIQUE SI C'EST UN MOT POUR EDAMOX SEULEMENT
164 ! MOTIGN(I) : IEME MOT LU DANS LE FICHIER CAS DONNE PAR EDAMOX
165 ! ET LU COMME IGNORE DANS LE DICTIONNAIRE
166 ! DYNAM : LOGIQUE POUR LE DYNAMIQUE (.TRUE. SI MODE DYNAMIQUE)
167 ! VUCMD(I) : TABLEAU DE LOGIQUES (MEMORISATION DES COMMANDES)
168 ! I=1->&LIS;I=2->&ETA;I=3->&IND;I=4->&STO;I=5->&FIN
169 ! EXECMD : LOGIQUE D'ACTIVATION DES COMMANDES MEMORISEES
170 ! NMAXR(I) : INDEX MAXIMUM REELLEMENT UTILISE POUR LE TYPE I
171 !
172 !-----------------------------------------------------------------------
173 !
174 ! INITIALISES :
175 !
176  lu = llu
177  lng = llng
178  arret = .false.
179  erreur = .false.
180  retour = .false.
181  dynam = .false.
182  execmd = .false.
183  aidlng = .false.
184  vumot = .false.
185  longli = 72
186  nfic = nficmo
187  ptvirg = ';'
188  quote = ''''
189 ! TABUL = CHAR(9)
190  nbmot = 0
191  nign = 0
192  ordre = 0
193  param = ' '
194  longu = 0
195  ntyp = -100
196  indx = 123456
197  itai = -100
198  deflu = 0
199 !
200  DO k=1, 5
201  vucmd(k) = .false.
202  vucmd0(k) = .false.
203  ENDDO ! K
204 !
205  DO k=1,100
206  motign(k)= ' '
207  typign(k)=1
208  lonign(k)=0
209  ENDDO ! K
210 !
211  DO k=1, 4
212  nmot(k) = 0
213  nmaxr(k) = 0
214  offset(k) = 1
215  DO i=1,nmax
216  adress(k,i) = 0
217  dimens(k,i) = 1
218  trouve(k,i) = 0
219  taille(k,i) = 0
220  utindx(k,i) = .false.
221  motint(i) = 0
222  motrea(i) = 0.
223  motlog(i) = .false.
224  motcar(i) = ' '
225  motatt(k,i) = ' '
226  defint(i) = 0
227  defrea(i) = 0.
228  deflog(i) = .false.
229  defcar(i) = ' '
230  defatt(i) = ' '
231  usrint(i) = 0
232  usrrea(i) = 0.
233  usrlog(i) = .false.
234  usrcar(i) = ' '
235  usratt(i) = ' '
236  motcle(k,i) = ' '
237  indic(k,i) = 0
238  ENDDO ! I
239  ENDDO ! K
240 !
241 ! CHECKS THE LANGUAGE
242 !
243  IF(lng.LT.1.OR.lng.GT.nblang) THEN
244  WRITE(lu,*) ' '
245  WRITE(lu,*) ' CHOICE FOR LANGAGE = ',lng,' INVALID.'
246  WRITE(lu,*) ' DAMOCLES STOPS'
247  WRITE(lu,*) ' '
248  CALL plante(1)
249  stop
250  ENDIF
251 !
252 ! 99 : NEW FILE 100 : NEW KEYWORD
253 !
254  99 CONTINUE
255 !
256  icol = longli
257  nlign = 0
258 !
259 ! SEEKS THE FIRST NON-WHITE CHARACTER (IGNORES COMMENTED LINES) :
260 !
261  icol = next(icol+1,ligne)
262 !
263 100 CONTINUE
264 !
265 ! IF REACHED THE END OF FILE :
266 !
267  IF(retour) GO TO 900
268 !
269 ! LOCATES THE COMMANDS STARTING WITH &
270 !
271  IF ( ligne(icol:icol).EQ.'&' ) THEN
272  CALL cmd (icol,ligne,adress,dimens,trouve,motcle,nmot,
273  & motint,motrea,motlog,motcar,motatt,indic,taille,
274  & utindx,dynam,vucmd,execmd,nficda,nmaxr)
275 !
276 ! IF FOUND &FIN, ENDS AFTER COMPACTING :
277  IF (vucmd(5)) GO TO 900
278 ! IF FOUND &STO, ENDS FILE READING :
279  IF (vucmd(4)) GO TO 1000
280 !
281  icol = next(icol+1,ligne)
282  IF(retour) GO TO 900
283  ELSE
284 !
285  i2 = preval(icol+1,ligne,'=',':','=')
286 ! CASE WHERE '=' IS ON THE FOLLOWING LINE
287  IF(i2.GT.longli) i2=longli
288  jcol = prev(i2,ligne)
289  ilong = jcol - icol + 1
290 !
291  luign = .false.
292  IF (nfic.EQ.nficmo.AND.indx.LE.0) luign = .true.
293 !
294  CALL dico(ityp,numero,ilong,ligne(icol:jcol),
295  & motcle,motpro,lonpro,taille,utindx,langue,
296  & aidlng,motign,nign,luign,typign,lonign,nficda,
297  & nblang,nmaxr)
298 !
299  IF(erreur) THEN
300  WRITE(lu,*)
301  WRITE(lu,*)'************************'
302  WRITE(lu,*)'* DAMOCLES STOPPED *'
303  WRITE(lu,*)'************************'
304  GO TO 900
305  ENDIF
306 !
307 ! STOPS IF THE WORD IS UNKNOWN
308  IF(ityp.EQ.0) THEN
309  arret=.true.
310  GOTO 1300
311  ENDIF
312 !
313  icol = preval(icol+1,ligne,'=',':','=')
314 ! CASE WHERE '=' IS ON THE FOLLOWING LINE
315  IF(icol.GT.longli) THEN
316  icol = next(longli,ligne)
317  IF(retour) GO TO 900
318  ENDIF
319 !
320 ! 1) READS AND ASSIGNS A VALUE:
321 !
322  IF(ityp.LE.4) THEN
323 !
324 ! A PRIORI THE NUMBER OF VALUES TO READ IS DIMENS(ITYP,NUMERO)
325 ! BUT MISSING OR ADDITIONAL VALUES ARE TOLERATED
326 !
327 ! WHEN THIS IS IDENTIFIED THE VARIOUS ARRAYS ARE UPDATED
328 !
329 !
330  IF (.NOT.(luign)) THEN
331  ntyp = ityp
332  indx = numero
333  itai = dimens(ntyp,indx)
334  add = adress(ntyp,indx)
335 ! PARAM = MOTCLE(NTYP,INDX)
336 ! LONGU = LONGLU(PARAM)
337  ival = 1
338  IF (trouve(ntyp,indx).EQ.2.OR.trouve(ntyp,indx).EQ.8) THEN
339  WRITE(lu,*) ' '
340  WRITE(lu,*) 'THE KEY-WORD: ',motcle(ntyp,indx)(1:ilong)
341  WRITE(lu,*) 'APPPEARS AT LEAST TWICE , THE LAST',
342  & ' VALUE WILL BE KEPT...'
343  WRITE(lu,*) ' '
344  ENDIF
345  ENDIF
346  10 CONTINUE
347  IF (.NOT.(luign)) THEN
348  IF (ntyp.EQ.1) THEN
349  defint(ival) = intlu(icol,ligne)
350  ELSEIF (ntyp.EQ.2) THEN
351  defrea(ival) = realu(icol,ligne)
352  ELSEIF (ntyp.EQ.3) THEN
353  deflog(ival) = loglu(icol,ligne)
354  ELSEIF (ntyp.EQ.4) THEN
355  defcar(ival) = carlu(lcar,icol,ligne,quote,motcle,
356  & taille,motign,lonign,nmaxr,
357  & nficda,len(defcar(ival)))
358  ENDIF
359 !
360 ! SUBMIT FOR A CHARACTER ARRAY
361 ! THERE IS ONLY ONE; WHEREAS IT WAS PREVIOUSLY ASSUMED
362 ! THAT THERE WERE AS MANY AS CHARACTER STRINGS ?
363  defatt(ival) = motatt(ntyp,add)
364 !
365 ! CASE OF THE OPTIONAL EMPTY SUBMIT: REMAINS OPTIONAL
366  IF (itai.LE.1.AND.indic(ntyp,indx).GE.2.AND.
367  & trouve(ntyp,indx).EQ.3) THEN
368  l1 = longlu(defcar(ival))
369  IF (l1.GT.0) trouve(ntyp,indx)=2
370 !
371  ELSEIF(trouve(ntyp,indx).LT.6) THEN
372  trouve(ntyp,indx)=2
373 !
374  ELSEIF (trouve(ntyp,indx).EQ.6.OR.
375  & trouve(ntyp,indx).EQ.7) THEN
376  trouve(ntyp,indx)=8
377  ENDIF
378 !
379  ELSE
380  ntyp = ityp
381  IF (ntyp .EQ. 1) THEN
382  nulint = intlu(icol,ligne)
383  ELSEIF (ntyp .EQ. 2) THEN
384  nulrea = realu(icol,ligne)
385  ELSEIF (ntyp .EQ. 3) THEN
386  nullog = loglu(icol,ligne)
387  ELSEIF (ntyp .EQ. 4) THEN
388  nulcar = carlu(lcar,icol,ligne,quote,motcle,
389  & taille,motign,lonign,nmaxr,nficda,
390  & len(nulcar))
391  ENDIF
392  ENDIF
393 !
394  icol = next(icol+1,ligne)
395  IF(icol.LE.longli) THEN
396  IF(ligne(icol:icol).EQ.ptvirg) THEN
397  ival = ival + 1
398  GO TO 10
399  ENDIF
400  ENDIF
401 !
402  IF (luign) GO TO 100
403 !
404 ! ALL THE VALUES FOR A KEYWORD HAVE BEEN READ
405 !
406 ! PARTICULAR CASE: KEYWORDS WITH A SUBMIT
407 ! PREVENTS DYNAMIC ALLOCATION WHEN VALUES ARE GREATER THAN TAILLE (SEE SUBMIT)
408 ! OR FOR KEYWORDS NOT ASSOCIATED WITH ARRAYS
409 !
410  IF (indic(ntyp,indx).NE.1.AND.ival.GT.itai) ival = itai
411 !
412 !
413 ! IF THE KEYWORD &DYN IS NOT IN THE STEERING FILE AND IF THERE ARE
414 ! MORE VALUES THAN THE PARAMETER TAILLE THEN TRUNCATES TO ITAI;
415 ! ELSE (&DYN IN THE STEERING FILE) READS ALL THE VALUES OF THE STEERING FILE
416 !
417 ! IS IT REALLY NECESSARY TO SET BACK TO DYNAMIC MODE EVERY TIME ???
418 ! IS MODIFYING DIMENS NOT ENOUGH ?
419 ! IF LECDON IS WELL WRITTEN : IT DOES NOT MATTER IF THERE ARE HOLES
420 ! IN THE ARRAYS SENT ... THINK ABOUT THIS
421 !
422 !
423  IF (.NOT.(dynam)) THEN
424  DO i=1 , min(ival,itai)
425  IF (ntyp.EQ.1) THEN
426  motint(add+i-1) = defint(i)
427  ELSEIF (ntyp.EQ.2) THEN
428  motrea(add+i-1) = defrea(i)
429  ELSEIF (ntyp.EQ.3)THEN
430  motlog(add+i-1) = deflog(i)
431  ELSEIF (ntyp.EQ.4)THEN
432  motcar(add+i-1) = defcar(i)
433  ENDIF
434  ENDDO ! I
435  ELSE
436  DO i=1 ,nmaxr(ntyp)
437  IF (utindx(ntyp,i)) THEN
438  IF(adress(ntyp,i) .NE. add) THEN
439  IF (adress(ntyp,i) .LT. add) deplac = 0
440  IF (adress(ntyp,i) .GT. add) deplac = ival - itai
441  DO j=1 , dimens(ntyp,i)
442  adsrc = adress(ntyp,i)+j-1
443  addes = adress(ntyp,i)+j-1+deplac
444  IF (addes.GT. nmax) GO TO 1515
445  IF (ntyp.EQ.1) THEN
446  usrint(addes) = motint(adsrc)
447  ELSEIF (ntyp.EQ.2) THEN
448  usrrea(addes) = motrea(adsrc)
449  ELSEIF (ntyp.EQ.3) THEN
450  usrlog(addes) = motlog(adsrc)
451  ELSEIF (ntyp.EQ.4) THEN
452  usrcar(addes) = motcar(adsrc)
453  ENDIF
454  usratt(addes) = motatt(ntyp,adsrc)
455  ENDDO ! J
456  IF (adress(ntyp,i) .GT. add) THEN
457  adress(ntyp,i) = adress(ntyp,i) + deplac
458  IF (adress(ntyp,i) .GT. nmax) GO TO 1515
459  ENDIF
460 !
461  ELSE IF (adress(ntyp,i) .EQ. add) THEN
462  DO j=1 ,ival
463  IF (ntyp.EQ.1) THEN
464  usrint(add+j-1) = defint(j)
465  ELSEIF (ntyp.EQ.2) THEN
466  usrrea(add+j-1) = defrea(j)
467  ELSEIF (ntyp.EQ.3) THEN
468  usrlog(add+j-1) = deflog(j)
469  ELSEIF (ntyp.EQ.4)THEN
470  usrcar(add+j-1) = defcar(j)
471  ENDIF
472  usratt(add+j-1) = defatt(j)
473  ENDDO ! J
474  dimens(ntyp,i) = ival
475  ENDIF
476  ENDIF
477  ENDDO ! I
478 ! SORTS IN FINAL ARRAYS
479  DO i=1 ,nmaxr(ntyp)
480  IF (utindx(ntyp,i)) THEN
481  adsrc = adress(ntyp,i)
482  DO j=1 ,dimens(ntyp,i)
483  IF (ntyp.EQ.1) THEN
484  motint(adsrc+j-1)=usrint(adsrc+j-1)
485  ELSEIF (ntyp.EQ.2) THEN
486  motrea(adsrc+j-1)=usrrea(adsrc+j-1)
487  ELSEIF (ntyp.EQ.3) THEN
488  motlog(adsrc+j-1)=usrlog(adsrc+j-1)
489  ELSEIF (ntyp.EQ.4) THEN
490  motcar(adsrc+j-1)=usrcar(adsrc+j-1)
491  ENDIF
492  motatt(ntyp,adsrc+j-1) = usratt(adsrc+j-1)
493  ENDDO ! J
494  ENDIF
495  ENDDO ! I
496  ENDIF
497 !
498 !
499 ! ICOL = NEXT(ICOL,LIGNE)
500 !
501 ! ENDIF DU IF(ITYP.LE.4) ...
502  ENDIF
503 !
504 !
505 ! 2) RESERVED KEYWORDS:
506 !
507 ! RESERVED KEYWORDS CURRENTLY ARE:
508 !
509 ! 'NOM' :NUMERO = 1 (DE TYPE CARACTERE)
510 ! 'TYPE' :NUMERO = 2 (DE TYPE CARACTERE)
511 ! 'INDEX' :NUMERO = 3 (DE TYPE ENTIER)
512 ! 'TAILLE' :NUMERO = 4 (DE TYPE ENTIER)
513 ! 'DEFAUT' :NUMERO = 5 (DE TYPE VARIABLE)
514 ! 'AIDE' :NUMERO = 6 (DE TYPE CARACTERE)
515 ! 'CHOIX' :NUMERO = 7 (DE TYPE VARIABLE)
516 ! 'RUBRIQUE' :NUMERO = 8 (DE TYPE CARACTERE)
517 ! 'NIVEAU' :NUMERO = 9 (DE TYPE ENTIER)
518 ! 'MNEMO' :NUMERO = 10 (DE TYPE CARACTERE)
519 ! 'COMPOSE' :NUMERO = 11 (DE TYPE CARACTERE)
520 ! 'COMPORT' :NUMERO = 12 (DE TYPE CARACTERE)
521 ! 'CONTROLE' :NUMERO = 13 (DE TYPE ENTIER)
522 ! 'APPARENCE' :NUMERO = 14 (DE TYPE CARACTERE)
523 ! 'SUBMIT' :NUMERO = 15 (DE TYPE CARACTERE)
524 !
525  IF(ityp.EQ.5) THEN
526 !
527 ! NAME
528 !
529  IF(numero.EQ.1) THEN
530 !
531 ! SHOULD NOT COUNT THE SAME WORD IN SEVERAL LANGUAGES SEVERAL TIMES
532 ! COUNTED ONLY ONCE IN FIRST FOUND LANGUAGE
533 !
534  IF (.NOT.(vumot)) nbmot = nbmot + 1
535 !
536  ordre = 1
537 !
538 ! COMING FROM THE PRECEDING WORD, SORTS IT BEFORE READING THE FOLLOWING
539 ! SINCE ALL THE INFORMATION ON THE PRECEDING WORD IS AVAILABLE
540 !
541  IF (nbmot.GT.1 .AND. (.NOT.(vumot)) ) THEN
542  IF (indx.GT.nmaxr(ntyp)) nmaxr(ntyp)=indx
543  CALL classe(dimens,taille,motcle,utindx,nmax,
544  & offset,adress,indic,luign,
545  & motint,motrea,motlog,motcar,motatt ,
546  & defcar,defint,deflog,defrea,defatt )
547  ENDIF
548 !
549 ! SIGNALS THAT THIS NEW KEYWORD WAS ALREADY ENCOUNTERED IN ANOTHER LANGUAGE
550  IF (.NOT.(vumot)) vumot=.true.
551 !
552 ! NAME OF THE KEYWORD
553  IF (langue) THEN
554  param2= carlu(lcar,icol,ligne,quote,motcle,taille,motign,
555  & lonign,nmaxr,nficda,len(param))
556  longu = lcar
557  param=param2(1:min(72,longu))
558  ELSE
559 ! READS THE NAME OF A NON-REQUESTED LANGUAGE (NOT USED)
560  nulcar = carlu(lcar,icol,ligne,quote,motcle,taille,
561  & motign,lonign,nmaxr,nficda,len(nulcar))
562  ENDIF
563 !
564  icol = next(icol+1,ligne)
565 !
566 ! TYPE
567 !
568  ELSE IF(numero.EQ.2) THEN
569  vumot = .false.
570  IF (ordre.NE.1) GOTO 1500
571  ordre=2
572  type2= carlu(lcar,icol,ligne,quote,motcle,taille,motign,
573  & lonign,nmaxr,nficda,len(type))
574  TYPE=type2(1:min(lcar,9))
575  IF(TYPE(1:6).EQ.'ENTIER'
576  & .OR.TYPE(1:8).EQ.'INTEGER') then
577  ntyp = 1
578  ELSEIF(TYPE(1:4).EQ.'REEL'
579  & .OR.TYPE(1:4).EQ.'REAL') then
580  ntyp = 2
581  ELSEIF(TYPE(1:7).EQ.'LOGIQUE'
582  & .OR.TYPE(1:7).EQ.'LOGICAL') then
583  ntyp = 3
584  ELSEIF(TYPE(1:9).EQ.'CARACTERE'
585  & .OR.TYPE(1:6).EQ.'STRING') then
586 ! * OR.TYPE(1:4).EQ.'FILE'
587 ! * OR.TYPE(1:7).EQ.'FICHIER') THEN
588  ntyp = 4
589  ELSE
590 ! ERROR: UNKNOWN TYPE
591  WRITE (lu,1003) ligne
592 1003 FORMAT(1x,a72,/,1x,'UNKNOWN TYPE ON THIS LINE')
593  CALL plante(1)
594  stop
595  ENDIF
596  icol = next(icol+1,ligne)
597 !
598 ! INDEX
599 !
600  ELSE IF(numero.EQ.3) THEN
601  IF (ordre.NE.2) GOTO 1500
602  ordre=3
603  indx = intlu(icol,ligne)
604  icol = next(icol+1,ligne)
605 !
606 ! CASE INDEX=-1 : WORD FOR EDAMOX CONSTRUCTION, TO KEEP
607 !
608  IF (indx.EQ.-1) THEN
609  nign = nign + 1
610  IF (nign.GT.100) THEN
611  WRITE(lu,*) 'TOO MANY WORDS FOR EDAMOX',
612  & ' (MAX=100)'
613  erreur = .true.
614  GO TO 900
615  ENDIF
616  motign(nign)=param(1:longu)
617  lonign(nign)=longu
618  typign(nign)=ntyp
619  ENDIF
620 !
621 ! SIZE
622 !
623  ELSE IF(numero.EQ.4) THEN
624  IF (ordre.NE.3) GOTO 1500
625  ordre=4
626  itai = intlu(icol,ligne)
627  icol = next(icol+1,ligne)
628 !
629 ! DEFAULT VALUE
630 ! FOR ARRAYS, IT IS NOT NECESSARY TO SET ALL VALUES
631 !
632  ELSE IF(numero.EQ.5) THEN
633 !
634 !
635  IF (ordre.LT.3.OR.ordre.GT.6) GOTO 1500
636  ordre=6
637  IF (langue) THEN
638  deflu = 1
639  IF (ntyp.NE.4) trouve(ntyp,indx) = 1
640 !
641 200 CONTINUE
642 !
643  IF (ntyp .EQ. 1) THEN
644  defint(deflu) = intlu(icol,ligne)
645  ELSE IF (ntyp .EQ. 2) THEN
646  defrea(deflu) = realu(icol,ligne)
647  ELSE IF (ntyp .EQ. 3) THEN
648  deflog(deflu) = loglu(icol,ligne)
649  ELSE IF (ntyp .EQ. 4) THEN
650  defcar(deflu) = carlu(lcar,icol,ligne,quote,motcle,
651  & taille,motign,lonign,nmaxr,nficda,
652  & len(defcar(deflu)))
653  l1 = longlu(defcar(deflu))
654  IF (itai.LE.1.AND.indic(ntyp,indx).GE.2) THEN
655  IF (trouve(ntyp,indx).LE.3) THEN
656  IF (l1.GT.0) trouve(ntyp,indx)=1
657  ELSEIF(trouve(ntyp,indx).EQ.6) THEN
658  trouve(ntyp,indx)=7
659  ENDIF
660  ELSE
661  trouve(ntyp,indx)=1
662  ENDIF
663  ENDIF
664 !
665  icol = next(icol+1,ligne)
666 !
667  IF(icol.GT.longli) THEN
668  icol = longli
669  ELSE
670  IF(ligne(icol:icol).EQ.ptvirg) THEN
671  deflu = deflu + 1
672  GO TO 200
673  ELSE
674  icol=icol-1
675  ENDIF
676  ENDIF
677 
678 !
679 !
680 !
681  ELSE
682 !
683 ! READS THE DEFAULT OF A NON-REQUESTED LANGUAGE (NOT USED)
684 !
685  210 CONTINUE
686 !
687  IF (ntyp .EQ. 1) THEN
688  nulint = intlu(icol,ligne)
689  ELSE IF (ntyp .EQ. 2) THEN
690  nulrea = realu(icol,ligne)
691  ELSE IF (ntyp .EQ. 3) THEN
692  nullog = loglu(icol,ligne)
693  ELSE IF (ntyp .EQ. 4) THEN
694  nulcar = carlu(lcar,icol,ligne,quote,motcle,taille,
695  & motign,lonign,nmaxr,nficda,len(nulcar))
696  ENDIF
697 !
698  icol = next(icol+1,ligne)
699 !
700  IF (ligne(icol:icol) .EQ. ptvirg) THEN
701  GO TO 210
702  ELSE
703  icol=icol-1
704  ENDIF
705  ENDIF
706 !
707  icol = next(icol+1,ligne)
708 !
709 ! HELP
710 !
711  ELSE IF(numero.EQ.6) THEN
712 !
713  IF(aidlng.AND.doc) THEN
714  WRITE(lu,511)
715 511 FORMAT(1x,72('-'))
716  WRITE(lu,*) param(1:longu)
717  WRITE(lu,511)
718  ENDIF
719  CALL aidelu(icol,ligne,doc.AND.aidlng)
720  aidlng = .false.
721 !
722 !
723 ! 'CHOIX' 'RUBRIQUE' 'NIVEAU' 'MNEMO' 'COMPOSE' 'COMPORT' 'CONTROLE' 'APPARENCE'
724 ! NUMBER 7 TO 14 INCLUDED
725 !
726  ELSE IF((numero .GE. 7) .AND. (numero .LE. 14)) THEN
727  CALL aidelu(icol,ligne,.false.)
728 !
729 ! DEFINES A SUBMIT TYPE
730  ELSE IF (numero .EQ. 15) THEN
731  IF (ordre.NE.3.AND.ordre.NE.4) GOTO 1500
732  ordre=5
733  IF (.NOT.(luign)) indic(ntyp,indx)=indic(ntyp,indx)+2
734  icol = next(icol+1,ligne) -1
735  CALL influ(icol,ligne,defatt,trouve,luign,motcle,taille,
736  & motign,lonign,nmaxr,nficda,gestd)
737  DO i=1,deflu
738  defint(i) = 0
739  defrea(i) = 0.
740  deflog(i) = .false.
741  defcar(i) = ' '
742  ENDDO ! I
743  IF (erreur) GO TO 900
744  icol = next(icol,ligne)
745  ENDIF
746 !
747  ENDIF
748 !
749  ENDIF
750 !
751  GO TO 100
752 900 CONTINUE
753  IF(erreur) THEN
754  WRITE(lu,*)' '
755  IF(nfic.EQ.nficmo) THEN
756  WRITE(lu,*)'-------------------------------'
757  WRITE(lu,*)'- ERROR IN THE DICTIONARY -'
758  WRITE(lu,*)'-------------------------------'
759  CALL plante(1)
760  stop
761  ELSE
762  WRITE(lu,*)'-----------------------------------------'
763  WRITE(lu,*)'- ERROR IN THE STEERING FILE -'
764  WRITE(lu,*)'-----------------------------------------'
765  retry=retry+1
766  ENDIF
767  IF(retry.LE.1) THEN
768  RETURN
769  ELSE
770  CALL plante(1)
771  stop
772  ENDIF
773  ENDIF
774 !
775  IF(nfic.EQ.nficmo) THEN
776  IF (indx.GT.nmaxr(ntyp)) nmaxr(ntyp)=indx
777  CALL classe(dimens,taille,motcle,utindx,nmax,
778  & offset,adress,indic,luign,
779  & motint,motrea,motlog,motcar,motatt ,
780  & defcar,defint,deflog,defrea,defatt )
781  ENDIF
782  IF(nficmo.EQ.nficda.OR.nfic.EQ.nficda) THEN
783 ! TRUE END: 2 FILES READ OR 2 FILES IN 1 READ
784  GO TO 1000
785  ELSE
786 ! FALSE END: REMAINS A FILE
787  nfic = nficda
788  retour = .false.
789  GO TO 99
790  ENDIF
791 !
792 1515 CONTINUE
793  WRITE(lu,*)'*********************************************'
794  WRITE(lu,*)'ADRESS GREATER THAN NMAX = ',nmax
795  WRITE(lu,*)'TOO MANY VALUES OF TYPE : ',ntyp,' DECLARED.'
796  WRITE(lu,*)'STOP OF DAMOCLES AT KEY-WORD NUMBER: ',indx
797  WRITE(lu,*)'*********************************************'
798  CALL plante(1)
799  stop
800 !
801 1000 CONTINUE
802 !
803 ! COMPACTS WHITE CHARS - REDISTRIBUTES - TESTS THE RESULTS
804 !
805  DO k=1,nmaxr(4)
806  IF (utindx(4,k).AND.indic(4,k).GE.2.AND.
807  & trouve(4,k).LT.3.AND.trouve(4,k).GT.0) THEN
808  add = adress(4,k)
809  param = motcle(4,k)
810  longu = taille(4,k)
811  nval = dimens(4,k)
812  i=0
813  1180 CONTINUE
814  i=i+1
815  1185 CONTINUE
816 ! IF IT IS A WHITE CHAR (LENGTH=0):
817  IF (longlu(motcar(add+i-1)).EQ.0) THEN
818  DO j=i,nval-1
819  motcar(add+j-1)=motcar(add+j)
820 !
821 ! SUBMITS DO NOT FOLLOW IF THIS LINE IS COMMENTED OUT
822 ! OTHERWISE PB EXPERIENCED WITH STBTEL
823 ! MOTATT(4,ADD+J-1)=MOTATT(4,ADD+J)
824 !
825  ENDDO ! J
826  nval = nval-1
827  IF (i.LE.nval) GO TO 1185
828  ENDIF
829  IF (i.LT.nval) GO TO 1180
830 !
831 ! CASE OF EMPTY ALLOCATIONS FOR NON ARRAYS
832 !
833  IF (nval.EQ.0.AND.indic(4,k).EQ.2) THEN
834  WRITE(lu,*) 'EMPTY ALLOCATION NOT ALLOWED FOR ',
835  & 'THE KEY WORD : ', param(1:longu)
836  WRITE(lu,*)
837  arret = .true.
838  GO TO 1300
839  ENDIF
840 !
841 ! HAS COMPACTED ARRAYS TO DIMENSION NVAL (CAN BE = 0)
842  IF (nval.LT.dimens(4,k)) THEN
843  dimens(4,k) = nval
844  trouve(4,k) = 5
845  ENDIF
846  ENDIF
847 !
848 ! CASE OF SUBMIT ARRAYS NEVER AFFECTED -> DIMENSION = 0
849  IF (utindx(4,k).AND.indic(4,k).EQ.3.AND.trouve(4,k).EQ.0.
850  & and.dimens(4,k).GT.1) THEN
851  dimens(4,k) = 0
852  trouve(4,k) = 3
853  ENDIF
854 !
855  ENDDO ! K
856 !
857 ! CARRIES OUT THE COMMANDS RECORDED BEFORE THE END
858  execmd = .true.
859 ! TO AVOID TESTS ON LINE IN CMD
860  ligne = 'NUL'
861  DO k = 1,5
862  vucmd0(k) = vucmd(k)
863  vucmd(k) = .false.
864  ENDDO
865 !
866  DO k=1,5
867  vucmd(k)=vucmd0(k)
868  IF (vucmd(k).AND.(.NOT.(erreur))) THEN
869  CALL cmd (icol,ligne,adress,dimens,trouve,motcle,nmot,
870  & motint,motrea,motlog,motcar,motatt,indic,taille,
871  & utindx,dynam,vucmd,execmd,nficda,nmaxr)
872  vucmd(k) = .false.
873  ENDIF
874  ENDDO
875 !
876 ! LOOKS FOR REQUIRED KEYWORDS THAT HAVE NOT BEEN READ:
877 !
878  WRITE(lu,*) ' '
879 !
880  DO k = 1,4
881  DO indx = 1 , nmaxr(k)
882  IF (utindx(k,indx)) THEN
883  IF (trouve(k,indx).EQ.0) THEN
884 !
885 ! IF NO DEFAULT VALUE AND NOTHING IN STEERING FILE, DIMENS = 0 FOR ARRAYS
886  IF (dimens(k,indx).NE.1) THEN
887  IF (dynam) dimens(k,indx) = 0
888  ELSE
889  WRITE(lu,*)'----------------------------------------'
890  arret= .true.
891  WRITE(lu,1102) motcle(k,indx)(1:taille(k,indx))
892  1102 FORMAT(1x,'BEWARE, THE KEY-WORD:',1x,a,/,1x,
893  & 'HAS BEEN GIVEN NO VALUE')
894  ENDIF
895  ENDIF
896 !
897 ! WILL WRITE THE UNUSED INDICES IN EVERY CATEGORY
898 !
899 ! ELSE
900 ! WRITE(LU,*) 'KEYWORD ',INDX,' OF TYPE ',K,' NOT USED'
901  ENDIF
902  ENDDO ! INDX
903  ENDDO ! K
904 !
905 1300 CONTINUE
906  IF(arret) THEN
907  WRITE(lu,*) ' '
908  WRITE(lu,*) 'DAMOC IS STOPPED'
909  CALL plante(1)
910  stop
911  ENDIF
912 !
913  RETURN
914 !
915 ! TREATS ERRORS OF DECLARATION ORDER IN THE DICTIONARY
916 !
917 1500 erreur=.true.
918  WRITE(lu,'(/,1X,A72,/)') ligne
919  WRITE(lu,*) 'AT LINE ',nlign,', PRIORITY ORDER NOT RESPECTED'
920  WRITE(lu,*)
921  WRITE(lu,*) 'EXPECTED ORDER IS :'
922  WRITE(lu,*) 'NOM, TYPE, INDEX, (TAILLE), (SUBMIT), (DEFAUT)'
923  GOTO 900
924 !
925 !-----------------------------------------------------------------------
926 !
927  END
928 
929 
integer function dimens(IELM)
Definition: dimens.f:7
subroutine influ(ICOL, LIGNE, DEFATT, TROUVE, LUIGN, MOTCLE, SIZE, MOTIGN, LONIGN, NMAXR, NFICDA, GESTD)
Definition: influ.f:8
subroutine classe(DIMENS, SIZE, MOTCLE, UTINDX, NMAX, OFFSET, ADRESS, INDIC, LUIGN, MOTINT, MOTREA, MOTLOG, MOTCAR, MOTATT, DEFCAR, DEFINT, DEFLOG, DEFREA, DEFATT)
Definition: classe.f:10
subroutine cmd(ICOL, LIGNE, ADRESS, DIMENS, TROUVE, MOTCLE, NMOT2, MOTINT, MOTREA, MOTLOG, MOTCAR, MOTATT, INDIC, SIZE, UTINDX, DYNAM, VUCMD, EXECMD, NFICDA, NMAXR)
Definition: cmd.f:9
subroutine dico(ITYP, NUMERO, ILONG, CHAINE, MOTCLE, MOTPRO, LONPRO, SIZE, UTINDX, LANGUE, AIDLNG, MOTIGN, NIGN, LUIGN, TYPIGN, LONIGN, NFICDA, NBLANG, NMAXR)
Definition: dico.f:9
integer, dimension(4) nmot
logical erreur
Y. AUDOUIN (EDF LAB, LNHE) 09/05/2014 V7P0 First version.
subroutine damoc(ADRESS, DIMENS, NMAX, DOC, LLNG, LLU, MOTINT, MOTREA, MOTLOG, MOTCAR, MOTATT, DEFINT, DEFREA, DEFLOG, DEFCAR, DEFATT, USRINT, USRREA, USRLOG, USRCAR, USRATT, MOTCLE, TAILLE, TROUVE, UTINDX, NFICMO, NFICDA, INDIC, GESTD, NBLANG, RETRY)
Definition: damoc.f:12
subroutine aidelu(ICOL, LIGNE, DOC)
Definition: aidelu.f:7