Télécharger eqex.eso

Retour à la liste

Numérotation des lignes :

eqex
  1. C EQEX SOURCE GOUNAND 25/11/12 21:15:12 12399
  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)=1
  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)=1
  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. * Pour ne pas briser les conventions d'addition des CLIMs en vigueur
  1034. * dans EQEX...
  1035. * CALL ECROBJ('CHPOINT',MCHPOI)
  1036. * CALL ECROBJ('CHPOINT',MCHPO1)
  1037. * CALL PRFUSE
  1038. * CALL LIROBJ('CHPOINT',MCHPOI,1,IRET)
  1039. CALL ADCHPO(MCHPOI,MCHPO1,IRET,1D0,1D0)
  1040. MCHPOI=IRET
  1041. ENDIF
  1042. CALL ACTOBJ('CHPOINT',MCHPOI,1)
  1043. CALL ECMO(MTABLE,'CLIM','CHPOINT',MCHPOI)
  1044.  
  1045. GO TO 13
  1046.  
  1047. C ITMA
  1048.  
  1049. 14 CONTINUE
  1050. CALL LIRENT(IENT,1,IRET)
  1051. IF(IRET.EQ.0)THEN
  1052. WRITE(IOIMP,*)' MOT CLE ITMA (Nb maximum de pas de temps) :'
  1053. WRITE(IOIMP,*)' On attend un entier '
  1054. RETURN
  1055. ENDIF
  1056. CALL ECME(MTABLE,'ITMA',IENT)
  1057. GO TO 1
  1058.  
  1059. C ALFA
  1060.  
  1061. 15 CONTINUE
  1062. CALL LIRREE(XVAL,1,IRET)
  1063. IF(IRET.EQ.0)THEN
  1064. WRITE(IOIMP,*)' MOT CLE ALFA (Tolerance sur le pas de temps) :'
  1065. WRITE(IOIMP,*)' doit etre compris entre 0 et 1 (1 par defaut)'
  1066. WRITE(IOIMP,*)' On attend un flottant '
  1067. RETURN
  1068. ENDIF
  1069. CALL ECMF(MTABLE,'ALFA',XVAL)
  1070. GO TO 1
  1071.  
  1072. C DTI
  1073.  
  1074. 16 CONTINUE
  1075. CALL LIRREE(XVAL,1,IRET)
  1076. IF(IRET.EQ.0)THEN
  1077. WRITE(IOIMP,*)' MOT CLE DTI (Pas de temps iinitial) :'
  1078. WRITE(IOIMP,*)' On attend un flottant '
  1079. RETURN
  1080. ENDIF
  1081. DT=XVAL
  1082. CALL ECMF(MTABT,'DELTAT',DT)
  1083. CALL ECMF(MTABT,'DELTAT-1',DT)
  1084. GO TO 1
  1085.  
  1086. C IIMP
  1087.  
  1088. 17 CONTINUE
  1089.  
  1090. TYPE=' '
  1091. CALL ACMO(MTABLE,'IIMP',TYPE,MCHPO1)
  1092. IF(TYPE.NE.'CHPOINT')MCHPO1=0
  1093.  
  1094. CALL LIRCHA(NOMI,0,IRET)
  1095. IF(IRET.EQ.0)THEN
  1096. GO TO 90
  1097. ENDIF
  1098. CALL OPTLI(IP,LMOTS,NOMI,NBM)
  1099. IF(IP.NE.0)THEN
  1100. NOM=NOMI
  1101. C WRITE(IOIMP,*)' 4eme gt2 nom=',nom
  1102. GO TO 2
  1103. ENDIF
  1104.  
  1105. CALL LENCHA(NOMI,LCI)
  1106.  
  1107. CALL LIRMOT(MOIMP,NBL,IP,1)
  1108. IF(IP.EQ.0)THEN
  1109. WRITE(IOIMP,*)' Directive IIMP : '
  1110. WRITE(IOIMP,*)' On attend un mot cle de la liste suivante :'
  1111. $ ,MOIMP
  1112. RETURN
  1113. ENDIF
  1114. C WRITE(IOIMP,*)' MOIMP=',moimp(ip)
  1115.  
  1116. WRITE(NOML,FMT='(I1,A4)')IP,NOMI
  1117. IF(IP.EQ.4)NOML=NOMI
  1118.  
  1119. CALL LIROBJ('MAILLAGE',MELEME,1,IRET)
  1120. IF(IRET.EQ.0)THEN
  1121. GO TO 90
  1122. ENDIF
  1123.  
  1124. CALL ECRCHA('POI1')
  1125. CALL ECROBJ('MAILLAGE',MELEME)
  1126. CALL PRCHAN
  1127. CALL LIROBJ('MAILLAGE',MELEME,1,IRET)
  1128. SEGACT MELEME
  1129. N=NUM(/2)
  1130. NAT=2
  1131. NSOUPO=1
  1132. NC=1
  1133. SEGINI MCHPOI,MSOUPO,MPOVAL
  1134. IFOPOI=IFOUR
  1135. MOCHDE=TITREE
  1136. MTYPOI='IIMP'
  1137. JATTRI(1)=2
  1138. IPCHP(1)=MSOUPO
  1139. C WRITE(IOIMP,*)' EQEX 2 : IPCHP,mchpoi=',IPCHP(1),mchpoi
  1140. NOCOMP(1)=NOML(1:4)
  1141. IGEOC=MELEME
  1142. IPOVAL=MPOVAL
  1143.  
  1144. CALL QUETYP(MTYP,1,IRET)
  1145. C WRITE(IOIMP,*)' MTYP=',mtyp
  1146.  
  1147. IF(MTYP.EQ.'FLOTTANT')THEN
  1148. CALL LIRREE(XVAL,1,IRET)
  1149. CALL INITD(VPOCHA,N,XVAL)
  1150. SEGDES MPOVAL
  1151. ELSEIF(MTYP.EQ.'ENTIER')THEN
  1152. CALL LIRENT(IENT,1,IRET)
  1153. XVAL=DBLE(IENT)
  1154. CALL INITD(VPOCHA,N,XVAL)
  1155. SEGDES MPOVAL
  1156. ELSE
  1157. WRITE(IOIMP,*)' TYPE NON ENCORE TRAITE'
  1158. RETURN
  1159. ENDIF
  1160. SEGDES MCHPOI,MSOUPO,MPOVAL
  1161.  
  1162. IF(MCHPO1.NE.0)THEN
  1163. CALL ECROBJ('CHPOINT',MCHPOI)
  1164. CALL ECROBJ('CHPOINT',MCHPO1)
  1165. CALL PRFUSE
  1166. CALL LIROBJ('CHPOINT',MCHPOI,1,IRET)
  1167. ENDIF
  1168. CALL ECMO(MTABLE,'IIMP','CHPOINT',MCHPOI)
  1169.  
  1170. GO TO 17
  1171.  
  1172. C DUMP
  1173.  
  1174. 18 CONTINUE
  1175. IDP=1
  1176. GO TO 1
  1177.  
  1178. C OPTI
  1179.  
  1180. 19 CONTINUE
  1181. C Définition des options par défaut
  1182. CALL CRTABL(KOPT1)
  1183. CALL ECMM(KOPT1,'SOUSTYPE','KOPT')
  1184.  
  1185. CALL ACME(KOPT,'IDCEN',IDCEN)
  1186. CALL ACME(KOPT,'RNG ',KRNG)
  1187. CALL ACME(KOPT,'IKOMP',IKOMP)
  1188. CALL ACME(KOPT,'KMACO',KMACO)
  1189. CALL ACMM(KOPT,'NMACO',NMACO)
  1190. CALL ACME(KOPT,'KIMPL',KIMPL)
  1191. CALL ACME(KOPT,'KFORM',KFORM)
  1192. CALL ACMF(KOPT,'AIMPL',AIMPL)
  1193. CALL ACME(KOPT,'ALE ',KALE)
  1194. CALL ACME(KOPT,'KMU',KMU)
  1195. CALL ACME(KOPT,'KPOIND',KPOIND)
  1196. CALL ACME(KOPT,'KPOIN',KPOIN)
  1197. CALL ACME(KOPT,'MTRMASS ',MTRMAS)
  1198. CALL ACME(KOPT,'IDEUL ',IDEUL)
  1199. CALL ACME(KOPT,'ISCHT',ISCHT)
  1200. CALL ACME(KOPT,'IDIV',IDIV)
  1201. CALL ACMF(KOPT,'CMD',CMD)
  1202. CALL ACMF(KOPT,'STABP',STAB)
  1203. CALL ACME(KOPT,'RIGIDITE',IRIG)
  1204. CALL ACME(KOPT,'LIMITE',LIMITE)
  1205. CALL ACMM(KOPT,'INEFMD',MNEFMD)
  1206.  
  1207. CALL ECME(KOPT1,'IDCEN',IDCEN)
  1208. CALL ECME(KOPT1,'RNG ',KRNG)
  1209. CALL ECME(KOPT1,'IKOMP',IKOMP)
  1210. CALL ECME(KOPT1,'KMACO',KMACO)
  1211. CALL ECMM(KOPT1,'NMACO',NMACO)
  1212. CALL ECME(KOPT1,'KIMPL',KIMPL)
  1213. CALL ECME(KOPT1,'KFORM',KFORM)
  1214. IF(KIMPL.EQ.1)AIMPL=1.D0
  1215. IF(KIMPL.EQ.0)AIMPL=0.D0
  1216. CALL ECMF(KOPT1,'AIMPL',AIMPL)
  1217. CALL ECME(KOPT1,'ALE',KALE)
  1218. CALL ECME(KOPT1,'KMU',KMU)
  1219. C? CALL ECME(KOPT1,'KPOIND',99)
  1220. CALL ECME(KOPT1,'KPOIND',KPOIND)
  1221. CALL ECME(KOPT1,'KPOIN',KPOIN)
  1222. CALL ECME(KOPT1,'MTRMASS ',MTRMAS)
  1223. CALL ECME(KOPT1,'IDEUL ',IDEUL)
  1224. CALL ECME(KOPT1,'ISCHT',ISCHT)
  1225. CALL ECME(KOPT1,'IDIV',IDIV)
  1226. CALL ECMF(KOPT1,'CMD',CMD)
  1227. CALL ECMF(KOPT1,'STABP',STAB)
  1228. CALL ECME(KOPT1,'RIGIDITE',IRIG)
  1229. CALL ECME(KOPT1,'LIMITE',LIMITE)
  1230. CALL ECMM(KOPT1,'INEFMD',MNEFMD)
  1231.  
  1232. KOPT=KOPT1
  1233.  
  1234. 191 CONTINUE
  1235. CALL LIRCHA(NOM,0,IRET)
  1236. IF(IRET.EQ.0)THEN
  1237. GO TO 90
  1238. ENDIF
  1239. CALL OPTLI(IP,LOPTI,NOM,NOPT)
  1240. IF(IP.EQ.0)THEN
  1241. CALL ECRCHA(NOM)
  1242. GO TO 1
  1243. ENDIF
  1244. C write(6,*)' NOM=',NOM,IP
  1245.  
  1246. GO TO (1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,
  1247. & 1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,
  1248. & 1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,
  1249. & 1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,
  1250. & 1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,
  1251. & 1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,
  1252. & 1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,
  1253. & 1971,1972,1973,1974,1975 ),IP
  1254.  
  1255. C Formulation EFM1
  1256. 1901 CALL ECME(KOPT,'KFORM',0)
  1257. GO TO 191
  1258. C Formulation EF
  1259. 1902 CALL ECME(KOPT,'KFORM',1)
  1260. GO TO 191
  1261. C Formulation VF
  1262. 1903 CALL ECME(KOPT,'KFORM',2)
  1263. GO TO 191
  1264. C Formulation EFMC
  1265. 1904 CALL ECME(KOPT,'KFORM',3)
  1266. GO TO 191
  1267.  
  1268. C Emplacements libres pour une nouvelle formulation
  1269. 1905 CONTINUE
  1270. GO TO 191
  1271.  
  1272. C Formulation EF LINE
  1273. 1906 CALL ECMM(KOPT,'INEFMD','LINE')
  1274. GO TO 191
  1275. C Formulation EF MACRO
  1276. 1907 CALL ECMM(KOPT,'INEFMD','MACRO')
  1277. GO TO 191
  1278. C Formulation EF QUAF
  1279. 1908 CALL ECMM(KOPT,'INEFMD','QUAF')
  1280. GO TO 191
  1281. C Formulation EF LINB
  1282. 1909 CALL ECMM(KOPT,'INEFMD','LINB')
  1283. GO TO 191
  1284. C Formulation EF LINB
  1285. 1910 CALL ECMM(KOPT,'INEFMD','ISOQ')
  1286. GO TO 191
  1287.  
  1288. C CENTREE
  1289. 1911 CALL ECME(KOPT,'IDCEN',1)
  1290. GO TO 191
  1291. C SUPGDC
  1292. 1912 CALL ECME(KOPT,'IDCEN',2)
  1293. GO TO 191
  1294. C SUPG
  1295. 1913 CALL ECME(KOPT,'IDCEN',3)
  1296. GO TO 191
  1297. C Tenseur visqueux
  1298. 1914 CALL ECME(KOPT,'IDCEN',4)
  1299. GO TO 191
  1300. C Crank Nicholson généralisé
  1301. 1915 CALL ECME(KOPT,'IDCEN',5)
  1302. GO TO 191
  1303. C PSI
  1304. 1916 CALL ECME(KOPT,'IDCEN',6)
  1305. GO TO 191
  1306. C JOHNSON
  1307. 1917 CALL ECME(KOPT,'IDCEN',7)
  1308. GO TO 191
  1309. C UPWIND
  1310. 1918 CALL ECME(KOPT,'IDCEN',8)
  1311. GO TO 191
  1312. C GODUNOV
  1313. 1919 CALL ECME(KOPT,'IDCEN',9)
  1314. GO TO 191
  1315. C VANLEER
  1316. 1920 CALL ECME(KOPT,'IDCEN',10)
  1317. GO TO 191
  1318. C VLH (VAN LEER - HANEL)
  1319. 1921 CALL ECME(KOPT,'IDCEN',11)
  1320. GO TO 191
  1321. C HUSVL (VAN LEER + OSHER)
  1322. 1922 CALL ECME(KOPT,'IDCEN',12)
  1323. GOTO 191
  1324. C HUSVLH (VAN LEER - HANEL + OSHER)
  1325. 1923 CALL ECME(KOPT,'IDCEN',13)
  1326. GOTO 191
  1327. C AUSM (AUSM+)
  1328. 1924 CALL ECME(KOPT,'IDCEN',14)
  1329. GOTO 191
  1330. C CG Colella-Glaz
  1331. 1925 CALL ECME(KOPT,'IDCEN',15)
  1332. GOTO 191
  1333. C VSM Viscosité de sous-maille
  1334. 1926 CALL ECME(KOPT,'IDCEN',16)
  1335. GOTO 191
  1336. C VSMCC Viscosité de sous-maille Capture de choc
  1337. 1927 CALL ECME(KOPT,'IDCEN',17)
  1338. GOTO 191
  1339. C SUPGDCH
  1340. 1928 CALL ECME(KOPT,'IDCEN',18)
  1341. GOTO 191
  1342. C SUPGH
  1343. 1929 CALL ECME(KOPT,'IDCEN',19)
  1344. GOTO 191
  1345. C emplacements libres pour nouveaux schema
  1346. 1930 CONTINUE
  1347. GO TO 191
  1348.  
  1349. C sommet
  1350. 1931 CALL ECME(KOPT,'KPOIN',0)
  1351. GO TO 191
  1352. C face
  1353. 1932 CALL ECME(KOPT,'KPOIN',1)
  1354. GO TO 191
  1355. C centre
  1356. 1933 CALL ECME(KOPT,'KPOIN',2)
  1357. GO TO 191
  1358. C centrep0
  1359. 1934 CALL ECME(KOPT,'KPOIN',3)
  1360. GO TO 191
  1361. C centrep1
  1362. 1935 CALL ECME(KOPT,'KPOIN',4)
  1363. GO TO 191
  1364. C msommet
  1365. 1936 CALL ECME(KOPT,'KPOIN',5)
  1366. GO TO 191
  1367. C Emplacements libres pour de nouveaux points
  1368. 1937 CONTINUE
  1369. 1938 CONTINUE
  1370. 1939 CONTINUE
  1371. 1940 CONTINUE
  1372. GO TO 191
  1373.  
  1374. C Implicite
  1375. 1941 CALL ECME(KOPT,'KIMPL',1)
  1376. CALL ECMF(KOPT,'AIMPL',1.D0)
  1377. GO TO 191
  1378. C Explicite
  1379. 1942 CALL ECME(KOPT,'KIMPL',0)
  1380. CALL ECMF(KOPT,'AIMPL',0.D0)
  1381. GO TO 191
  1382. C Semi implicite
  1383. 1943 CALL ECME(KOPT,'KIMPL',2)
  1384. C? WRITE(IOIMP,*)' EQEX KIMPL mis a 2 '
  1385. CALL QUETYP(MTYP,0,IRET)
  1386. IF(MTYP.EQ.'FLOTTANT')THEN
  1387. CALL LIRREE(AIMPL,0,IRET)
  1388. CALL ECMF(KOPT,'AIMPL',AIMPL)
  1389. ELSE
  1390. CALL ECMF(KOPT,'AIMPL',0.5D0)
  1391. ENDIF
  1392. GO TO 191
  1393. C Schema en temps implicite 2eme ordre BDF2
  1394. 1944 CALL ECME(KOPT,'ISCHT',1)
  1395. GO TO 191
  1396. C Schema en temps implicite 4eme ordre BDF4
  1397. 1945 CALL ECME(KOPT,'ISCHT',2)
  1398. GO TO 191
  1399. C Rajout du terme 1/2 T Div U pour stabiliser (par defaut 0)
  1400. 1946 CALL ECME(KOPT,'IDIV',1)
  1401. GO TO 191
  1402. C Coefficient multiplicateur du decentrement (par defaut 1.)
  1403. 1947 CONTINUE
  1404. CALL QUETYP(MTYP,0,IRET)
  1405. IF(MTYP.EQ.'FLOTTANT')THEN
  1406. CALL LIRREE(CMD,0,IRET)
  1407. IF(IRET.EQ.0)THEN
  1408. GO TO 90
  1409. ENDIF
  1410. CALL ECMF(KOPT,'CMD',CMD)
  1411. ELSE
  1412. RETURN
  1413. ENDIF
  1414. GO TO 191
  1415. C Format des matrices RIGIDITE IRIG = 1 MATRIK IRIG = 0 defaut
  1416. 1948 CONTINUE
  1417. CALL ECME(KOPT,'RIGIDITE',1)
  1418. GO TO 191
  1419. C LIMITE Limiteur divers active (Kepsilon ou autre)
  1420. 1949 CONTINUE
  1421. CALL ECME(KOPT,'LIMITE',1)
  1422. GO TO 191
  1423. C NODIV
  1424. 1950 CONTINUE
  1425. CALL ECME(KOPT,'IDIV',0)
  1426. GO TO 191
  1427. C Emplacements libres pour de nouveaux Schéma
  1428.  
  1429. C Formulation conservative
  1430. 1951 CALL ECME(KOPT,'IKOMP',1)
  1431. C Formulation non conservative
  1432. GO TO 191
  1433. 1952 CALL ECME(KOPT,'IKOMP',0)
  1434. GO TO 191
  1435. 1953 CALL ECME(KOPT,'IKOMP',2)
  1436. GO TO 191
  1437. 1954 CALL ECME(KOPT,'RNG ',2)
  1438. GO TO 191
  1439. 1955 CALL ECME(KOPT,'ALE',1)
  1440. GO TO 191
  1441. C Matrice masse pleine
  1442. 1956 CALL ECME(KOPT,'MTRMASS ',1)
  1443. GO TO 191
  1444. C Matrice masse diagonale
  1445. 1957 CALL ECME(KOPT,'MTRMASS ',2)
  1446. GO TO 191
  1447. C Matrice masse consistante (Petrov Galerkin) pour le terme source
  1448. 1958 CALL ECME(KOPT,'MTRMASS ',3)
  1449. GO TO 191
  1450. C Matrice CONSTANTE
  1451. 1959 CALL ECME(KOPT,'KMACO',1)
  1452. CALL LIRCHA(CHAI,1,LCHAR)
  1453. IF(LCHAR.EQ.0)THEN
  1454. C On ne trouve pas d'objet de type %m1:8
  1455. MOTERR( 1: 8) = 'MOT'
  1456. CALL ERREUR(38)
  1457. RETURN
  1458. ENDIF
  1459. NMACO=CHAI(1:LCHAR)
  1460. CALL ECMM(KOPT,'NMACO',NMACO)
  1461. GO TO 191
  1462. C Emplacement libre pour de nouvelles idées (il faudra etre concis)
  1463. 1960 CONTINUE
  1464. GO TO 191
  1465.  
  1466. C Indices IDEUL
  1467. C EULER
  1468. 1961 CALL ECME(KOPT,'IDEUL',1)
  1469. GO TO 191
  1470. C EULERMS
  1471. 1962 CALL ECME(KOPT,'IDEUL',2)
  1472. GO TO 191
  1473. C EULERMST
  1474. 1963 CALL ECME(KOPT,'IDEUL',3)
  1475. GO TO 191
  1476. C Emplacements libres pour de nouveaux Schéma
  1477. 1964 CONTINUE
  1478. 1965 CONTINUE
  1479. GO TO 191
  1480. C Indices KPOIND
  1481. 1966 CONTINUE
  1482. CALL LIRCHA(NOM,0,IRET)
  1483. IF(IRET.EQ.0)THEN
  1484. GO TO 90
  1485. ENDIF
  1486. CALL OPTLI(IP,LOPTI(31),NOM,6)
  1487. IF(IP.EQ.0)THEN
  1488. GO TO 90
  1489. ELSE
  1490. CALL ECME(KOPT,'KPOIND',IP-1)
  1491. ENDIF
  1492. GO TO 191
  1493.  
  1494. C Emplacements libres
  1495. 1967 CONTINUE
  1496. GO TO 191
  1497.  
  1498. 1968 CONTINUE
  1499. C Indice STABP
  1500. CALL LIRREE(STAB,0,IRET)
  1501. IF(IRET.EQ.0)THEN
  1502. GO TO 90
  1503. ENDIF
  1504. CALL ECMF(KOPT,'STABP',STAB)
  1505. GO TO 191
  1506.  
  1507. C MUCONS mu constant par élément
  1508. 1969 CALL ECME(KOPT,'KMU',0)
  1509. GO TO 191
  1510.  
  1511. C FTAU mu variable par élément (formulation en grad mu)
  1512. 1970 CALL ECME(KOPT,'KMU',1)
  1513. GO TO 191
  1514.  
  1515. C MUVARI Formulation en Tau
  1516. 1971 CALL ECME(KOPT,'KMU',2)
  1517. GO TO 191
  1518.  
  1519. C Emplacements libres
  1520. 1972 CONTINUE
  1521. 1973 CONTINUE
  1522. 1974 CONTINUE
  1523. 1975 CONTINUE
  1524. GO TO 191
  1525.  
  1526.  
  1527. C OPTI
  1528.  
  1529. 20 CONTINUE
  1530. CALL LIRCHA(NOM,0,IRET)
  1531. IF(IRET.EQ.0)GO TO 90
  1532. CALL ECMM(MTABLE,'NOMVI',NOM)
  1533. GO TO 1
  1534.  
  1535. C ' '
  1536.  
  1537. 21 CONTINUE
  1538. C WRITE(IOIMP,*)' nbik=',nbik
  1539. NBIK=NBIK+1
  1540. CALL LIRCHA(NOM,0,IRET)
  1541. C WRITE(IOIMP,*)' NOM=',nom,iret
  1542. IF(IRET.EQ.0)GO TO 90
  1543. TINCD(NBIK)=NOM
  1544. CALL LITABS(LTAB,KTAB,1,1,IRET)
  1545. C WRITE(IOIMP,*)' iret=',iret
  1546. IF(IRET.EQ.0)THEN
  1547. WRITE(IOIMP,*)' On attend un objet TABLE DOMAINE'
  1548. RETURN
  1549. ENDIF
  1550. KINCD(NBIK)=KTAB(1)
  1551.  
  1552. GO TO 1
  1553.  
  1554. C TPSI
  1555.  
  1556. 22 CONTINUE
  1557. CALL LIRREE(XVAL,1,IRET)
  1558. IF(IRET.EQ.0)THEN
  1559. WRITE(IOIMP,*)' MOT CLE TPSI (Instant initial) :'
  1560. WRITE(IOIMP,*)' On attend un flottant '
  1561. RETURN
  1562. ENDIF
  1563. CALL ECMF(MTABLE,'TPSI',XVAL)
  1564. GO TO 1
  1565.  
  1566. C TFINAL
  1567.  
  1568. 23 CONTINUE
  1569. CALL LIRREE(XVAL,1,IRET)
  1570. IF(IRET.EQ.0)THEN
  1571. WRITE(IOIMP,*)' MOT CLE TFINAL (Temps final) :'
  1572. WRITE(IOIMP,*)' On attend un flottant '
  1573. RETURN
  1574. ENDIF
  1575. CALL ECMF(MTABLE,'TFINAL',XVAL)
  1576. GO TO 1
  1577.  
  1578. C FIDT
  1579.  
  1580. 24 CONTINUE
  1581. CALL LIRENT(IENT,1,IRET)
  1582. IF(IRET.EQ.0)THEN
  1583. WRITE(IOIMP,*)' MOT CLE FIDT (Frequence impression temps) :'
  1584. WRITE(IOIMP,*)' On attend un entier '
  1585. RETURN
  1586. ENDIF
  1587. CALL ECME(MTABLE,'FIDT',IENT)
  1588. GO TO 1
  1589.  
  1590. C NISTO
  1591.  
  1592. 25 CONTINUE
  1593. CALL LIRENT(IENT,1,IRET)
  1594. IF(IRET.EQ.0)THEN
  1595. WRITE(IOIMP,*)' MOT CLE NISTO (Frequence saisie historique) :'
  1596. WRITE(IOIMP,*)' On attend un entier '
  1597. RETURN
  1598. ENDIF
  1599. CALL ECME(MTABLE,'NISTO',IENT)
  1600. GO TO 1
  1601.  
  1602. C NITER
  1603.  
  1604. 26 CONTINUE
  1605. CALL LIRENT(IENT,1,IRET)
  1606. IF(IRET.EQ.0)THEN
  1607. WRITE(IOIMP,*)' MOT CLE NITER (Nombre iterations internes) :'
  1608. WRITE(IOIMP,*)' On attend un entier '
  1609. RETURN
  1610. ENDIF
  1611. CALL ECME(MTABLE,'NITER',IENT)
  1612. GO TO 1
  1613.  
  1614. C OMEGA
  1615.  
  1616. 27 CONTINUE
  1617. CALL LIRREE(XVAL,1,IRET)
  1618. IF(IRET.EQ.0)THEN
  1619. WRITE(IOIMP,*)' MOT CLE OMEGA (Facteur de relaxation) :'
  1620. WRITE(IOIMP,*)' On attend un flottant '
  1621. RETURN
  1622. ENDIF
  1623. CALL ECMF(MTABLE,'OMEGA',XVAL)
  1624. GO TO 1
  1625.  
  1626. C EPS
  1627.  
  1628. 28 CONTINUE
  1629. CALL LIRREE(XVAL,1,IRET)
  1630. IF(IRET.EQ.0)THEN
  1631. WRITE(IOIMP,*)' MOT CLE EPS (Tolerance sur le residu) :'
  1632. WRITE(IOIMP,*)' On attend un flottant '
  1633. RETURN
  1634. ENDIF
  1635. CALL ECMF(MTABLE,'EPS',XVAL)
  1636. GO TO 1
  1637.  
  1638. C IMPR
  1639.  
  1640. 29 CONTINUE
  1641. CALL LIRENT(IENT,1,IRET)
  1642. IF(IRET.EQ.0)THEN
  1643. WRITE(IOIMP,*)' MOT CLE IMPR (Niveau d impression) :'
  1644. WRITE(IOIMP,*)' On attend un entier '
  1645. RETURN
  1646. ENDIF
  1647. CALL ECME(MTABLE,'IMPR',IENT)
  1648. GO TO 1
  1649.  
  1650. 90 CONTINUE
  1651.  
  1652. TYPE=' '
  1653. CALL ACMO(MTABLE,'DOMAINE',TYPE,MTABD)
  1654. IF(TYPE.NE.'TABLE')GO TO 900
  1655. TYPE=' '
  1656. CALL ACMO(MTABLE,'LISTINCO',TYPE,MLMOT2)
  1657.  
  1658. IF(MLMOT2.NE.0)THEN
  1659.  
  1660. SEGACT MLMOT2
  1661. NINCT=MLMOT2.MOTS(/2)
  1662.  
  1663. TYPE=' '
  1664. CALL ACMO(MTABLE,'DOMINC',TYPE,MTABI)
  1665. IF(TYPE.EQ.'TABLE')THEN
  1666.  
  1667. DO 93 I=1,NINCT
  1668. NOMI=MLMOT2.MOTS(I)
  1669. TYPE=' '
  1670. CALL ACMO(MTABI,NOMI,TYPE,IPT)
  1671. IF(TYPE.NE.'TABLE')CALL ECMO(MTABI,NOMI,'TABLE',MTABD)
  1672. 93 CONTINUE
  1673. DO 94 I=1,NBIK
  1674. NOMI=TINCD(NBIK)
  1675. CALL ECMO(MTABI,NOMI,'TABLE',KINCD(NBIK))
  1676. 94 CONTINUE
  1677.  
  1678. ELSE
  1679.  
  1680. CALL CRTABL(MTABI)
  1681. CALL ECMO(MTABLE,'DOMINC','TABLE',MTABI)
  1682. DO 91 I=1,NINCT
  1683. NOMI=MLMOT2.MOTS(I)
  1684. CALL ECMO(MTABI,NOMI,'TABLE',MTABD)
  1685. 91 CONTINUE
  1686. DO 92 I=1,NBIK
  1687. NOMI=TINCD(NBIK)
  1688. CALL ECMO(MTABI,NOMI,'TABLE',KINCD(NBIK))
  1689. 92 CONTINUE
  1690.  
  1691. ENDIF
  1692. SEGDES MLMOT2
  1693. ENDIF
  1694.  
  1695. 900 CONTINUE
  1696. CALL ECROBJ('TABLE',MTABLE)
  1697. C write(6,*)' RETOUR EQEX '
  1698. RETURN
  1699. END
  1700.  
  1701.  

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