Télécharger eqex.eso

Retour à la liste

Numérotation des lignes :

eqex
  1. C EQEX SOURCE CB215821 25/04/23 21:15:19 12247
  2. SUBROUTINE EQEX
  3. C***********************************************************************
  4. C VERSION : ????
  5. C HISTORIQUE : 22/03/00: gounand
  6. C Rajout des préconditionneurs ILUT (ILU with dual truncation) et d'une
  7. C variante (ILUT2) qui remplit mieux la mémoire et des paramètres
  8. C associés : ILUTLFIL (ILUT level of fill) et ILUTDTOL (ILUT drop
  9. C tolerance)
  10. C HISTORIQUE : 20/12/99: gounand
  11. C Ajout des indices 'TYRENU' (type de renumérotation) et 'PCMLAG'
  12. C (placement des multiplicateurs de Lagrange à la table d'indice
  13. C 'METHINV'.
  14. C HISTORIQUE : 08/04/04 : ajout ILUTP
  15. C HISTORIQUE : 27/10/10: JCARDO: correction bug lié à IARG, qui pouvait
  16. C parfois valoir zéro à tort (label 110)
  17. C HISTORIQUE :
  18. C***********************************************************************
  19. IMPLICIT REAL*8 (A-H,O-Z)
  20. IMPLICIT INTEGER (I-N)
  21. PARAMETER (NBM=21,NBL=4,NOPT=75)
  22. PARAMETER (NTB=2,NBH=7)
  23.  
  24. -INC PPARAM
  25. -INC CCOPTIO
  26. -INC CCNOYAU
  27. -INC SMLREEL
  28. -INC SMLENTI
  29. POINTEUR MLENT4.MLENTI
  30. -INC SMLMOTS
  31. POINTEUR MINCO.MLMOTS
  32. -INC SMELEME
  33. POINTEUR IGEOM.MELEME
  34. -INC SMMODEL
  35. -INC SMCHPOI
  36. -INC SMCOORD
  37. POINTEUR MCHINI.MCHPOI
  38.  
  39. LOGICAL XEQUA,TTRAN,TPROJ,LOG1
  40. INTEGER RESTRT
  41. INTEGER IPST
  42. CHARACTER*(LOCOMP) LMOTS(NBM),NOM,CHAI,MTYP,NOMI,NOML,NMACO
  43. CHARACTER*(LONOM) NOMZ
  44. CHARACTER*8 LSCHE(NBH)
  45. CHARACTER*20 NOMO,MEQUA,MNEFMD
  46. CHARACTER*8 TYPE,TYPC,TYPS
  47. CHARACTER*8 LOPTI(NOPT)
  48. CHARACTER*8 MOIMP(NBL)
  49. DIMENSION KINCD(100)
  50. CHARACTER*8 TINCD(100)
  51.  
  52. CHARACTER*8 LTAB(NTB)
  53. DIMENSION KTAB(NTB)
  54.  
  55. DATA LMOTS /'ZONE ','OPER ','INCO ','CLIM ',
  56. & 'ITMA ','ALFA ','DTI ','IIMP ',
  57. & 'DUMP ','OPTI ','NOMVI ','DOMINC ',
  58. & 'TPSI ','TFINAL ','FIDT ','NISTO ',
  59. & 'NITER ','OMEGA ','EPS ','IMPR ',
  60. & 'EQUA '/
  61. DATA MOIMP /'UIMP ','VIMP ','WIMP ','TIMP '/
  62.  
  63. DATA LOPTI /
  64. C indice KFORM 0 à 3
  65. & 'EFM1 ','EF ','VF ','EFMC ','????????',
  66. & 'LINE ','MACRO ','QUAF ','LINB ','ISOQ ',
  67. C indice IDCEN
  68. & 'CENTREE ','SUPGDC ','SUPG ','TVISQUEU','CNG ',
  69. & 'PSI ','JOHNSON ','UPWIND ','GODUNOV ','VANLEER ',
  70. & 'VLH ','HUSVL ','HUSVLH ','AUSM ','CG ',
  71. & 'VSM ','VSMCC ','SUPGDCH ','SUPGH ','????????',
  72. C indice KPOIN
  73. & 'SOMMET ','FACE ','CENTRE ','CENTREP0','CENTREP1',
  74. & 'MSOMMET ','????????','????????','????????','????????',
  75. C indice KIMPL ---------------------->|indice ISCHT
  76. & 'IMPL ','EXPL ','SEMI ','BDF2 ','BDF4 ',
  77. & 'DIV2 ','CMD ','RIGIDITE','LIMITE ','NODIV ',
  78. C indice IKOMP-------------->| RNG KMACO ALE
  79. & 'CONS ','NOCONS ','CONS2 ','RNG ','ALE ',
  80. C indice MTRMASS---------------------->|
  81. & 'MMPLEINE','MMDIAGO ','MMPG ','MATCONS ','????????',
  82. C indice IDEUL ------------------------->|
  83. & 'EULER ','EULERMS ','EULERMST','????????','????????',
  84. C indice KPOIND->|
  85. & 'INCOD ','INCOP ','STABP ','MUCONS ','FTAU ',
  86. C
  87. & 'MUVARI ','????????','????????','????????','????????'/
  88.  
  89. DATA LSCHE /'EUL_EXPL','EUL_IMPL','TVISQ ','SEMI ',
  90. & 'CN ','CNG ','BDF2 '/
  91.  
  92. DATA LTAB/'DOMAINE ','EQEX '/
  93. C***
  94. C WRITE(IOIMP,*) ' DEBUT EQEX '
  95. IPST=0
  96. NBIK=0
  97. IDP=0
  98. MTABD=0
  99. CALL INITI(KTAB,NTB,0)
  100.  
  101. C Définition des options par défaut
  102. CALL CRTABL(KOPT)
  103. CALL ECMM(KOPT,'SOUSTYPE','KOPT')
  104. CALL ECME(KOPT,'IDCEN',2)
  105. CALL ECME(KOPT,'RNG ',1)
  106. CALL ECME(KOPT,'IKOMP',0)
  107. CALL ECME(KOPT,'KMACO',0)
  108. CALL ECMM(KOPT,'NMACO','xxxxxxxx')
  109. CALL ECME(KOPT,'KIMPL',0)
  110. CALL ECME(KOPT,'KFORM',0)
  111. CALL ECMF(KOPT,'AIMPL',1.D0)
  112. CALL ECME(KOPT,'ALE',0)
  113. CALL ECME(KOPT,'KMU',0)
  114. CALL ECME(KOPT,'KPOIND',99)
  115. CALL ECME(KOPT,'KPOIN',2)
  116. CALL ECME(KOPT,'MTRMASS ',1)
  117. CALL ECME(KOPT,'IDEUL ',1)
  118. CALL ECME(KOPT,'ISCHT',0)
  119. CALL ECME(KOPT,'IDIV',0)
  120. CALL ECMF(KOPT,'CMD',0.2D0)
  121. CALL ECMF(KOPT,'STABP',1.D-2)
  122. CALL ECME(KOPT,'RIGIDITE',0)
  123. CALL ECME(KOPT,'LIMITE',0)
  124. c CALL ECMM(KOPT,'INEFMD','xxxxxxxx')
  125.  
  126.  
  127. CALL QUETYP(TYPE,0,IRET)
  128.  
  129. MATABL=0
  130. MMODEL=0
  131. IF(TYPE.EQ.'MMODEL')THEN
  132. CALL LIROBJ('MMODEL',MMODEL,0,IRET)
  133. CALL LEKMOD(MMODEL,MTBLE,INEFMD)
  134. IF(MTBLE.EQ.0)RETURN
  135. KTAB(1)=MTBLE
  136. KTAB(2)=0
  137. CALL ECMM(KOPT,'INEFMD',LOPTI(5+INEFMD))
  138.  
  139. ELSEIF(TYPE.EQ.'MOT')THEN
  140. C Nouvelle directive EQUA
  141. c write(6,*)' Nouvelle directive EQUA'
  142. CALL LIRCHA(CHAI,1,LCHAR)
  143. KTAB(1)=-1
  144. KTAB(2)=0
  145. IF(CHAI(1:4).NE.'EQUA')THEN
  146. CALL ECRCHA(CHAI)
  147. GO TO 6
  148. ENDIF
  149.  
  150. CALL CRTABL(MATABL)
  151. CALL ECMM(MATABL,'SOUSTYPE','EQEX')
  152. XEQUA=.TRUE.
  153. CALL ECML(MATABL,'XEQUA',XEQUA)
  154. CALL ECML(MATABL,'XRIG',.FALSE.)
  155. C Lecture du nom de l'equation/inconnue
  156. NBIC=0
  157. JGN=4
  158. JGM=0
  159. NINCT=0
  160. SEGINI MLMOT2
  161. CALL ECMO(MATABL,'LISTINCO','LISTMOTS',MLMOT2)
  162. SEGDES MLMOT2
  163. 3 CONTINUE
  164. CALL QUETYP(MTYP,0,IRET)
  165. IF(MTYP.EQ.'MMODEL ')THEN
  166. GO TO 4
  167. ELSEIF(MTYP.EQ.'MOT ')THEN
  168. CALL LIRCHA(CHAI,1,LCHAR)
  169. IF(CHAI.EQ.'RIGIDITE')THEN
  170. CALL ECML(MATABL,'XRIG',.TRUE.)
  171. GO TO 3
  172. ENDIF
  173.  
  174. NBIC=NBIC+1
  175. SEGACT MLMOT2
  176. JGM=NBIC
  177. SEGADJ MLMOT2
  178. MLMOT2.MOTS(NBIC)=CHAI
  179. SEGDES MLMOT2
  180. GO TO 3
  181. ELSE
  182. C On ne trouve pas d'objet de type %m1:8
  183. MOTERR( 1: 8) = ' '
  184. CALL ERREUR(38)
  185. RETURN
  186. ENDIF
  187.  
  188.  
  189. 4 CONTINUE
  190. IF(NBIC.EQ.0)THEN
  191. C On ne trouve pas d'objet de type %m1:8
  192. MOTERR( 1: 8) = 'MOT '
  193. CALL ERREUR(38)
  194. RETURN
  195. ENDIF
  196.  
  197. CALL LIROBJ('MMODEL',MMODEL,0,IRET)
  198. CALL ECMO(MATABL,'MODELE','MMODEL ',MMODEL)
  199. SEGACT MMODEL
  200. * Détermination de MACRO et INEFMD
  201. IMODEL = KMODEL(1)
  202. SEGACT IMODEL
  203. IF(NEFMOD.GE.129.AND.NEFMOD.LE.135)THEN
  204. INEFMD=1
  205. ELSEIF(NEFMOD.GE.136.AND.NEFMOD.LE.141)THEN
  206. INEFMD=2
  207. ELSEIF(NEFMOD.GE.143.AND.NEFMOD.LE.149)THEN
  208. INEFMD=3
  209. ELSEIF(NEFMOD.GE.158.AND.NEFMOD.LE.164)THEN
  210. INEFMD=4
  211. ELSE
  212. C% Le type d'élément fini %m1:8 ne convient pas.
  213. WRITE(NOM,FMT='(I8)')NEFMOD
  214. MOTERR( 1: 8) = NOM
  215. CALL ERREUR(926)
  216. RETURN
  217. ENDIF
  218. SEGDES MMODEL,IMODEL
  219. CALL ECMM(KOPT,'INEFMD',LOPTI(5+INEFMD))
  220. CALL ECMM(MATABL,'INEFMD',LOPTI(5+INEFMD))
  221.  
  222. JGN=8
  223. JGM=NBIC
  224. NINCT=0
  225. SEGINI MLMOT3
  226. CALL ECMO(MATABL,'TYPEINCO','LISTMOTS',MLMOT3)
  227. DO 5 I=1,NBIC
  228. CALL LIRCHA(CHAI,1,LCHAR)
  229. IF(LCHAR.EQ.0)THEN
  230. C On ne trouve pas d'objet de type %m1:8
  231. MOTERR( 1: 8) = 'MOT '
  232. CALL ERREUR(38)
  233. RETURN
  234. ENDIF
  235.  
  236. CALL ECMM(MATABL,'TYPPRESS','MSOMMET ')
  237. IF(CHAI.EQ.'PRESSION')THEN
  238. CALL LIRCHA(NOM,1,LCHAR)
  239. CALL OPTLI(IPRE,LOPTI(33),NOM,4)
  240. IF(IPRE.EQ.0)THEN
  241. C% On a lu : %m1:8 : , alors qu'on attend un des mots clés suivant :
  242. C% %m9:16 %m17:24 %m25:32 %m33:40
  243. MOTERR( 1: 8) = NOM
  244. MOTERR( 9:16) = LOPTI(33)
  245. MOTERR(17:24) = LOPTI(35)
  246. MOTERR(25:32) = LOPTI(36)
  247. CALL ERREUR(930)
  248. RETURN
  249. ENDIF
  250. CALL ECMM(MATABL,'TYPPRESS',NOM)
  251. ENDIF
  252.  
  253. IF(CHAI.NE.'TEMPERAT'.AND.CHAI.NE.'VITESSE'.AND.
  254. & CHAI.NE.'PRESSION')THEN
  255. C Option %m1:8 incompatible avec les données
  256. MOTERR( 1: 8) =CHAI
  257. CALL ERREUR(803)
  258. RETURN
  259. ENDIF
  260. MLMOT3.MOTS(I)=CHAI
  261. 5 CONTINUE
  262. SEGDES MLMOT3
  263.  
  264. C Lecture du Schema en temps
  265.  
  266. CALL LIRCHA(CHAI,1,LCHAR)
  267. IF(LCHAR.EQ.0)THEN
  268. C On ne trouve pas d'objet de type %m1:8
  269. MOTERR( 1: 8) = 'MOT '
  270. CALL ERREUR(38)
  271. RETURN
  272. ENDIF
  273.  
  274. IF(CHAI.NE.'PERM'.AND.CHAI.NE.'TRAN'.AND.CHAI.NE.'PROJ')THEN
  275. C% On a lu : %m1:8 : , alors qu'on attend un des mots clés suivant :
  276. C% %m9:16 %m17:24 %m25:32 %m33:40
  277. MOTERR( 1: 8) = CHAI
  278. MOTERR( 9:16) = 'PERM'
  279. MOTERR(17:24) = 'TRAN'
  280. MOTERR(25:32) = 'PROJ'
  281. CALL ERREUR(930)
  282. RETURN
  283. ENDIF
  284.  
  285. TPROJ=.FALSE.
  286. IF(CHAI.EQ.'PERM')TTRAN=.FALSE.
  287. IF(CHAI.EQ.'TRAN')TTRAN=.TRUE.
  288. IF(CHAI.EQ.'PROJ')THEN
  289. TTRAN=.TRUE.
  290. TPROJ=.TRUE.
  291. ENDIF
  292. CALL ECML(MATABL,'TRAN',TTRAN)
  293. CALL ECML(MATABL,'PROJ',TPROJ)
  294.  
  295. IP=0
  296.  
  297. IF(TTRAN)THEN
  298. C Lecture des parametres du transitoire
  299. CALL QUETYP(MTYP,0,IRET)
  300. IF(IRET.EQ.0)THEN
  301. C On ne trouve pas d'objet de type %m1:8
  302. MOTERR( 1: 8) = 'MOT ou R'
  303. CALL ERREUR(38)
  304. RETURN
  305. ENDIF
  306. IF(MTYP.EQ.'MOT')THEN
  307. CALL LIRCHA(CHAI,1,LCHAR)
  308. CALL ECMM(MATABL,'DELTAT',CHAI)
  309. ELSEIF(MTYP.EQ.'FLOTTANT')THEN
  310. CALL LIRREE(XVAL,1,IRET)
  311. CALL ECMF(MATABL,'DELTAT',XVAL)
  312. ELSE
  313. C On ne trouve pas d'objet de type %m1:8
  314. MOTERR( 1: 8) = 'MOT ou R'
  315. CALL ERREUR(38)
  316. RETURN
  317. ENDIF
  318.  
  319. CALL LIRCHA(NOM,1,IRET)
  320. IF(IRET.EQ.0)THEN
  321. C On ne trouve pas d'objet de type %m1:8
  322. MOTERR( 1: 8) = 'MOT '
  323. CALL ERREUR(38)
  324. RETURN
  325. ENDIF
  326.  
  327. CALL OPTLI(IPST,LSCHE,NOM,NBH)
  328.  
  329. IF(IPST.EQ.0)THEN
  330. WRITE(IOIMP,*)'Directive : ',NOM
  331. WRITE(IOIMP,*)'non trouvée dans la liste ->',LSCHE
  332. RETURN
  333. ENDIF
  334. CALL ECMM(MATABL,'SCHEMAT',LSCHE(IPST))
  335. IF(IPST.EQ.4)THEN
  336. CALL LIRREE(XVAL,1,IRET)
  337. IF(IRET.EQ.0)THEN
  338. C On ne trouve pas d'objet de type %m1:8
  339. MOTERR( 1: 8) = 'FLOTTANT'
  340. CALL ERREUR(38)
  341. RETURN
  342. ENDIF
  343. CALL ECMF(MATABL,'Betat',XVAL)
  344. ENDIF
  345.  
  346. CALL ECML(MATABL,'XDIAG',.FALSE.)
  347.  
  348. ENDIF
  349.  
  350. DO 51 I=1,NBIC
  351.  
  352. CALL LIRCHA(CHAI,1,IRET)
  353. IF(IRET.EQ.0)THEN
  354. C On ne trouve pas d'objet de type %m1:8
  355. MOTERR( 1: 8) = 'MOT '
  356. CALL ERREUR(38)
  357. RETURN
  358. ENDIF
  359.  
  360. CALL OPTLI(IP,LMOTS,CHAI,NBM)
  361. IF(IP.NE.0)THEN
  362. write(6,*)' OPTI et ZONE sont des mots cles '
  363. write(6,*)' Choix mal venu pour un nom de variable'
  364. C On ne trouve pas d'objet de type %m1:8
  365. MOTERR( 1: 8) = 'MOT '
  366. CALL ERREUR(38)
  367. RETURN
  368. ENDIF
  369.  
  370. WRITE(NOM,FMT='(A3,I1)')'INC',I
  371. CALL ECMM(MATABL,NOM,CHAI)
  372.  
  373. 51 CONTINUE
  374.  
  375. IF(IPST.EQ.7.AND.TTRAN)THEN
  376. DO 52 I=1,NBIC
  377.  
  378. CALL LIRCHA(CHAI,1,IRET)
  379. IF(IRET.EQ.0)THEN
  380. C On ne trouve pas d'objet de type %m1:8
  381. MOTERR( 1: 8) = 'MOT '
  382. CALL ERREUR(38)
  383. RETURN
  384. ENDIF
  385.  
  386. WRITE(NOM,FMT='(A3,I1)')'IMC',I
  387. c write(6,*)' NOM,CHAI=',NOM,CHAI
  388. CALL ECMM(MATABL,NOM,CHAI)
  389.  
  390. 52 CONTINUE
  391. ENDIF
  392.  
  393.  
  394. ELSEIF(TYPE.EQ.'TABLE')THEN
  395. CALL LIROBJ(TYPE,MTBLE,0,IRET)
  396. TYPC=' '
  397. CALL ACMO(MTBLE,'SOUSTYPE',TYPC,IRET)
  398. IF(TYPC.EQ.'MOT ')THEN
  399. CALL ACMM(MTBLE,'SOUSTYPE',TYPS)
  400. IF(TYPS.EQ.'DOMAINE')THEN
  401. KTAB(1)=MTBLE
  402. KTAB(2)=0
  403. XEQUA=.FALSE.
  404. CALL ECML(MTBLE,'XEQUA',XEQUA)
  405. CALL ECMM(MTBLE,'INEFMD',' ')
  406. CALL ECMM(KOPT,'INEFMD',' ')
  407. ELSEIF(TYPS.EQ.'EQEX')THEN
  408. KTAB(1)=0
  409. KTAB(2)=MTBLE
  410. CALL ACML(MTBLE,'XEQUA',XEQUA)
  411. CALL ACMM(MTBLE,'INEFMD',MNEFMD)
  412. CALL ECMM(KOPT,'INEFMD',MNEFMD)
  413. ELSE
  414. WRITE(IOIMP,*)' On attend une table soustype DOMAINE ou EQEX'
  415. RETURN
  416. ENDIF
  417. ENDIF
  418. ELSE
  419. KTAB(1)=-1
  420. KTAB(2)=0
  421. ENDIF
  422.  
  423. 6 CONTINUE
  424.  
  425. IF(KTAB(2).NE.0)THEN
  426. MTABLE=KTAB(2)
  427. TYPE='LISTMOTS'
  428. CALL ACMO(MTABLE,'LISTOPER',TYPE,MLMOT1)
  429. SEGACT MLMOT1
  430. NEQUA=MLMOT1.MOTS(/2)
  431. ELSEIF(KTAB(1).NE.0)THEN
  432. MTABD=KTAB(1)
  433.  
  434. IF(MATABL.EQ.0)THEN
  435. CALL CRTABL(MTABLE)
  436. CALL ECMM(MTABLE,'SOUSTYPE','EQEX')
  437. XEQUA=.FALSE.
  438. CALL ECML(MTABLE,'XEQUA',XEQUA)
  439. CALL ECMM(MTABLE,'INEFMD',' ')
  440. CALL ECMM(KOPT,'INEFMD',MNEFMD)
  441. ELSE
  442. MTABLE=MATABL
  443. ENDIF
  444. CALL CRTABL(MINCO)
  445. CALL ECMM(MINCO,'SOUSTYPE','INCO')
  446. NEQUA=0
  447. CALL ECME(MTABLE,'DISCPRES',0)
  448. IF(KTAB(1).GT.0)THEN
  449. IF(MMODEL.EQ.0)CALL ECMO(MTABLE,'DOMAINE','TABLE ',MTABD)
  450. CALL ECME(MTABLE,'NAVISTOK',MMODEL)
  451. ELSE
  452. CALL ECME(MTABLE,'NAVISTOK',-1)
  453. ENDIF
  454. C? IF(MMODEL.NE.0)THEN
  455. C CALL ECMO(MTABLE,'DOMAINE','MMODEL ',MMODEL)
  456. C CALL ECMO(MTABLE,'TDOMAINE','TABLE ',MTABD)
  457. C? CALL ECMO(MTABLE,'DOMAINE','TABLE ',MTABD)
  458. C? ENDIF
  459. CALL ECMO(MTABLE,'INCO','TABLE ',MINCO)
  460. CALL ECMM(MTABLE,'NOMVI','UN')
  461. JGN=8
  462. JGM=0
  463. SEGINI MLMOT1
  464. CALL ECMO(MTABLE,'LISTOPER','LISTMOTS',MLMOT1)
  465. CALL ECME(MTABLE,'ITMA',0)
  466. CALL ECMF(MTABLE,'ALFA',1.D0)
  467. CALL ECME(MTABLE,'FIDT',20)
  468. CALL ECME(MTABLE,'NISTO',20)
  469. CALL ECME(MTABLE,'NITER',1)
  470. CALL ECME(MTABLE,'IPP',0)
  471. CALL ECME(MTABLE,'IMPR',0)
  472. CALL ECMF(MTABLE,'OMEGA',1.D0)
  473. CALL ECMF(MTABLE,'EPS',1.D-2)
  474. CALL ECMF(MTABLE,'TFINAL',1.D30)
  475. NAT=2
  476. NSOUPO=0
  477. SEGINI MCHPOI
  478. JATTRI(1)=2
  479. CALL ECMO(MTABLE,'CLIM','CHPOINT',MCHPOI)
  480.  
  481. CALL CRTABL(MTABT)
  482. CALL ECMM(MTABT,'SOUSTYPE','PASDETPS')
  483. CALL ECMO(MTABLE,'PASDETPS','TABLE ',MTABT)
  484. IPAT=1
  485. CALL ECME(MTABT,'NUPASDT',IPAT)
  486. DT=1.D30
  487. CALL ECMF(MTABT,'DELTAT',DT)
  488. CALL ECMF(MTABT,'DELTAT-1',DT)
  489. TPS=0.D0
  490. CALL ECMF(MTABT,'TPS',TPS)
  491. CALL ECMM(MTABT,'OPER','EQEX')
  492. CALL ECMM(MTABT,'ZONE','EQEX')
  493. CALL ECMF(MTABT,'DTCONV',0.D0)
  494. CALL ECMF(MTABT,'DTDIFU',0.D0)
  495. CALL ECMF(MTABT,'DIAEL',0.D0)
  496. CALL ECME(MTABT,'NUEL',0)
  497.  
  498. C Définition de la méthode d'inversion et des paramètres
  499. C éventuels associés
  500. CALL CRTABL(MTINV)
  501. CALL ECMM(MTINV,'SOUSTYPE','METHINV')
  502. CALL ECMO(MTABLE,'METHINV ','TABLE ',MTINV)
  503. C Méthode d'inversion du système
  504. C 1 : résolution directe (Choleski)
  505. C 2 : Gradient Conjugué
  506. C 3 : Bi-Gradient Conjugué Stabilisé (BiCGSTAB)
  507. C 4 : BiCGSTAB(2)
  508. KTYPI=1
  509. CALL ECME(MTINV,'TYPINV',KTYPI)
  510. C Niveau d'impression pour la partie résolution itérative
  511. IMPINV=0
  512. CALL ECME(MTINV,'IMPINV',IMPINV)
  513. C Options spécifiques aux méthodes itératives :
  514. C
  515. C - Pour l'assemblage : type de renumérotation
  516. C * 'RIEN' : pas de renumérotation
  517. C * 'SLOA' : algorithme de chez Sloan
  518. C * 'GIPR' : Gibbs-King (profile reduction)
  519. C * 'GIBA' : Gibbs-Poole-Stockmeyer (bandwidth reduction)
  520. CALL ECMM(MTINV,'TYRENU','SLOA')
  521. * CALL ECMM(MTINV,'TYRENU','RIEN')
  522. C - Pour l'assemblage : prise en compte des mult.lag
  523. C * 'RIEN'
  524. C * 'APR2'
  525. CALL ECMM(MTINV,'PCMLAG','APR2')
  526. C - Pour l'assemblage : SCALING (type ENTIER) :
  527. C Scaling de la matrice :
  528. C - 0 : pas de scaling
  529. C - 1 : scaling par les normes L2 des lignes et des colonnes
  530. C Par défaut : 0
  531. ISCAL=0
  532. CALL ECME(MTINV,'SCALING',ISCAL)
  533. C - Pour l'assemblage : OUBMAT (type ENTIER) :
  534. C Oublie les matrices élémentaires :
  535. C - 0 : non
  536. C - 1 : oui
  537. C Par défaut : 0
  538. IOUBL=0
  539. CALL ECME(MTINV,'OUBMAT',IOUBL)
  540. C - Champoint d'initialisation de la méthode
  541. C (i.e. estimation de l'inconnue)
  542. ***** MCHINI=0
  543. NAT=0
  544. NSOUPO=0
  545. SEGINI MCHINI
  546. SEGDES MCHINI
  547. CALL ECMO(MTINV,'XINIT','CHPOINT ',MCHINI)
  548. C - Nombre maxi d'itérations à effectuer
  549. ITER=2000
  550. CALL ECME(MTINV,'NITMAX',ITER)
  551. C - Norme maxi (L2 normé par le second membre) du résidu
  552. RESID=1.D-10
  553. CALL ECMF(MTINV,'RESID',RESID)
  554. C - Type de préconditionnement :
  555. C 0 : pas de préconditionnement
  556. C 1 : préconditionnement par la diagonale
  557. C 2 : préconditionnement D-ILU
  558. C 3 : préconditionnement ILU(0) (Choleski)
  559. C 4 : préconditionnement MILU(0) (Choleski modifié)
  560. C 5 : préconditionnement ILUT (dual truncation)
  561. C 6 : préconditionnement ILUT2 (une variante du
  562. C précédent qui remplit mieux la mémoire et
  563. C fonctionne mieux quelquefois)
  564. C 7 : préconditionnement ILUTP (avec pivoting)
  565. C 8 : préconditionnement ILUTPG (avec pivoting)
  566. C ILUTP version gounand
  567. C On traite de manière spéciale les termes
  568. C qui sont dans ILU(0)
  569. C 9 : préconditionnement ILUTPG2 (avec pivoting)
  570. C ILUTP version gounand 2
  571. C On garde tous les termes qui sont dans ILU(0)
  572. KPREC=3
  573. CALL ECME(MTINV,'PRECOND',KPREC)
  574. C - Pour une méthode ILUT, on a les deux indices suivant :
  575. C * ILUTLFIL : encombrement maximal (approximatif) du
  576. C préconditionneur, par rapport à la matrice.
  577. C * ILUTDTOL : "drop tolerance" pour le préconditionneur.
  578. C i.e. en-dessous de cette valeur relative, les
  579. C termes de la factorisation incomplète seront
  580. C oubliés.
  581. XLFIL=2.D0
  582. CALL ECMF(MTINV,'ILUTLFIL',XLFIL)
  583. * -1. sinon, oubli possible des 0.D0 dans le préconditionneur
  584. XDTOL=-1.D0
  585. CALL ECMF(MTINV,'ILUTDTOL',XDTOL)
  586. C - Pour une méthode ILUTP, on a les deux indices suivant :
  587. C * ILUTPPIV (type REEL) (compris entre 0.D0 et 1.D0) :
  588. C 0.D0 : on ne pivote pas
  589. C 1.D0 : on pivote tout le temps
  590. C (recommandation : entre 0.1D0 et 0.01D0)
  591. C Par défaut : 0.1D0
  592. XSPIV=0.1D0
  593. CALL ECMF(MTINV,'ILUTPPIV',XSPIV)
  594. C - Fréquence de recalcul du préconditionneur en fonction
  595. C des deux indices de boucle suivant :
  596. C * indice de boucle sur les pas de temps
  597. C * indice de boucle sur la boucle d'itérations utilisée
  598. C pour résoudre les non-linéarités
  599. C Par défaut, on recalcule tout le temps le préconditionneur
  600. IFCPRT=1
  601. IFCPRI=1
  602. CALL ECME(MTINV,'FCPRECT',IFCPRT)
  603. CALL ECME(MTINV,'FCPRECI',IFCPRI)
  604. C - 'Breakdown tolerance' pour les méthodes de type
  605. C BiCGSTAB. Si un certain produit scalaire de vecteurs
  606. C "direction" est inférieur à cette tolérance, la
  607. C méthode s'arrete.
  608. BRTOL=1.D-40
  609. CALL ECMF(MTINV,'BCGSBTOL',BRTOL)
  610. C - Paramètre de relaxation pour le préconditionnement
  611. C MILU(0) compris entre 0. et 1.
  612. C S'il est égal à 0, on se ramène à ILU(0)
  613. C S'il est égal à 1, MILU(0) est dit non relaxé
  614. RXMILU=1.D0
  615. CALL ECMF(MTINV,'MILURELX',RXMILU)
  616. C - Paramètre de redémarrage pour GMRES(m)
  617. RESTRT=50
  618. CALL ECME(MTINV,'GMRESTRT',RESTRT)
  619. ENDIF
  620.  
  621. 1 CONTINUE
  622. CALL LIRCHA(NOM,0,IRET)
  623. IF(IRET.EQ.0)GO TO 90
  624. 2 CONTINUE
  625.  
  626. IF(IDP.NE.0)WRITE(IOIMP,*) ' Directive en cours :',NOM
  627. C WRITE(IOIMP,*) ' Directive en cours :',NOM
  628. CALL OPTLI(IP,LMOTS,NOM,NBM)
  629. C WRITE(IOIMP,*)' EQEX, IP=',ip,' NOM=',nom
  630. IF(IP.EQ.0)THEN
  631. WRITE(IOIMP,*)'Directive : ',NOM
  632. WRITE(IOIMP,*)'non trouvée dans la liste ->',LMOTS
  633. RETURN
  634. ENDIF
  635.  
  636.  
  637. GO TO (10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
  638. & 25,26,27,28,29),IP
  639.  
  640. C ZONE
  641.  
  642. 10 CONTINUE
  643.  
  644. CALL LITABS(LTAB,KTAB,1,0,IRET)
  645.  
  646. MMODEL=0
  647. IF(KTAB(1).EQ.0)THEN
  648. CALL LIROBJ('MMODEL',MMODEL,0,IRET2)
  649. IF(IRET2.EQ.0)THEN
  650. WRITE(IOIMP,*)' On attend un objet TABLE DOMAINE ou MODELE'
  651. RETURN
  652. ENDIF
  653. CALL LEKMOD(MMODEL,MTBLE,INEFMD)
  654. IF(MTBLE.EQ.0)RETURN
  655. KTAB(1)=MTBLE
  656. CALL ECMM(KOPT,'INEFMD',LOPTI(5+INEFMD))
  657. ENDIF
  658.  
  659. CALL QUENOM(NOMZ)
  660. GO TO 1
  661.  
  662. C OPER
  663.  
  664. 11 CONTINUE
  665.  
  666. CALL LIRCHA(NOMO,1,LNOMO)
  667. IF(LNOMO.EQ.0)THEN
  668. WRITE(IOIMP,*)' ON ATTEND LE NOM DE L OPERATEUR'
  669. RETURN
  670. ENDIF
  671.  
  672. * ECRITURE DU NOM DE L'OPERATEUR
  673.  
  674. NEQUA=NEQUA+1
  675. IF(NEQUA.LT.10)THEN
  676. LNOMOT=LNOMO+1
  677. WRITE(MEQUA,FMT='(I1,19A1)')NEQUA,(NOMO(I:I),I=1,LNOMO)
  678. C WRITE(IOIMP,*)' MEQUA=',MEQUA
  679. ELSEIF(NEQUA.LT.100.AND.NEQUA.GE.10)THEN
  680. LNOMOT=LNOMO+2
  681. WRITE(MEQUA,FMT='(I2,18A1)')NEQUA,(NOMO(I:I),I=1,LNOMO)
  682. ELSEIF(NEQUA.LT.1000.AND.NEQUA.GE.100)THEN
  683. LNOMOT=LNOMO+3
  684. WRITE(MEQUA,FMT='(I3,17A1)')NEQUA,(NOMO(I:I),I=1,LNOMO)
  685. C WRITE(IOIMP,*)' MEQUA=',MEQUA
  686. ELSE
  687. WRITE(IOIMP,*)'PLUS DE 999 OPERATEURS : CAS NON PREVU'
  688. RETURN
  689. ENDIF
  690. JGN=8
  691. JGM=MLMOT1.MOTS(/2)+1
  692. SEGADJ MLMOT1
  693. MLMOT1.MOTS(JGM)=NOMO(1:LNOMO)
  694. C CALL LENCHA(MEQUA,LC1)
  695. CALL CRTABL(MTABX)
  696. CALL ECMM(MTABX,'SOUSTYPE','KIZX')
  697. C CALL ECMO(MTABLE,MEQUA(1:8),'TABLE',MTABX)
  698. CALL ECCTAB(MTABLE,'MOT',0,0.D0,MEQUA(1:LNOMOT),.TRUE.,0,
  699. & 'TABLE',0,0.D0,CHAI,.TRUE.,MTABX)
  700. * ECRITURE DE LA TABLE DE REFERENCE
  701. CALL ECMO(MTABX,'EQEX','TABLE',MTABLE)
  702. * ECRITURE DU NOM DE LA ZONE
  703. CALL ECMM(MTABX,'NOMZONE',NOMZ)
  704. * ECRITURE DE MELEMZ
  705. CALL ECMO(MTABX,'DOMZ','TABLE',KTAB(1))
  706. IF(MMODEL.NE.0)THEN
  707. CALL ECMO(MTABX,'DOMZ','MMODEL',MMODEL)
  708. CALL ECMO(MTABX,'TDOMZ','TABLE',KTAB(1))
  709. ENDIF
  710.  
  711. CALL ECMM(MTABX,'NOMOPER',NOMO(1:8))
  712. CALL ECMO(MTABX,'KOPT','TABLE',KOPT)
  713. * ECRITURE DE LA LISTE DES ARGUMENTS
  714. * 1) on initialise la variable IARG à 0
  715. * 2) chaque fois que l'on trouve un argument pour l'opérateur courant,
  716. * on incrémente cette variable et on boucle (=> GOTO 110)
  717. * 3) on met à jour 'IARG' dans MTABX dès qu'il n'y a plus d'argument:
  718. * - soit il n'y a plus d'objet passé à EQEX (=> GOTO 90)
  719. * - soit on est tombé sur un autre mot-clé (=> GOTO 2 )
  720. IARG=0
  721.  
  722. 110 CONTINUE
  723. CALL QUETYP(MTYP,0,IRET)
  724. C WRITE(IOIMP,*)' MTYP=',mtyp,' iret=',iret
  725. IF(IRET.EQ.0)THEN
  726. * PLUS AUCUN MOT DANS EQEX => ON MET À JOUR 'IARG'
  727. CALL ECME(MTABX,'IARG',IARG)
  728. GO TO 90
  729. ENDIF
  730.  
  731. IF(MTYP.EQ.'MOT ')THEN
  732.  
  733. CALL LIRCHA(NOM,1,IRET)
  734. CALL OPTLI(IP,LMOTS,NOM,NBM)
  735. IF(IP.EQ.0)THEN
  736. IARG=IARG+1
  737. IF(IARG.GT.9)CALL ARRET(0)
  738. CHAI=NOM
  739. WRITE(NOM,FMT='(A3,I1)')'ARG',IARG
  740. CALL ECMM(MTABX,NOM(1:4),CHAI)
  741. GO TO 110
  742. ELSE
  743. * MOT-CLÉ TROUVÉ => PLUS D'ARGUMENTS => ON MET À JOUR 'IARG'
  744. CALL ECME(MTABX,'IARG',IARG)
  745. C WRITE(IOIMP,*)' 1er gt2 nom=',nom
  746. GO TO 2
  747. ENDIF
  748.  
  749. ELSEIF(MTYP.EQ.'FLOTTANT')THEN
  750. CALL LIRREE(XVAL,1,IRET)
  751. IARG=IARG+1
  752. IF(IARG.GT.9)CALL ARRET(0)
  753. WRITE(NOM,FMT='(A3,I1)')'ARG',IARG
  754. CALL ECMF(MTABX,NOM(1:4),XVAL)
  755. GO TO 110
  756.  
  757. ELSEIF(MTYP.EQ.'ENTIER')THEN
  758. CALL LIRENT(IENT,1,IRET)
  759. IARG=IARG+1
  760. IF(IARG.GT.9)CALL ARRET(0)
  761. WRITE(NOM,FMT='(A3,I1)')'ARG',IARG
  762. CC XVAL=DBLE(IENT)
  763. CC CALL ECMF(MTABX,NOM(1:4),XVAL)
  764. CALL ECME(MTABX,NOM(1:4),IENT)
  765. GO TO 110
  766.  
  767. ELSEIF(MTYP.EQ.'POINT')THEN
  768. CALL LIROBJ('POINT',IZTAB,1,IRET)
  769. IARG=IARG+1
  770. IF(IARG.GT.9)CALL ARRET(0)
  771. WRITE(NOM,FMT='(A3,I1)')'ARG',IARG
  772. CALL ECMO(MTABX,NOM(1:4),'POINT',IZTAB)
  773. GO TO 110
  774.  
  775. ELSEIF(MTYP.EQ.'LOGIQUE ')THEN
  776. CALL LIRLOG(LOG1,1,IRET)
  777. IARG=IARG+1
  778. IF(IARG.GT.9)CALL ARRET(0)
  779. WRITE(NOM,FMT='(A3,I1)')'ARG',IARG
  780. CALL ECML(MTABX,NOM(1:4),LOG1)
  781. GO TO 110
  782.  
  783. ELSE
  784. CALL LIROBJ(MTYP,IZTAB,1,IRET)
  785. IARG=IARG+1
  786. IF(IARG.GT.9)RETURN
  787. WRITE(NOM,FMT='(A3,I1)')'ARG',IARG
  788. CALL ECMO(MTABX,NOM(1:4),MTYP,IZTAB)
  789. GO TO 110
  790.  
  791. ENDIF
  792.  
  793. C INCO
  794.  
  795. 12 CONTINUE
  796. C On crée si ce n'est pas déja fait la liste totale des inconnues
  797. C et on la complète
  798. TYPE=' '
  799. CALL ACMO(MTABLE,'LISTINCO',TYPE,MLMOT2)
  800. IF(TYPE.NE.'LISTMOTS')THEN
  801. JGN=4
  802. JGM=0
  803. NINCT=0
  804. SEGINI MLMOT2
  805. CALL ECMO(MTABLE,'LISTINCO','LISTMOTS',MLMOT2)
  806. SEGDES MLMOT2
  807. ENDIF
  808. SEGACT MLMOT2
  809. NINCT=MLMOT2.MOTS(/2)
  810. NINCT0=0
  811. SEGDES MLMOT2
  812.  
  813. C on crée la liste des inconnues associées à l'opérateur
  814. JGN=4
  815. JGM=0
  816. JG =0
  817. SEGINI MLMOTS,MLENT4
  818. * ECRITURE DE LA LISTE DES INCONNUES
  819. CALL ECMO(MTABX,'LISTINCO','LISTMOTS',MLMOTS)
  820. CALL ECMO(MTABX,'NUMEINCO','LISTENTI',MLENT4)
  821. SEGDES MLMOTS,MLENT4
  822. C on crée la liste des types d'inconnues associés à l'opérateur
  823. JGN=8
  824. JGM=0
  825. SEGINI MLMOT4
  826. * ECRITURE DE LA LISTE DES TYPES D'INCONNUES
  827. CALL ECMO(MTABX,'TYPEINCO','LISTMOTS',MLMOT4)
  828. SEGDES MLMOT4
  829.  
  830. 120 CONTINUE
  831. SEGDES MLMOTS,MLMOT2
  832. CALL LIRCHA(NOM,0,IRET)
  833. IF(IRET.EQ.0)THEN
  834. GO TO 90
  835. ENDIF
  836.  
  837. CALL OPTLI(IP,LMOTS,NOM,NBM)
  838.  
  839. IF(IP.EQ.2.OR.IP.EQ.3)THEN
  840. WRITE(IOIMP,*)' Il faut recommencer a la directive ZONE '
  841. RETURN
  842. ENDIF
  843. C WRITE(IOIMP,*)' EQEX : ',NOM,IP
  844.  
  845. IF(IP.EQ.0)THEN
  846.  
  847. NINCT0=NINCT0+1
  848. IF(NINCT0.GT.5)THEN
  849. WRITE(IOIMP,*)' Opérateur EQEX :'
  850. WRITE(IOIMP,*)' Le nombre d''inconnues semble important ',
  851. & NINCT0,' ? ',NOM
  852. ENDIF
  853.  
  854. JGN=4
  855. SEGACT MLMOTS
  856. JGM=MOTS(/2)+1
  857. SEGADJ MLMOTS
  858. C WRITE(IOIMP,*)' EQEX : ',NOM,' NINCT=',ninct
  859. MOTS(JGM)=NOM
  860.  
  861. C Cas directive EQUA
  862. IF(XEQUA)THEN
  863. TYPE=' '
  864. CALL ACMO(MTABLE,'TYPEINCO',TYPE,MLMOT3)
  865. IF(TYPE.NE.'LISTMOTS')THEN
  866. write(6,*)' Petit probleme Non prevu '
  867. RETURN
  868. ENDIF
  869. SEGACT MLMOT2,MLMOT3,MLMOT4,MLENT4
  870. NBIC=MLMOT2.MOTS(/2)
  871. DO 122 I=1,NBIC
  872.  
  873. IF(NOM.EQ.MLMOT2.MOTS(I))THEN
  874. JGN=8
  875. JG=JGM
  876. SEGADJ MLMOT4,MLENT4
  877. MLMOT4.MOTS(JGM)=MLMOT3.MOTS(I)
  878. MLENT4.LECT(JGM)=I
  879. GO TO 123
  880. ENDIF
  881. 122 CONTINUE
  882. C% L'inconnue : %m1:8 : n'apparait pas dans la liste des inconnues.
  883. MOTERR( 1: 8) = NOM
  884. CALL ERREUR(931)
  885. RETURN
  886.  
  887. 123 CONTINUE
  888. SEGDES MLMOT2,MLMOT3,MLMOT4,MLENT4
  889.  
  890.  
  891. ENDIF
  892. C On ecrit aussi directement dans MTABX NBINCO,INC1 INC2
  893. C etc comme pour les arguments
  894. C? NBINCO=JGM
  895. C? WRITE(CHAI,FMT='(A3,I1)')'INC',NBINCO
  896. C? CALL ECMM(MTABX,CHAI(1:4),NOM)
  897. C? CALL ECME(MTABX,'NBINCO',NBINCO)
  898.  
  899. SEGACT MLMOT2
  900. DO 121 I=1,NINCT
  901. C WRITE(IOIMP,*)' On cherche : ',MLMOT2.MOTS(I),NOM
  902. IF(MLMOT2.MOTS(I).EQ.NOM)GO TO 120
  903. 121 CONTINUE
  904. JGM=NINCT+1
  905. NINCT=NINCT+1
  906.  
  907. JGN=4
  908. SEGADJ MLMOT2
  909. MLMOT2.MOTS(JGM)=NOM
  910. GO TO 120
  911. ELSE
  912. SEGDES MLMOTS,MLMOT2
  913. C WRITE(IOIMP,*)' 2eme gt2 nom=',nom
  914. GO TO 2
  915. ENDIF
  916.  
  917. C CLIM
  918.  
  919. 13 CONTINUE
  920.  
  921. TYPE=' '
  922. CALL ACMO(MTABLE,'CLIM',TYPE,MCHPO1)
  923. IF(TYPE.NE.'CHPOINT')MCHPO1=0
  924.  
  925. CALL LIRCHA(NOMI,0,IRET)
  926. C WRITE(IOIMP,*)' MCHPO1=',mchpo1,' NOMI=',nomi
  927. IF(IRET.EQ.0)THEN
  928. GO TO 90
  929. ENDIF
  930. CALL OPTLI(IP,LMOTS,NOMI,NBM)
  931. IF(IP.NE.0)THEN
  932. NOM=NOMI
  933. C WRITE(IOIMP,*)' 3eme gt2 nom=',nom
  934. GO TO 2
  935. ENDIF
  936.  
  937. CALL LENCHA(NOMI,LCI)
  938.  
  939. CALL LIRMOT(MOIMP,NBL,IP,1)
  940. IF(IP.EQ.0)THEN
  941. WRITE(IOIMP,*)' Directive CLIM : '
  942. WRITE(IOIMP,*)' On attend un mot cle de la liste suivante :'
  943. $ ,MOIMP
  944. RETURN
  945. ENDIF
  946.  
  947. WRITE(NOML,FMT='(I1,A4)')IP,NOMI
  948. IF(IP.EQ.4)NOML=NOMI
  949. CALL LIROBJ('MAILLAGE',MELEME,1,IRET)
  950. IF(IRET.EQ.0)THEN
  951. GO TO 90
  952. ENDIF
  953.  
  954. CALL ECRCHA('POI1')
  955. CALL ECROBJ('MAILLAGE',MELEME)
  956. CALL PRCHAN
  957. CALL LIROBJ('MAILLAGE',MELEME,1,IRET)
  958. SEGACT MELEME
  959. N=NUM(/2)
  960. NAT=2
  961. NSOUPO=1
  962. NC=1
  963. SEGINI MCHPOI,MSOUPO,MPOVAL
  964. IFOPOI=IFOUR
  965. MOCHDE=TITREE
  966. MTYPOI='CLIM'
  967. JATTRI(1)=2
  968. IPCHP(1)=MSOUPO
  969. C WRITE(IOIMP,*)' EQEX 1 : IPCHP,mchpoi=',IPCHP(1),mchpoi
  970. NOCOMP(1)=NOML(1:4)
  971. IGEOC=MELEME
  972. IPOVAL=MPOVAL
  973.  
  974. CALL QUETYP(MTYP,1,IRET)
  975.  
  976. if(mtyp.eq.'TABLE')THEN
  977. ikkt=0
  978. 1234 continue
  979. ikkt=ikkt+1
  980. WRITE(IOIMP,*)' ikkt=',ikkt
  981. if(ikkt.gt.100)return
  982. CALL LIROBJ('TABLE',IP,1,IRET)
  983. WRITE(IOIMP,*)' Petit incident '
  984. if(ip.ne.ktab(2))then
  985. WRITE(IOIMP,*)' Gros incident ',ip,ktab
  986. endif
  987. CALL QUETYP(MTYP,0,IRET)
  988. if(mtyp.eq.'TABLE')go to 1234
  989. endif
  990.  
  991. C WRITE(IOIMP,*)' MTYP a=',mtyp,iret,' N=',N
  992.  
  993. IF(MTYP.EQ.'FLOTTANT')THEN
  994. CALL LIRREE(XVAL,1,IRET)
  995. CALL INITD(VPOCHA,N,XVAL)
  996. SEGDES MPOVAL
  997. ELSEIF(MTYP.EQ.'ENTIER')THEN
  998. CALL LIRENT(IENT,1,IRET)
  999. XVAL=DBLE(IENT)
  1000. CALL INITD(VPOCHA,N,XVAL)
  1001. SEGDES MPOVAL
  1002. ELSEIF(MTYP.EQ.'CHPOINT')THEN
  1003. CALL LIROBJ('CHPOINT',MCHPO2,1,IRET)
  1004. SEGACT MCHPO2
  1005. NSP=MCHPO2.IPCHP(/1)
  1006. CALL KRIPAD(MELEME,MLENTI)
  1007. SEGACT MELEME
  1008. DO 3569 L=1,NSP
  1009. MSOUP2=MCHPO2.IPCHP(L)
  1010. SEGACT MSOUP2
  1011. IGEOM=MSOUP2.IGEOC
  1012. MPOVA2=MSOUP2.IPOVAL
  1013. SEGACT IGEOM,MPOVA2
  1014. NBEL=IGEOM.NUM(/2)
  1015. DO 3568 I=1,NBEL
  1016. I1=IGEOM.NUM(1,I)
  1017. II1=LECT(I1)
  1018. IF(II1.EQ.0)GO TO 3568
  1019. VPOCHA(II1,1)=MPOVA2.VPOCHA(I,1)
  1020. 3568 CONTINUE
  1021. SEGDES MSOUP2,IGEOM,MPOVA2
  1022. 3569 CONTINUE
  1023. SEGSUP MLENTI
  1024. SEGDES MCHPO2
  1025.  
  1026. ELSE
  1027. WRITE(IOIMP,*)' TYPE NON ENCORE TRAITE'
  1028. RETURN
  1029. ENDIF
  1030. SEGDES MCHPOI,MSOUPO,MPOVAL
  1031.  
  1032. IF(MCHPO1.NE.0)THEN
  1033. CALL ECROBJ('CHPOINT',MCHPOI)
  1034. CALL ECROBJ('CHPOINT',MCHPO1)
  1035. CALL PRFUSE
  1036. CALL LIROBJ('CHPOINT',MCHPOI,1,IRET)
  1037. ENDIF
  1038. CALL ECMO(MTABLE,'CLIM','CHPOINT',MCHPOI)
  1039.  
  1040. GO TO 13
  1041.  
  1042. C ITMA
  1043.  
  1044. 14 CONTINUE
  1045. CALL LIRENT(IENT,1,IRET)
  1046. IF(IRET.EQ.0)THEN
  1047. WRITE(IOIMP,*)' MOT CLE ITMA (Nb maximum de pas de temps) :'
  1048. WRITE(IOIMP,*)' On attend un entier '
  1049. RETURN
  1050. ENDIF
  1051. CALL ECME(MTABLE,'ITMA',IENT)
  1052. GO TO 1
  1053.  
  1054. C ALFA
  1055.  
  1056. 15 CONTINUE
  1057. CALL LIRREE(XVAL,1,IRET)
  1058. IF(IRET.EQ.0)THEN
  1059. WRITE(IOIMP,*)' MOT CLE ALFA (Tolerance sur le pas de temps) :'
  1060. WRITE(IOIMP,*)' doit etre compris entre 0 et 1 (1 par defaut)'
  1061. WRITE(IOIMP,*)' On attend un flottant '
  1062. RETURN
  1063. ENDIF
  1064. CALL ECMF(MTABLE,'ALFA',XVAL)
  1065. GO TO 1
  1066.  
  1067. C DTI
  1068.  
  1069. 16 CONTINUE
  1070. CALL LIRREE(XVAL,1,IRET)
  1071. IF(IRET.EQ.0)THEN
  1072. WRITE(IOIMP,*)' MOT CLE DTI (Pas de temps iinitial) :'
  1073. WRITE(IOIMP,*)' On attend un flottant '
  1074. RETURN
  1075. ENDIF
  1076. DT=XVAL
  1077. CALL ECMF(MTABT,'DELTAT',DT)
  1078. CALL ECMF(MTABT,'DELTAT-1',DT)
  1079. GO TO 1
  1080.  
  1081. C IIMP
  1082.  
  1083. 17 CONTINUE
  1084.  
  1085. TYPE=' '
  1086. CALL ACMO(MTABLE,'IIMP',TYPE,MCHPO1)
  1087. IF(TYPE.NE.'CHPOINT')MCHPO1=0
  1088.  
  1089. CALL LIRCHA(NOMI,0,IRET)
  1090. IF(IRET.EQ.0)THEN
  1091. GO TO 90
  1092. ENDIF
  1093. CALL OPTLI(IP,LMOTS,NOMI,NBM)
  1094. IF(IP.NE.0)THEN
  1095. NOM=NOMI
  1096. C WRITE(IOIMP,*)' 4eme gt2 nom=',nom
  1097. GO TO 2
  1098. ENDIF
  1099.  
  1100. CALL LENCHA(NOMI,LCI)
  1101.  
  1102. CALL LIRMOT(MOIMP,NBL,IP,1)
  1103. IF(IP.EQ.0)THEN
  1104. WRITE(IOIMP,*)' Directive IIMP : '
  1105. WRITE(IOIMP,*)' On attend un mot cle de la liste suivante :'
  1106. $ ,MOIMP
  1107. RETURN
  1108. ENDIF
  1109. C WRITE(IOIMP,*)' MOIMP=',moimp(ip)
  1110.  
  1111. WRITE(NOML,FMT='(I1,A4)')IP,NOMI
  1112. IF(IP.EQ.4)NOML=NOMI
  1113.  
  1114. CALL LIROBJ('MAILLAGE',MELEME,1,IRET)
  1115. IF(IRET.EQ.0)THEN
  1116. GO TO 90
  1117. ENDIF
  1118.  
  1119. CALL ECRCHA('POI1')
  1120. CALL ECROBJ('MAILLAGE',MELEME)
  1121. CALL PRCHAN
  1122. CALL LIROBJ('MAILLAGE',MELEME,1,IRET)
  1123. SEGACT MELEME
  1124. N=NUM(/2)
  1125. NAT=2
  1126. NSOUPO=1
  1127. NC=1
  1128. SEGINI MCHPOI,MSOUPO,MPOVAL
  1129. IFOPOI=IFOUR
  1130. MOCHDE=TITREE
  1131. MTYPOI='IIMP'
  1132. JATTRI(1)=2
  1133. IPCHP(1)=MSOUPO
  1134. C WRITE(IOIMP,*)' EQEX 2 : IPCHP,mchpoi=',IPCHP(1),mchpoi
  1135. NOCOMP(1)=NOML(1:4)
  1136. IGEOC=MELEME
  1137. IPOVAL=MPOVAL
  1138.  
  1139. CALL QUETYP(MTYP,1,IRET)
  1140. C WRITE(IOIMP,*)' MTYP=',mtyp
  1141.  
  1142. IF(MTYP.EQ.'FLOTTANT')THEN
  1143. CALL LIRREE(XVAL,1,IRET)
  1144. CALL INITD(VPOCHA,N,XVAL)
  1145. SEGDES MPOVAL
  1146. ELSEIF(MTYP.EQ.'ENTIER')THEN
  1147. CALL LIRENT(IENT,1,IRET)
  1148. XVAL=DBLE(IENT)
  1149. CALL INITD(VPOCHA,N,XVAL)
  1150. SEGDES MPOVAL
  1151. ELSE
  1152. WRITE(IOIMP,*)' TYPE NON ENCORE TRAITE'
  1153. RETURN
  1154. ENDIF
  1155. SEGDES MCHPOI,MSOUPO,MPOVAL
  1156.  
  1157. IF(MCHPO1.NE.0)THEN
  1158. CALL ECROBJ('CHPOINT',MCHPOI)
  1159. CALL ECROBJ('CHPOINT',MCHPO1)
  1160. CALL PRFUSE
  1161. CALL LIROBJ('CHPOINT',MCHPOI,1,IRET)
  1162. ENDIF
  1163. CALL ECMO(MTABLE,'IIMP','CHPOINT',MCHPOI)
  1164.  
  1165. GO TO 17
  1166.  
  1167. C DUMP
  1168.  
  1169. 18 CONTINUE
  1170. IDP=1
  1171. GO TO 1
  1172.  
  1173. C OPTI
  1174.  
  1175. 19 CONTINUE
  1176. C Définition des options par défaut
  1177. CALL CRTABL(KOPT1)
  1178. CALL ECMM(KOPT1,'SOUSTYPE','KOPT')
  1179.  
  1180. CALL ACME(KOPT,'IDCEN',IDCEN)
  1181. CALL ACME(KOPT,'RNG ',KRNG)
  1182. CALL ACME(KOPT,'IKOMP',IKOMP)
  1183. CALL ACME(KOPT,'KMACO',KMACO)
  1184. CALL ACMM(KOPT,'NMACO',NMACO)
  1185. CALL ACME(KOPT,'KIMPL',KIMPL)
  1186. CALL ACME(KOPT,'KFORM',KFORM)
  1187. CALL ACMF(KOPT,'AIMPL',AIMPL)
  1188. CALL ACME(KOPT,'ALE ',KALE)
  1189. CALL ACME(KOPT,'KMU',KMU)
  1190. CALL ACME(KOPT,'KPOIND',KPOIND)
  1191. CALL ACME(KOPT,'KPOIN',KPOIN)
  1192. CALL ACME(KOPT,'MTRMASS ',MTRMAS)
  1193. CALL ACME(KOPT,'IDEUL ',IDEUL)
  1194. CALL ACME(KOPT,'ISCHT',ISCHT)
  1195. CALL ACME(KOPT,'IDIV',IDIV)
  1196. CALL ACMF(KOPT,'CMD',CMD)
  1197. CALL ACMF(KOPT,'STABP',STAB)
  1198. CALL ACME(KOPT,'RIGIDITE',IRIG)
  1199. CALL ACME(KOPT,'LIMITE',LIMITE)
  1200. CALL ACMM(KOPT,'INEFMD',MNEFMD)
  1201.  
  1202. CALL ECME(KOPT1,'IDCEN',IDCEN)
  1203. CALL ECME(KOPT1,'RNG ',KRNG)
  1204. CALL ECME(KOPT1,'IKOMP',IKOMP)
  1205. CALL ECME(KOPT1,'KMACO',KMACO)
  1206. CALL ECMM(KOPT1,'NMACO',NMACO)
  1207. CALL ECME(KOPT1,'KIMPL',KIMPL)
  1208. CALL ECME(KOPT1,'KFORM',KFORM)
  1209. IF(KIMPL.EQ.1)AIMPL=1.D0
  1210. IF(KIMPL.EQ.0)AIMPL=0.D0
  1211. CALL ECMF(KOPT1,'AIMPL',AIMPL)
  1212. CALL ECME(KOPT1,'ALE',KALE)
  1213. CALL ECME(KOPT1,'KMU',KMU)
  1214. C? CALL ECME(KOPT1,'KPOIND',99)
  1215. CALL ECME(KOPT1,'KPOIND',KPOIND)
  1216. CALL ECME(KOPT1,'KPOIN',KPOIN)
  1217. CALL ECME(KOPT1,'MTRMASS ',MTRMAS)
  1218. CALL ECME(KOPT1,'IDEUL ',IDEUL)
  1219. CALL ECME(KOPT1,'ISCHT',ISCHT)
  1220. CALL ECME(KOPT1,'IDIV',IDIV)
  1221. CALL ECMF(KOPT1,'CMD',CMD)
  1222. CALL ECMF(KOPT1,'STABP',STAB)
  1223. CALL ECME(KOPT1,'RIGIDITE',IRIG)
  1224. CALL ECME(KOPT1,'LIMITE',LIMITE)
  1225. CALL ECMM(KOPT1,'INEFMD',MNEFMD)
  1226.  
  1227. KOPT=KOPT1
  1228.  
  1229. 191 CONTINUE
  1230. CALL LIRCHA(NOM,0,IRET)
  1231. IF(IRET.EQ.0)THEN
  1232. GO TO 90
  1233. ENDIF
  1234. CALL OPTLI(IP,LOPTI,NOM,NOPT)
  1235. IF(IP.EQ.0)THEN
  1236. CALL ECRCHA(NOM)
  1237. GO TO 1
  1238. ENDIF
  1239. C write(6,*)' NOM=',NOM,IP
  1240.  
  1241. GO TO (1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,
  1242. & 1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,
  1243. & 1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,
  1244. & 1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,
  1245. & 1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,
  1246. & 1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,
  1247. & 1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,
  1248. & 1971,1972,1973,1974,1975 ),IP
  1249.  
  1250. C Formulation EFM1
  1251. 1901 CALL ECME(KOPT,'KFORM',0)
  1252. GO TO 191
  1253. C Formulation EF
  1254. 1902 CALL ECME(KOPT,'KFORM',1)
  1255. GO TO 191
  1256. C Formulation VF
  1257. 1903 CALL ECME(KOPT,'KFORM',2)
  1258. GO TO 191
  1259. C Formulation EFMC
  1260. 1904 CALL ECME(KOPT,'KFORM',3)
  1261. GO TO 191
  1262.  
  1263. C Emplacements libres pour une nouvelle formulation
  1264. 1905 CONTINUE
  1265. GO TO 191
  1266.  
  1267. C Formulation EF LINE
  1268. 1906 CALL ECMM(KOPT,'INEFMD','LINE')
  1269. GO TO 191
  1270. C Formulation EF MACRO
  1271. 1907 CALL ECMM(KOPT,'INEFMD','MACRO')
  1272. GO TO 191
  1273. C Formulation EF QUAF
  1274. 1908 CALL ECMM(KOPT,'INEFMD','QUAF')
  1275. GO TO 191
  1276. C Formulation EF LINB
  1277. 1909 CALL ECMM(KOPT,'INEFMD','LINB')
  1278. GO TO 191
  1279. C Formulation EF LINB
  1280. 1910 CALL ECMM(KOPT,'INEFMD','ISOQ')
  1281. GO TO 191
  1282.  
  1283. C CENTREE
  1284. 1911 CALL ECME(KOPT,'IDCEN',1)
  1285. GO TO 191
  1286. C SUPGDC
  1287. 1912 CALL ECME(KOPT,'IDCEN',2)
  1288. GO TO 191
  1289. C SUPG
  1290. 1913 CALL ECME(KOPT,'IDCEN',3)
  1291. GO TO 191
  1292. C Tenseur visqueux
  1293. 1914 CALL ECME(KOPT,'IDCEN',4)
  1294. GO TO 191
  1295. C Crank Nicholson généralisé
  1296. 1915 CALL ECME(KOPT,'IDCEN',5)
  1297. GO TO 191
  1298. C PSI
  1299. 1916 CALL ECME(KOPT,'IDCEN',6)
  1300. GO TO 191
  1301. C JOHNSON
  1302. 1917 CALL ECME(KOPT,'IDCEN',7)
  1303. GO TO 191
  1304. C UPWIND
  1305. 1918 CALL ECME(KOPT,'IDCEN',8)
  1306. GO TO 191
  1307. C GODUNOV
  1308. 1919 CALL ECME(KOPT,'IDCEN',9)
  1309. GO TO 191
  1310. C VANLEER
  1311. 1920 CALL ECME(KOPT,'IDCEN',10)
  1312. GO TO 191
  1313. C VLH (VAN LEER - HANEL)
  1314. 1921 CALL ECME(KOPT,'IDCEN',11)
  1315. GO TO 191
  1316. C HUSVL (VAN LEER + OSHER)
  1317. 1922 CALL ECME(KOPT,'IDCEN',12)
  1318. GOTO 191
  1319. C HUSVLH (VAN LEER - HANEL + OSHER)
  1320. 1923 CALL ECME(KOPT,'IDCEN',13)
  1321. GOTO 191
  1322. C AUSM (AUSM+)
  1323. 1924 CALL ECME(KOPT,'IDCEN',14)
  1324. GOTO 191
  1325. C CG Colella-Glaz
  1326. 1925 CALL ECME(KOPT,'IDCEN',15)
  1327. GOTO 191
  1328. C VSM Viscosité de sous-maille
  1329. 1926 CALL ECME(KOPT,'IDCEN',16)
  1330. GOTO 191
  1331. C VSMCC Viscosité de sous-maille Capture de choc
  1332. 1927 CALL ECME(KOPT,'IDCEN',17)
  1333. GOTO 191
  1334. C SUPGDCH
  1335. 1928 CALL ECME(KOPT,'IDCEN',18)
  1336. GOTO 191
  1337. C SUPGH
  1338. 1929 CALL ECME(KOPT,'IDCEN',19)
  1339. GOTO 191
  1340. C emplacements libres pour nouveaux schema
  1341. 1930 CONTINUE
  1342. GO TO 191
  1343.  
  1344. C sommet
  1345. 1931 CALL ECME(KOPT,'KPOIN',0)
  1346. GO TO 191
  1347. C face
  1348. 1932 CALL ECME(KOPT,'KPOIN',1)
  1349. GO TO 191
  1350. C centre
  1351. 1933 CALL ECME(KOPT,'KPOIN',2)
  1352. GO TO 191
  1353. C centrep0
  1354. 1934 CALL ECME(KOPT,'KPOIN',3)
  1355. GO TO 191
  1356. C centrep1
  1357. 1935 CALL ECME(KOPT,'KPOIN',4)
  1358. GO TO 191
  1359. C msommet
  1360. 1936 CALL ECME(KOPT,'KPOIN',5)
  1361. GO TO 191
  1362. C Emplacements libres pour de nouveaux points
  1363. 1937 CONTINUE
  1364. 1938 CONTINUE
  1365. 1939 CONTINUE
  1366. 1940 CONTINUE
  1367. GO TO 191
  1368.  
  1369. C Implicite
  1370. 1941 CALL ECME(KOPT,'KIMPL',1)
  1371. CALL ECMF(KOPT,'AIMPL',1.D0)
  1372. GO TO 191
  1373. C Explicite
  1374. 1942 CALL ECME(KOPT,'KIMPL',0)
  1375. CALL ECMF(KOPT,'AIMPL',0.D0)
  1376. GO TO 191
  1377. C Semi implicite
  1378. 1943 CALL ECME(KOPT,'KIMPL',2)
  1379. C? WRITE(IOIMP,*)' EQEX KIMPL mis a 2 '
  1380. CALL QUETYP(MTYP,0,IRET)
  1381. IF(MTYP.EQ.'FLOTTANT')THEN
  1382. CALL LIRREE(AIMPL,0,IRET)
  1383. CALL ECMF(KOPT,'AIMPL',AIMPL)
  1384. ELSE
  1385. CALL ECMF(KOPT,'AIMPL',0.5D0)
  1386. ENDIF
  1387. GO TO 191
  1388. C Schema en temps implicite 2eme ordre BDF2
  1389. 1944 CALL ECME(KOPT,'ISCHT',1)
  1390. GO TO 191
  1391. C Schema en temps implicite 4eme ordre BDF4
  1392. 1945 CALL ECME(KOPT,'ISCHT',2)
  1393. GO TO 191
  1394. C Rajout du terme 1/2 T Div U pour stabiliser (par defaut 0)
  1395. 1946 CALL ECME(KOPT,'IDIV',1)
  1396. GO TO 191
  1397. C Coefficient multiplicateur du decentrement (par defaut 1.)
  1398. 1947 CONTINUE
  1399. CALL QUETYP(MTYP,0,IRET)
  1400. IF(MTYP.EQ.'FLOTTANT')THEN
  1401. CALL LIRREE(CMD,0,IRET)
  1402. IF(IRET.EQ.0)THEN
  1403. GO TO 90
  1404. ENDIF
  1405. CALL ECMF(KOPT,'CMD',CMD)
  1406. ELSE
  1407. RETURN
  1408. ENDIF
  1409. GO TO 191
  1410. C Format des matrices RIGIDITE IRIG = 1 MATRIK IRIG = 0 defaut
  1411. 1948 CONTINUE
  1412. CALL ECME(KOPT,'RIGIDITE',1)
  1413. GO TO 191
  1414. C LIMITE Limiteur divers active (Kepsilon ou autre)
  1415. 1949 CONTINUE
  1416. CALL ECME(KOPT,'LIMITE',1)
  1417. GO TO 191
  1418. C NODIV
  1419. 1950 CONTINUE
  1420. CALL ECME(KOPT,'IDIV',0)
  1421. GO TO 191
  1422. C Emplacements libres pour de nouveaux Schéma
  1423.  
  1424. C Formulation conservative
  1425. 1951 CALL ECME(KOPT,'IKOMP',1)
  1426. C Formulation non conservative
  1427. GO TO 191
  1428. 1952 CALL ECME(KOPT,'IKOMP',0)
  1429. GO TO 191
  1430. 1953 CALL ECME(KOPT,'IKOMP',2)
  1431. GO TO 191
  1432. 1954 CALL ECME(KOPT,'RNG ',2)
  1433. GO TO 191
  1434. 1955 CALL ECME(KOPT,'ALE',1)
  1435. GO TO 191
  1436. C Matrice masse pleine
  1437. 1956 CALL ECME(KOPT,'MTRMASS ',1)
  1438. GO TO 191
  1439. C Matrice masse diagonale
  1440. 1957 CALL ECME(KOPT,'MTRMASS ',2)
  1441. GO TO 191
  1442. C Matrice masse consistante (Petrov Galerkin) pour le terme source
  1443. 1958 CALL ECME(KOPT,'MTRMASS ',3)
  1444. GO TO 191
  1445. C Matrice CONSTANTE
  1446. 1959 CALL ECME(KOPT,'KMACO',1)
  1447. CALL LIRCHA(CHAI,1,LCHAR)
  1448. IF(LCHAR.EQ.0)THEN
  1449. C On ne trouve pas d'objet de type %m1:8
  1450. MOTERR( 1: 8) = 'MOT'
  1451. CALL ERREUR(38)
  1452. RETURN
  1453. ENDIF
  1454. NMACO=CHAI(1:LCHAR)
  1455. CALL ECMM(KOPT,'NMACO',NMACO)
  1456. GO TO 191
  1457. C Emplacement libre pour de nouvelles idées (il faudra etre concis)
  1458. 1960 CONTINUE
  1459. GO TO 191
  1460.  
  1461. C Indices IDEUL
  1462. C EULER
  1463. 1961 CALL ECME(KOPT,'IDEUL',1)
  1464. GO TO 191
  1465. C EULERMS
  1466. 1962 CALL ECME(KOPT,'IDEUL',2)
  1467. GO TO 191
  1468. C EULERMST
  1469. 1963 CALL ECME(KOPT,'IDEUL',3)
  1470. GO TO 191
  1471. C Emplacements libres pour de nouveaux Schéma
  1472. 1964 CONTINUE
  1473. 1965 CONTINUE
  1474. GO TO 191
  1475. C Indices KPOIND
  1476. 1966 CONTINUE
  1477. CALL LIRCHA(NOM,0,IRET)
  1478. IF(IRET.EQ.0)THEN
  1479. GO TO 90
  1480. ENDIF
  1481. CALL OPTLI(IP,LOPTI(31),NOM,6)
  1482. IF(IP.EQ.0)THEN
  1483. GO TO 90
  1484. ELSE
  1485. CALL ECME(KOPT,'KPOIND',IP-1)
  1486. ENDIF
  1487. GO TO 191
  1488.  
  1489. C Emplacements libres
  1490. 1967 CONTINUE
  1491. GO TO 191
  1492.  
  1493. 1968 CONTINUE
  1494. C Indice STABP
  1495. CALL LIRREE(STAB,0,IRET)
  1496. IF(IRET.EQ.0)THEN
  1497. GO TO 90
  1498. ENDIF
  1499. CALL ECMF(KOPT,'STABP',STAB)
  1500. GO TO 191
  1501.  
  1502. C MUCONS mu constant par élément
  1503. 1969 CALL ECME(KOPT,'KMU',0)
  1504. GO TO 191
  1505.  
  1506. C FTAU mu variable par élément (formulation en grad mu)
  1507. 1970 CALL ECME(KOPT,'KMU',1)
  1508. GO TO 191
  1509.  
  1510. C MUVARI Formulation en Tau
  1511. 1971 CALL ECME(KOPT,'KMU',2)
  1512. GO TO 191
  1513.  
  1514. C Emplacements libres
  1515. 1972 CONTINUE
  1516. 1973 CONTINUE
  1517. 1974 CONTINUE
  1518. 1975 CONTINUE
  1519. GO TO 191
  1520.  
  1521.  
  1522. C OPTI
  1523.  
  1524. 20 CONTINUE
  1525. CALL LIRCHA(NOM,0,IRET)
  1526. IF(IRET.EQ.0)GO TO 90
  1527. CALL ECMM(MTABLE,'NOMVI',NOM)
  1528. GO TO 1
  1529.  
  1530. C ' '
  1531.  
  1532. 21 CONTINUE
  1533. C WRITE(IOIMP,*)' nbik=',nbik
  1534. NBIK=NBIK+1
  1535. CALL LIRCHA(NOM,0,IRET)
  1536. C WRITE(IOIMP,*)' NOM=',nom,iret
  1537. IF(IRET.EQ.0)GO TO 90
  1538. TINCD(NBIK)=NOM
  1539. CALL LITABS(LTAB,KTAB,1,1,IRET)
  1540. C WRITE(IOIMP,*)' iret=',iret
  1541. IF(IRET.EQ.0)THEN
  1542. WRITE(IOIMP,*)' On attend un objet TABLE DOMAINE'
  1543. RETURN
  1544. ENDIF
  1545. KINCD(NBIK)=KTAB(1)
  1546.  
  1547. GO TO 1
  1548.  
  1549. C TPSI
  1550.  
  1551. 22 CONTINUE
  1552. CALL LIRREE(XVAL,1,IRET)
  1553. IF(IRET.EQ.0)THEN
  1554. WRITE(IOIMP,*)' MOT CLE TPSI (Instant initial) :'
  1555. WRITE(IOIMP,*)' On attend un flottant '
  1556. RETURN
  1557. ENDIF
  1558. CALL ECMF(MTABLE,'TPSI',XVAL)
  1559. GO TO 1
  1560.  
  1561. C TFINAL
  1562.  
  1563. 23 CONTINUE
  1564. CALL LIRREE(XVAL,1,IRET)
  1565. IF(IRET.EQ.0)THEN
  1566. WRITE(IOIMP,*)' MOT CLE TFINAL (Temps final) :'
  1567. WRITE(IOIMP,*)' On attend un flottant '
  1568. RETURN
  1569. ENDIF
  1570. CALL ECMF(MTABLE,'TFINAL',XVAL)
  1571. GO TO 1
  1572.  
  1573. C FIDT
  1574.  
  1575. 24 CONTINUE
  1576. CALL LIRENT(IENT,1,IRET)
  1577. IF(IRET.EQ.0)THEN
  1578. WRITE(IOIMP,*)' MOT CLE FIDT (Frequence impression temps) :'
  1579. WRITE(IOIMP,*)' On attend un entier '
  1580. RETURN
  1581. ENDIF
  1582. CALL ECME(MTABLE,'FIDT',IENT)
  1583. GO TO 1
  1584.  
  1585. C NISTO
  1586.  
  1587. 25 CONTINUE
  1588. CALL LIRENT(IENT,1,IRET)
  1589. IF(IRET.EQ.0)THEN
  1590. WRITE(IOIMP,*)' MOT CLE NISTO (Frequence saisie historique) :'
  1591. WRITE(IOIMP,*)' On attend un entier '
  1592. RETURN
  1593. ENDIF
  1594. CALL ECME(MTABLE,'NISTO',IENT)
  1595. GO TO 1
  1596.  
  1597. C NITER
  1598.  
  1599. 26 CONTINUE
  1600. CALL LIRENT(IENT,1,IRET)
  1601. IF(IRET.EQ.0)THEN
  1602. WRITE(IOIMP,*)' MOT CLE NITER (Nombre iterations internes) :'
  1603. WRITE(IOIMP,*)' On attend un entier '
  1604. RETURN
  1605. ENDIF
  1606. CALL ECME(MTABLE,'NITER',IENT)
  1607. GO TO 1
  1608.  
  1609. C OMEGA
  1610.  
  1611. 27 CONTINUE
  1612. CALL LIRREE(XVAL,1,IRET)
  1613. IF(IRET.EQ.0)THEN
  1614. WRITE(IOIMP,*)' MOT CLE OMEGA (Facteur de relaxation) :'
  1615. WRITE(IOIMP,*)' On attend un flottant '
  1616. RETURN
  1617. ENDIF
  1618. CALL ECMF(MTABLE,'OMEGA',XVAL)
  1619. GO TO 1
  1620.  
  1621. C EPS
  1622.  
  1623. 28 CONTINUE
  1624. CALL LIRREE(XVAL,1,IRET)
  1625. IF(IRET.EQ.0)THEN
  1626. WRITE(IOIMP,*)' MOT CLE EPS (Tolerance sur le residu) :'
  1627. WRITE(IOIMP,*)' On attend un flottant '
  1628. RETURN
  1629. ENDIF
  1630. CALL ECMF(MTABLE,'EPS',XVAL)
  1631. GO TO 1
  1632.  
  1633. C IMPR
  1634.  
  1635. 29 CONTINUE
  1636. CALL LIRENT(IENT,1,IRET)
  1637. IF(IRET.EQ.0)THEN
  1638. WRITE(IOIMP,*)' MOT CLE IMPR (Niveau d impression) :'
  1639. WRITE(IOIMP,*)' On attend un entier '
  1640. RETURN
  1641. ENDIF
  1642. CALL ECME(MTABLE,'IMPR',IENT)
  1643. GO TO 1
  1644.  
  1645. 90 CONTINUE
  1646.  
  1647. TYPE=' '
  1648. CALL ACMO(MTABLE,'DOMAINE',TYPE,MTABD)
  1649. IF(TYPE.NE.'TABLE')GO TO 900
  1650. TYPE=' '
  1651. CALL ACMO(MTABLE,'LISTINCO',TYPE,MLMOT2)
  1652.  
  1653. IF(MLMOT2.NE.0)THEN
  1654.  
  1655. SEGACT MLMOT2
  1656. NINCT=MLMOT2.MOTS(/2)
  1657.  
  1658. TYPE=' '
  1659. CALL ACMO(MTABLE,'DOMINC',TYPE,MTABI)
  1660. IF(TYPE.EQ.'TABLE')THEN
  1661.  
  1662. DO 93 I=1,NINCT
  1663. NOMI=MLMOT2.MOTS(I)
  1664. TYPE=' '
  1665. CALL ACMO(MTABI,NOMI,TYPE,IPT)
  1666. IF(TYPE.NE.'TABLE')CALL ECMO(MTABI,NOMI,'TABLE',MTABD)
  1667. 93 CONTINUE
  1668. DO 94 I=1,NBIK
  1669. NOMI=TINCD(NBIK)
  1670. CALL ECMO(MTABI,NOMI,'TABLE',KINCD(NBIK))
  1671. 94 CONTINUE
  1672.  
  1673. ELSE
  1674.  
  1675. CALL CRTABL(MTABI)
  1676. CALL ECMO(MTABLE,'DOMINC','TABLE',MTABI)
  1677. DO 91 I=1,NINCT
  1678. NOMI=MLMOT2.MOTS(I)
  1679. CALL ECMO(MTABI,NOMI,'TABLE',MTABD)
  1680. 91 CONTINUE
  1681. DO 92 I=1,NBIK
  1682. NOMI=TINCD(NBIK)
  1683. CALL ECMO(MTABI,NOMI,'TABLE',KINCD(NBIK))
  1684. 92 CONTINUE
  1685.  
  1686. ENDIF
  1687. SEGDES MLMOT2
  1688. ENDIF
  1689.  
  1690. 900 CONTINUE
  1691. CALL ECROBJ('TABLE',MTABLE)
  1692. C write(6,*)' RETOUR EQEX '
  1693. RETURN
  1694. END
  1695.  
  1696.  
  1697.  
  1698.  
  1699.  
  1700.  
  1701.  
  1702.  
  1703.  
  1704.  
  1705.  
  1706.  
  1707.  
  1708.  
  1709.  
  1710.  
  1711.  
  1712.  
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.  
  1721.  
  1722.  
  1723.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales