Télécharger 15wedge.dgibi

Retour à la liste

Numérotation des lignes :

  1. * fichier : 15wedge.dgibi
  2. *
  3. ******************************************************************
  4. * CALCUL DE L'ECOULEMENT SUPERSONIQUE STATIONNAIRE DANS UN CANAL *
  5. * AVEC RAMPE INCLINEE A 15deg. *
  6. * POWELL AND DEZEEUW, AIAA-91-1542-CP *
  7. * FORMULATION VF COMPRESSIBLE EXPLICITE/IMPLICITE *
  8. * *
  9. * H. PAILLERE/P. GALON TTMF AOUT 1997 *
  10. * *
  11. * MODIF BECCANTINI MARS 97 (reconstruction lineaire exacte) *
  12. * MODIF BECCANTINI MARS 01 (implicite) *
  13. * MODIF BECCANTINI AUGUST 2021 (quelque sintaxe a changé *
  14. * *
  15. ******************************************************************
  16. *
  17. ************************************************************************
  18. ************************************************************************
  19. ************************************************************************
  20. ************************************************************************
  21. ***************** PARTIE PROCEDURES ************************************
  22. ************************************************************************
  23. ************************************************************************
  24. ************************************************************************
  25. ************************************************************************
  26. ************************************************************************
  27. ************************************************************************
  28. *
  29. * Put it in utilproc
  30. * Procedures will finish in FIN PARTIE PROCEDURES
  31. *
  32.  
  33. ***** $$$$ EXEXCH
  34. *
  35. *****************************************************
  36. *****************************************************
  37. ** PROCEDURE EXEX POUR FORMULATION VF COMPRESSIBLE **
  38. *****************************************************
  39. *****************************************************
  40. *
  41. * We check wether the table RV is complete
  42. *
  43. *
  44. 'DEBPROC' EXEXCH ;
  45. 'ARGUMENT' RV*TABLE ;
  46. 'MESSAGE' ;
  47. 'MESSAGE' 'PROCEDURE EXEXCH' ;
  48. *
  49. **** Initialisation d'un CHPOINT 'ET' d'une MATRIK vide
  50. *
  51. CHPVID MATVID = 'KOPS' 'MATRIK' ;
  52. RESPRO CHPVID MATVID ;
  53. *
  54. **** Les inconnues
  55. *
  56. 'SI' ('NON' ('EXISTE' RV 'UN')) ;
  57. 'MESSAGE' ;
  58. 'MESSAGE' 'UN = ???' ;
  59. 'ERREUR' 21 ;
  60. 'FINSI' ;
  61. *
  62. **** We check the compatibility between the variables and their names
  63. *
  64. 'SI' ('NON' ('EXISTE' RV 'LISTCONS')) ;
  65. 'MESSAGE' ;
  66. 'MESSAGE' 'LISTCONS = ???' ;
  67. 'ERREUR' 21 ;
  68. 'FINSI' ;
  69. 'MESSAGE' ;
  70. 'MESSAGE' 'Conservative variables check' ;
  71. UNCELL = 'EXCO' (RV . 'LISTCONS') (RV . 'UN') (RV . 'LISTCONS') ;
  72. ERRO = 'MAXIMUM' (UNCELL '-' (RV . 'UN')) 'ABS' ;
  73. ERRO = ERRO '/' (('MAXIMUM' UNCELL 'ABS') '+' 1.0D-15) ;
  74. 'SI' (ERRO > 1.0D-6) ;
  75. 'MESSAGE' ;
  76. 'MESSAGE' 'UN = ???' ;
  77. 'MESSAGE' 'LISTCONS = ???' ;
  78. 'ERREUR' 21 ;
  79. 'SINON' ;
  80. 'MESSAGE' 'OK' ;
  81. 'FINSI' ;
  82. *
  83. **** On which variables the error has to be computed?
  84. *
  85. 'SI' ('NON' ('EXISTE' RV 'ERROMOTS')) ;
  86. 'MESSAGE' ;
  87. 'MESSAGE' 'ERROMOTS = ???' ;
  88. 'ERREUR' 21 ;
  89. 'FINSI' ;
  90. *
  91. **** Definition of the table containing some results
  92. *
  93. 'SI' ('NON' ('EXISTE' RV 'RESULTATS')) ;
  94. RV . 'RESULTATS' = 'TABLE' ;
  95. 'FINSI' ;
  96. *
  97. **** Existence d'une procédure pour imposer le conditions aux limites
  98. * à chaque iteration (interne ou externe)
  99. *
  100. 'SI' ('NON' ('EXISTE' RV 'CLIM')) ;
  101. 'MESSAGE' ;
  102. 'MESSAGE' 'CLIM = ???' ;
  103. 'ERREUR' 21 ;
  104. 'FINSI' ;
  105. * Par securité, on les impose tout de suite
  106. 'SI' (RV . 'CLIM') ;
  107. 'SI' ('NON' ('EXISTE' RV 'MAIFAN')) ;
  108. 'MESSAGE' ;
  109. 'MESSAGE' 'MAIFAN = ???' ;
  110. 'ERREUR' 21 ;
  111. 'FINSI' ;
  112. RV . 'UN' = PROLIM RV ;
  113. * DUCLIM à imposer dans l'inversion matricielle:
  114. * pas d'increment sur les cellules fantomes
  115. DUCLIM = 0.0 '*' ('REDU' (RV . 'UN') (RV . 'MAIFAN')) ;
  116. 'SINON' ;
  117. DUCLIM = 'COPIER' CHPVID ;
  118. 'FINSI' ;
  119.  
  120. RESPRO DUCLIM ;
  121. *
  122. *
  123. ****** Mise a jour de la matrice à inverser pendant les iterations internes?
  124. *
  125. * RV . 'MATUPDAT'
  126. * RV . 'MUPINT'
  127. *
  128. 'SI' ('NON' ('EXISTE' RV 'MATUPDAT')) ;
  129. 'MESSAGE' ;
  130. 'MESSAGE' 'MATUPDAT = ???' ;
  131. 'ERREUR' 21 ;
  132. 'FINSI' ;
  133. 'SI' (RV . 'MATUPDAT') ;
  134. 'MESSAGE' ;
  135. 'MESSAGE'
  136. 'We always update the matrix to inverse' ;
  137. LOGMAOLD = FAUX ;
  138. 'SINON' ;
  139. 'MESSAGE' ;
  140. 'MESSAGE'
  141. 'We don t always update the matrix to inverse' ;
  142. LOGMAOLD = VRAI ;
  143. 'FINSI' ;
  144. *
  145. RESPRO LOGMAOLD ;
  146. *
  147. **** Iterations externes et/ou temps final
  148. * La table 'PASDETPS'
  149. *
  150. 'SI' ('NON'
  151. (('EXISTE' RV 'NITMAEX') 'OU' ('EXISTE' RV 'TFINAL'))) ;
  152. 'MESSAGE' ;
  153. 'MESSAGE' 'NITMAEX = ???' ;
  154. 'MESSAGE' 'ou' ;
  155. 'MESSAGE' 'TFINAL = ???' ;
  156. 'ERREUR' 21 ;
  157. 'FINSI' ;
  158. *
  159. **** Gas model
  160. *
  161. 'SI' ('NON' ('EXISTE' RV 'PGAZ')) ;
  162. 'MESSAGE' ;
  163. 'MESSAGE' 'PGAZ = ???' ;
  164. 'ERREUR' 21 ;
  165. 'FINSI' ;
  166. *
  167. **** BAS MACH
  168. *
  169. 'SI' ('NON' ('EXISTE' RV 'BASMACH')) ;
  170. 'MESSAGE' ;
  171. 'MESSAGE' 'BASMACH = ???' ;
  172. 'ERREUR' 21 ;
  173. 'SINON' ;
  174. 'SI' (RV . 'BASMACH') ;
  175. 'SI' (('NON' ('EXISTE' RV 'CO1')) 'OU'
  176. ('NON' ('EXISTE' RV 'CO2'))) ;
  177. 'MESSAGE' ;
  178. 'MESSAGE' 'CO1 = ???' ;
  179. 'MESSAGE' 'CO2 = ???' ;
  180. 'ERREUR' 21 ;
  181. 'FINSI' ;
  182. 'FINSI' ;
  183. 'FINSI' ;
  184. *
  185. *** La table PASDETPS
  186. *
  187. 'SI' ('NON' ('EXISTE' RV 'PASDETPS')) ;
  188. 'MESSAGE' ;
  189. 'MESSAGE' 'We create the table PASDETPS' ;
  190. RV . 'PASDETPS' = 'TABLE' ;
  191. 'SINON' ;
  192. 'MESSAGE' ;
  193. 'MESSAGE' 'We use the table PASDETPS that already exists' ;
  194. 'FINSI' ;
  195. KTPS = RV . 'PASDETPS' ;
  196. *
  197. RESPRO KTPS ;
  198. * Initialisation éventuelle de la table
  199. 'SI' (('NON' ('EXISTE' KTPS 'NUPASDT')) 'OU'
  200. ('NON' ('EXISTE' KTPS 'TPS')) 'OU'
  201. ('NON' ('EXISTE' KTPS 'TPSM'))) ;
  202. 'MESSAGE' ;
  203. 'MESSAGE' 'Table PASDETPS' ;
  204. 'MESSAGE' 'NUPASDT = 0' ;
  205. 'MESSAGE' 'TPS = 0.0' ;
  206. 'MESSAGE' ;
  207. KTPS . 'NUPASDT' = 0 ;
  208. KTPS . 'TPSM' = 0.0D0 ;
  209. KTPS . 'TPS' = 0.0D0 ;
  210. 'FINSI' ;
  211. *
  212. * KTPS contient
  213. *
  214. * KTPS . 'NUPASDT' = numero de pas de TPS actuel dans les itérations
  215. * internes
  216. *
  217. * KTPS . 'TPSM' = le TPS aprés (KTPS . 'NUPASDT' '-' 2) itérations
  218. * KTPS . 'TPS' = le TPS aprés (KTPS . 'NUPASDT' '-' 1) itérations
  219. * KTPS . 'TPSP' = le TPS aprés (KTPS . 'NUPASDT') itérations, i.e. à
  220. * la fin de l'itération actuelle
  221. *
  222. *
  223. *
  224. * N.B. 'XINIT' is used in the iterative methods
  225. * We have decided to keep it 0
  226. RV . 'MATINV' . 'XINIT' = 0.0 '*' (RV . 'UN') ;
  227. 'FINPROC' ;
  228.  
  229.  
  230. **** $$$$ EXEXIM
  231. *
  232. *****************************************************
  233. *****************************************************
  234. ** PROCEDURE EXEX POUR FORMULATION VF COMPRESSIBLE **
  235. *****************************************************
  236. *****************************************************
  237. *
  238. * RV . 'UN' = les variables conservatives
  239. *
  240. * RV . 'ANOM' = LOGIQUE (anomalie detectée ?)
  241. *
  242. * RV . 'DTIMP' = pas de tmps imposé (facultatif)
  243. *
  244. * RV . 'LISTCONS'= noms des variables conservatives
  245. *
  246. * RV . 'ERROMOTS'= noms des variables sur lesquelles on calcule Linf
  247. *
  248. * RV . 'CLIM' = logique qui me dit si existe une procédure pour le
  249. * calcul de conditions limites (procédure PROLIM)
  250. *
  251. * RV . 'MAIFAN' = (a définir si RV . 'CLIM')
  252. * les cellules fantômes
  253. *
  254. * RV . 'TFINAL' = le temps final
  255. *
  256. * RV . 'NITMAEX' = le nombre d'itération externes
  257. *
  258. * N.B. Si RV . 'TFINAL' et RV . 'NITMAEX' sont les deux spécifiés, on
  259. * s'arrête quand un des deux critères est satisfait
  260. *
  261. * RV . 'MATUPDAT' = si VRAI, on ne met pas toujours à jour la matrice
  262. * à inverser
  263. *
  264. * RV . 'MUPEXT' = si (RV . 'MATUPDAT'), indice de mise à jours de la
  265. * matrice jacobienne pendant les itérations externes
  266. *
  267. * RV . 'MUPINT' = si (RV . 'MATUPDAT'), indice de mise à jours de la
  268. * matrice jacobienne pendant les itérations internes
  269. *
  270. * RV . 'MUPINI' = si (RV . 'MATUPDAT'), nombre initial de pas de temps
  271. * pendant lesquels on met à jour la matrice à chaque
  272. * itération externe
  273. *
  274. * RV . 'MUPLIN' = si (RV . 'MATUPDAT') et on utilise un solveur
  275. * itératif pour la résolution du système linéaire,
  276. * si le nombre d'itérations linéaires est > que
  277. * RV . 'MUPLIN', alors on met à jour le
  278. * preconditionneur
  279. *
  280. * RV . 'MATACC' = si (RV . 'MATUPDAT'), logique qui nous dit si on
  281. * veut utiliser la méthode de Broyden.
  282. *
  283. * RV . 'LISTOPER' = liste des opérateurs (ou des procédures) qui
  284. * interviennent dans le calcul (chaque opérateur a une
  285. * table associée), qui s'appelle &NOMPER ou
  286. * & = position de l'opérateur dedans cette liste
  287. * NOMPER = noms de l'opérateur ou de la procédure
  288. *
  289. * RV . 'NITMAIN' = (à définir dans le cas d'un calcul implicite)
  290. * le nombre max d'itération internes
  291. * RV . 'NITMIIN' = (à définir dans le cas d'un calcul implicite)
  292. * le nombre min d'itération internes
  293. *
  294. * RV . 'EPSINT' = (à définir dans le cas d'un calcul implicite)
  295. * l'erreur pour le critère de convergence sur les
  296. * itérations internes
  297. *
  298. * RV . 'MATHINV' = (a définir sans la cas d'un calcul implicite)
  299. * table de SOUSTYPE 'TYPINV' pour l'inversion de
  300. * MATRIK (pour l'opérateur 'KRES')
  301. *
  302. * RV . 'RESULTATS' = table qui contient des resultats
  303. * 'NITERLIN' = nombre de iterations lineaires
  304. * dans le solveur iteratif
  305. * 'ERROLIN' = residu de l'erreur du solveur
  306. * iteratif
  307. * 'ITERIN' = iteration interne (0, 1, ...)
  308. *
  309. *************************************************************************
  310. * MODIF
  311. *************************************************************************
  312. * Message en anglais!
  313. *
  314. 'DEBPROC' EXEXIM ;
  315. 'ARGUMENT' RV*TABLE ;
  316. 'MESSAGE' ;
  317. 'MESSAGE' 'PROCEDURE EXEXIM' ;
  318.  
  319. *
  320. **** Initialisation and controls into exexch
  321. *
  322.  
  323. CHPVID MATVID DUCLIM LOGMAOLD KTPS = EXEXCH RV ;
  324.  
  325. *************************************************************************
  326. *************************************************************************
  327. *************************************************************************
  328. *************************************************************************
  329. ************** ITÉRATIONS EXTERNES ************************************
  330. *************************************************************************
  331. *************************************************************************
  332. *************************************************************************
  333. *************************************************************************
  334. LOGEXP = VRAI ;
  335. * LOGEXP = variable logique qui me dit si on est en explicite ;
  336. LOGQIE = FAUX ;
  337. *
  338. **** Boucle qui s'arrête quand LOGQIE = VRAI ; i.e.
  339. *
  340. * (KTPS . NUPASDT) = (RV . 'NITMAEX')
  341. * ou
  342. * (KTPS . 'TPS') = (RV . 'TFINAL');
  343. *
  344. *
  345. 'SI' ('EXISTE' RV 'DTIMP') ;
  346. ALPDT = RV . 'DTIMP' ;
  347. 'SINON' ;
  348. ALPDT = 0.0 ;
  349. 'FINSI' ;
  350. NITEX = 0 ;
  351. 'REPETER' BLEX -1 ;
  352. NITEX = NITEX '+' 1 ;
  353. *
  354. ****** Iteration interne
  355. *
  356. RV . 'RESULTATS' . 'ITERIN' = 0 ;
  357. *
  358. ****** Mise à jour de la matrice à inverser
  359. *
  360. 'SI' ((NITEX 'EGA' 1) 'OU' (RV . 'ANOM')) ;
  361. * A la premiere iteration externe on doit calculer la matrice
  362. LOGUPEX = VRAI ;
  363. 'SINON' ;
  364. 'SI' LOGMAOLD ;
  365. MUPEXT = RV . 'MUPEXT' ;
  366. * On met a jour la matrice toutes les MUPEXT iterations externes
  367. LOGUPEX = ((NITEX '/' MUPEXT) '*' MUPEXT) 'EGA' NITEX ;
  368. 'FINSI' ;
  369. 'FINSI' ;
  370. *
  371. ****** Trop d'iterations externes?
  372. *
  373. KTPS . 'NUPASDT' = KTPS . 'NUPASDT' '+' 1 ;
  374. 'SI' ('EXISTE' RV 'NITMAEX') ;
  375. 'SI' ( (KTPS . 'NUPASDT') '>EG' (RV . 'NITMAEX')) ;
  376. LOGQIE = VRAI ;
  377. 'FINSI' ;
  378. 'FINSI' ;
  379. *
  380. ****** Impression
  381. *
  382. 'MESSAGE' ;
  383. 'MESSAGE' ('CHAINE' 'PASDETPS = ' (KTPS . 'NUPASDT')
  384. ' TPS = ' (KTPS . 'TPS') ' DTM1 = ' ALPDT) ;
  385. *
  386. *** ALGORITHM A RESOUDRE
  387. *
  388. * F(U^{n+1}) = 0
  389. *
  390. * if (RV . INST) then
  391. *
  392. * F(U^{n+1}) = -1. * (U^{n+1} - U^{n}) '/' (\delta t)
  393. * '+' \sum_k Res_k(U^{n+1}) '+' \sum_kexpl Res_kexpl(U^{n})
  394. *
  395. * else
  396. *
  397. * F(U^{n+1}) = -\sum_k Res_k(U^{n+1})
  398. *
  399. * endif
  400. *
  401. *
  402. * Avec une methode de type Newton-Raphson
  403. *
  404. * a) U^{n+1,0} = U^{n}
  405. *
  406. * b) for l=0,1,2,...
  407. *
  408. * MAT(U^{n+1,l}) \delta U^{n+1,l} = -F(U^{n+1,l})
  409. *
  410. * U^{n+1,l+1} = U^{n+1,l} '+' \delta U^{n+1,l}
  411. *
  412. * if || \delta U^{n+1,l} ||_{\inf} < \epsilon goto c)
  413. *
  414. * c)
  415. *
  416. * U^{n+1} = U^{n+1,l+1}
  417. *
  418. * endif
  419. *
  420. *** LES VARIABLES
  421. *
  422. * RESIMP = \sum_k Res_k(U^{n+1,l})
  423. * RESEXP = \sum_kexpl Res_kexpl(U^{n})
  424. * MATASS = - \sum_k JACR_k(U^{n+1,l})
  425. * UNM = conserved variables at t^{n}
  426. * UNM = conserved variables at t^{n-1}
  427. * LREEDT = LISTREEL de (\delta t)_k t.q.
  428. * \delta t = min (\delta t)_k
  429. *
  430. RESIMP = 'COPIER' CHPVID ;
  431. RESEXP = 'COPIER' CHPVID ;
  432. 'SI' ('EXISTE' RV 'UNM2') ;
  433. RV . 'UNM3' = 'COPIER' (RV . 'UNM2') ;
  434. 'FINSI' ;
  435. 'SI' ('EXISTE' RV 'UNM') ;
  436. RV . 'UNM2' = 'COPIER' (RV . 'UNM') ;
  437. 'FINSI' ;
  438. RV . 'UNM' = 'COPIER' (RV . 'UN') ;
  439. MATASS = 'KOPS' 'MULT' 0.0 MATVID ;
  440. LREEDT = 'PROG' ;
  441. *
  442. ***********************************************
  443. ********* Boucle sur les operateurs ***********
  444. ***********************************************
  445. *** On calcule: LREEDT
  446. * RESIMP
  447. * RESEXP
  448. * (MATASS)
  449. *
  450. 'REPETER' BLOP ('DIME' (RV . 'LISTOPER')) ;
  451. NOMPER = 'EXTRAIRE' &BLOP (RV . 'LISTOPER') ;
  452. NOTABLE = 'MOT' ('TEXTE' ('CHAINE' &BLOP NOMPER) ) ;
  453. 'SI' (RV . NOTABLE . 'IMPL') ;
  454. 'SI' ('EGA' NITEX 1) ;
  455. 'MESSAGE' ;
  456. 'MESSAGE' ('CHAINE' ('MOT' NOMPER) ': implicit') ;
  457. 'FINSI' ;
  458. * JACO = objet de type MATRIK (éventuellement vide)
  459. * RESIDU = " RESIDU "
  460. * ALPHADT = " LISTREEL "
  461. LOGEXP = FAUX ;
  462. JACO RESIDU ALPHADT = ('TEXTE' NOMPER) (RV . NOTABLE) ;
  463. 'SI' (RV . NOTABLE . 'ANOM') ;
  464. RV . 'ANOM' = VRAI ;
  465. RV . NOTABLE . 'ANOM' = FAUX ;
  466. 'QUITTER' BLOP ;
  467. 'SINON' ;
  468. MATASS = MATASS 'ET' ('KOPS' 'MULT' -1.0D0 JACO ) ;
  469. RESIMP = RESIMP 'ET' RESIDU ;
  470. 'FINSI' ;
  471. 'SINON' ;
  472. 'SI' ('EGA' NITEX 1) ;
  473. 'MESSAGE' ;
  474. 'MESSAGE' ('CHAINE' ('MOT' NOMPER) ': explicit') ;
  475. 'FINSI' ;
  476. RESIDU ALPHADT = ('TEXTE' NOMPER) (RV . NOTABLE) ;
  477. 'SI' (RV . NOTABLE . 'ANOM') ;
  478. RV . 'ANOM' = VRAI ;
  479. 'QUITTER' BLOP ;
  480. 'SINON' ;
  481. RESEXP = RESEXP 'ET' RESIDU ;
  482. 'FINSI' ;
  483. 'FINSI' ;
  484. LREEDT = LREEDT 'ET' ALPHADT ;
  485. 'FIN' BLOP ;
  486. ***********************************************
  487. ***** Fin de la boucle sur les operateurs ****
  488. ***********************************************
  489. *
  490. ******* Anomalie detectée (CTRL+S 9999)
  491. * On arrete ici
  492. *
  493. 'SI' ('NON' (RV . 'ANOM')) ;
  494. *
  495. ******* On controlle la compatibilité E/S (si NITEX = 1)
  496. *
  497. 'SI' ('EGA' NITEX 1) ;
  498. *
  499. **** Dans le cas implicite, on verifie l'existence
  500. * des parametres pour les itérations internes
  501. *
  502. 'SI' ('NON' LOGEXP) ;
  503. 'SI' ('NON' (('EXISTE' RV 'NITMAIN') 'ET'
  504. ('EXISTE' RV 'EPSINT') 'ET' ('EXISTE' RV 'NITMIIN')));
  505. 'MESSAGE' ;
  506. 'MESSAGE' 'NITMAIN = ??? ' ;
  507. 'MESSAGE' 'NITMIIN = ??? ' ;
  508. 'MESSAGE' 'EPSINT = ??? ' ;
  509. 'ERREUR' 21 ;
  510. 'FINSI' ;
  511. 'FINSI' ;
  512. 'FINSI' ;
  513. *
  514. ******* Fin contrôle compatibilité E/S
  515. *
  516. *** Mise a jour de la table RV . 'PASDETPS' au debu du calcul
  517. *
  518. 'SI' ('EXISTE' RV 'DTIMP') ;
  519. ALPDT = RV . 'DTIMP' ;
  520. 'SINON' ;
  521. ALPDT = 'MINIMUM' LREEDT ;
  522. 'FINSI' ;
  523. ALPDT1 = (RV . 'TFINAL') '-' (KTPS . 'TPS') ;
  524. 'SI' ((ALPDT 'EGA' ALPDT1 (ALPDT '*' 1.0D-6)) 'OU'
  525. (ALPDT > ALPDT1)) ;
  526. KTPS . 'TPSP' = (RV . 'TFINAL') ;
  527. ALPDT = ALPDT1 ;
  528. LOGQIE = VRAI ;
  529. * Dans ce cas, il faut metre a jour la matrice à inverser
  530. * car elle peut etre tres differnte pas rapport à celle
  531. * calculé precedentment
  532. LOGMAOLD = FAUX ;
  533. 'SINO' ;
  534. KTPS . 'TPSP' = (KTPS . 'TPS') '+' ALPDT ;
  535. 'FINSI' ;
  536. *
  537. 'SI' LOGEXP ;
  538. *************************************************************************
  539. ********** Cas explicite pour les variables conservatives ***************
  540. *************************************************************************
  541. 'SI' ((NITEX 'EGA' 1) 'OU' ((RV . 'ORDTPS') 'EGA' 1)) ;
  542. RV . 'UN' = (RV . 'UNM') '+' (ALPDT '*' RESEXP) ;
  543. 'SINON' ;
  544. RV . 'UN' = ((4. '/' 3.) '*' (RV . 'UNM')) '+'
  545. ((-1. '/' 3.) '*' (RV . 'UNM2')) '+'
  546. (((2. * ALPDT) '/' 3.) '*' RESEXP) ;
  547. 'FINSI' ;
  548. 'SI' (RV . 'CLIM') ;
  549. * 'MESSAGE' 'PROLIM after an explicit iteration' ;
  550. RV . 'UN' = PROLIM RV ;
  551. 'FINSI' ;
  552. 'SINON' ;
  553. *************************************************************************
  554. ********** Cas implicite pour les variables conservatives ***************
  555. *************************************************************************
  556. *
  557. ****** Initialisation of RV . 'RESULTATS' . 'ERRONLIN' ;
  558. *
  559. RV . 'RESULTATS' . 'ERRONLIN' = 'PROG' ;
  560. *
  561. *************************************************************************
  562. ************** Les iterations internes **********************************
  563. *************************************************************************
  564. *
  565. 'REPETER' BLINT (RV . 'NITMAIN') ;
  566. *
  567. RV . 'RESULTATS' . 'ITERIN' = &BLINT ;
  568. *
  569. ****** Implicite
  570. *
  571. 'SI' ((NITEX 'EGA' 1) 'OU' ((RV . 'ORDTPS') 'EGA' 1)) ;
  572. *
  573. *************** Implicit Euler
  574. *
  575. MAT1 = 'KOPS' 'MULT' (1. '/' ALPDT)
  576. (RV . 'MATIDE') ;
  577. SMB = ((RV . 'UNM') '-' (RV . 'UN')) '/' ALPDT ;
  578. 'SINON' ;
  579. *
  580. **************** BDF2
  581. *
  582. MAT1 = 'KOPS' 'MULT' (1.5 '/' ALPDT)
  583. (RV . 'MATIDE') ;
  584. SMB = ((4. '*' (RV . 'UNM'))
  585. '+' (-3. '*' (RV . 'UN'))
  586. '+' (-1. '*' (RV . 'UNM2'))) '/' (2. '*' ALPDT) ;
  587. 'FINSI' ;
  588. SMB = 'CHAN' 'ATTRIBUT' SMB 'NATURE' 'DISCRET' ;
  589. *
  590. ********* Bas Mach
  591. *
  592. 'SI' (RV . 'BASMACH') ;
  593. MAT1 = MAT1 'ET' (RV . 'GAMSDTAU') ;
  594. 'FINSI' ;
  595. *
  596. MATTOT = MAT1 'ET' MATASS ;
  597. RESTOT = SMB 'ET' RESIMP 'ET' RESEXP ;
  598. *
  599. ********* LOGOLD = VRAI
  600. * Si methode directe, on utilise la meme parametrisation LU
  601. * Si methode iterative, on utilise le meme preconditionneur
  602. *
  603. LOGOLD = VRAI ;
  604. 'SI' LOGMAOLD ;
  605. 'SI' (LOGUPEX 'ET' (&BLINT 'EGA' 1)) ;
  606. * LOGUPEX = VRAI -> At this external iteration we can
  607. * update the matrix to inverse
  608. 'OUBLIER' MATOLD ;
  609. 'MENAGE' ;
  610. MATOLD = MATTOT ;
  611. LOGOLD = FAUX ;
  612. 'MESSAGE' ;
  613. 'MESSAGE' 'We update the matrix' ;
  614. 'SINON' ;
  615. * We don't care about LOGUPEX if (&BLINT > 1)
  616. * In this case we update the matrix each MUPINT-th
  617. * iteration
  618. 'SI'
  619. (((&BLINT '/' (RV . 'MUPINT')) '*' (RV . 'MUPINT'))
  620. 'EGA' &BLINT) ;
  621. 'OUBLIER' MATOLD ;
  622. 'MENAGE' ;
  623. MATOLD = MATTOT ;
  624. LOGOLD = FAUX ;
  625. 'MESSAGE' ;
  626. 'MESSAGE' 'We update the matrix' ;
  627. 'FINSI' ;
  628. 'FINSI' ;
  629. 'SINON' ;
  630. *
  631. * We always update the matrix to inverse
  632. *
  633. 'OUBLIER' MATOLD ;
  634. 'MENAGE' ;
  635. LOGOLD = FAUX ;
  636. MATOLD = MATTOT ;
  637. 'FINSI' ;
  638. *
  639. 'SI' ('EXISTE' (RV . 'MATINV') 'CONVINV') ;
  640. 'SI' LOGOLD ;
  641. NLIT = ('DIME' (RV . 'MATINV' . 'CONVINV')) ;
  642. 'SI' (NLIT > RV . 'MUPLIN') ;
  643. 'MESSAGE' ;
  644. 'MESSAGE' 'We update the matrix' ;
  645. 'OUBLIER' MATOLD ;
  646. 'MENAGE' ;
  647. MATOLD = MATTOT ;
  648. 'FINSI' ;
  649. 'FINSI' ;
  650. 'FINSI' ;
  651. RV . 'MATINV' . 'MATASS' = MATOLD ;
  652. RV . 'MATINV' . 'MAPREC' = MATOLD ;
  653. *
  654. 'SI' LOGOLD ;
  655. *
  656. * LOGOLD vrai si on utilise la meme
  657. * parametrisation LU ou le meme preconditionneur
  658. * pour calculer la solution du systeme lineaire
  659. *
  660. 'SI' ((RV . 'MATINV' . 'TYPINV') 'EGA' 1) ;
  661. * Meme parametrisation LU que MATOLD
  662. DELTAU = 'KRES' MATOLD
  663. 'TYPI' (RV . 'MATINV')
  664. 'CLIM' DUCLIM
  665. 'SMBR' RESTOT
  666. 'IMPR' 0 ;
  667. 'SINON' ;
  668. * Meme preconditionneur que MATOLD
  669. DELTAU = 'KRES' MATTOT
  670. 'TYPI' (RV . 'MATINV')
  671. 'CLIM' DUCLIM
  672. 'SMBR' RESTOT
  673. 'IMPR' 0 ;
  674. 'FINSI' ;
  675. 'SINON' ;
  676. DELTAU = 'KRES' MATOLD
  677. 'TYPI' (RV . 'MATINV')
  678. 'CLIM' DUCLIM
  679. 'SMBR' RESTOT
  680. 'IMPR' 0 ;
  681. 'FINSI' ;
  682.  
  683. RV . 'UN' = (RV . 'UN') '+' DELTAU ;
  684.  
  685. 'SI' (RV . 'CLIM') ;
  686. UNCELL = RV . 'UN' ;
  687. * 'PROLIM after the matrix inversion' ;
  688. RV . 'UN' = PROLIM RV ;
  689. * We redefine DELTAU to compute the error
  690. DELTAU = ((RV . 'UN') '-' UNCELL) '+' DELTAU ;
  691. 'FINSI' ;
  692. *
  693. ********* Boucle sur les operateurs implicites pour calculer RESIMP
  694. * et MATASS de RV . 'UN'
  695.  
  696. RESIMP = 'COPIER' CHPVID ;
  697. MATASS = 'KOPS' 'MULT' 0.0 MATVID ;
  698. 'REPETER' BLOP ('DIME' (RV . 'LISTOPER')) ;
  699. NOMPER = 'EXTRAIRE' &BLOP (RV . 'LISTOPER') ;
  700. NOTABLE = 'MOT' ('TEXTE' ('CHAINE' &BLOP NOMPER) ) ;
  701. 'SI' (RV . NOTABLE . 'IMPL') ;
  702. JACO RESIDU ALPHADT =
  703. ('TEXTE' NOMPER) (RV . NOTABLE) ;
  704. 'SI' (RV . NOTABLE . 'ANOM') ;
  705. RV . 'ANOM' = VRAI ;
  706. 'QUITTER' BLINT ;
  707. 'SINON' ;
  708. MATASS = MATASS 'ET' ('KOPS' 'MULT'
  709. -1.0D0 JACO ) ;
  710. RESIMP = RESIMP 'ET' RESIDU ;
  711. 'FINSI' ;
  712. 'FINSI' ;
  713. 'FIN' BLOP ;
  714. *
  715. ********* Test de convergence
  716. *
  717. ERRO = 'MAXIMUM' DELTAU 'ABS' 'AVEC' (RV . 'ERROMOTS') ;
  718. 'SI' (&blint 'EGA' 1) ;
  719. ERRO0 = ERRO ;
  720. 'FINSI' ;
  721. RV . 'RESULTATS' . 'ERRONLIN' = (RV . 'RESULTATS'
  722. . 'ERRONLIN') 'ET' ('PROG' ERRO) ;
  723. *
  724. ********* Impression
  725. *
  726. 'MESSAGE' ;
  727. 'MESSAGE' ('CHAINE' 'PASDETPS = ' (KTPS . 'NUPASDT')
  728. ' TPS = ' (KTPS . 'TPS') ' DT = ' ALPDT) ;
  729. 'MESSAGE' ('CHAINE' 'ITERIN = ' &BLINT) ;
  730. 'REPETER' BLERRO ('DIME' (RV . 'LISTCONS')) ;
  731. MOTERR = 'EXTRAIRE' (RV . 'LISTCONS') &BLERRO ;
  732. ERRBLE = 'MAXIMUM' DELTAU 'ABS' 'AVEC'
  733. ('MOTS' MOTERR) ;
  734. 'MESSAGE' (CHAIN 'ERREUR on ' MOTERR ' = ' ERRBLE) ;
  735. 'FIN' BLERRO ;
  736. 'SI' (('EXISTE' (RV . 'MATINV') 'CONVINV')) ;
  737. NLIT = ('DIME' (RV . 'MATINV' . 'CONVINV')) ;
  738. 'MESSAGE' ('CHAINE' 'Linear iterations = ' NLIT );
  739. RV . 'RESULTATS' . 'NITERLIN' = NLIT ;
  740. REIT = 'EXTR' (RV . 'MATINV' . 'CONVINV') NLIT ;
  741. 'MESSAGE' ('CHAINE' 'Linear residuum = ' REIT );
  742. RV . 'RESULTATS' . 'ERROLIN' = REIT ;
  743. 'FINSI' ;
  744. *
  745. ************ Criteres de sortie
  746. *
  747. 'SI' (&BLINT > (RV . 'NITMIIN')) ;
  748. 'SI' ('EXISTE' RV 'EPSREL') ;
  749. 'SI' (ERRO < ((RV . 'EPSREL') '*' ERRO0)) ;
  750. 'QUITTER' BLINT ;
  751. 'FINSI' ;
  752. 'FINSI' ;
  753. 'SI' (ERRO '<' (RV . 'EPSINT')) ;
  754. 'QUITTER' BLINT ;
  755. 'FINSI' ;
  756. 'FINSI' ;
  757. * 'SI' (ERRO > (1.0D3 '*' ERRO0)) ;
  758. * RV . 'ANOM' = VRAI ;
  759. * 'QUITTER' BLINT ;
  760. * 'FINSI' ;
  761. * 'SI' (&BLINT '>EG' (RV . 'NITMAIN')) ;
  762. * RV . 'ANOM' = VRAI ;
  763. * 'QUITTER' BLINT ;
  764. * 'FINSI' ;
  765. 'FIN' BLINT ;
  766. *************************************************************************
  767. **************** Fin boucle iterations internes *************************
  768. *************************************************************************
  769. ***********************************************
  770. ************* Fin cas implicite ***************
  771. ***********************************************
  772. 'FINSI' ;
  773. * ('SI' (RV . 'ANOM') ;)
  774. 'FINSI' ;
  775. *
  776. 'SI' (RV . 'ANOM') ;
  777. LOGQIE = FAUX ;
  778. NITEX = NITEX '-' 1 ;
  779. KTPS . 'NUPASDT' = KTPS . 'NUPASDT' '-' 1 ;
  780. KTPS . 'TPSP' = KTPS . 'TPS' ;
  781. RV . 'UN' = 'COPIER' RV . 'UNM' ;
  782. 'SI' ('EXISTE' RV 'UNM2') ;
  783. RV . 'UNM' = 'COPIER' (RV . 'UNM2') ;
  784. 'FINSI' ;
  785. 'SINON' ;
  786. *
  787. *** Mise a jour de la table RV . 'PASDETPS' à la fin du calcul
  788. *
  789. KTPS . 'TPSM' = KTPS . 'TPS' ;
  790. KTPS . 'TPS' = KTPS . 'TPSP' ;
  791. 'FINSI' ;
  792. *
  793. **** Dernier commande de BLEX
  794. *
  795. 'SI' LOGQIE ;
  796. 'QUITTER' BLEX ;
  797. 'FINSI' ;
  798.  
  799. 'FIN' BLEX ;
  800.  
  801. 'FINPROC' ;
  802.  
  803. *****************************************************
  804. *****************************************************
  805. ** FIN PROCEDURE EXEX **
  806. *****************************************************
  807. *****************************************************
  808.  
  809. *****$$$$ PKON
  810.  
  811. *****************************************************
  812. *****************************************************
  813. ** PROCÉDURE PKON **
  814. *****************************************************
  815. *****************************************************
  816. * Il faut définir:
  817. *
  818. * *KKONV . 'EQEX' = table générale, qui contient toutes les
  819. * informations sur le calcul qu'on va faire.
  820. * Dans ce table, on ne prend que:
  821. * - la table (KKONV . 'EQEX' . 'PASDETPS')
  822. * - les inconnues du problème
  823. * (KKONV . 'EQEX' . 'UN')
  824. * - le maillage fantome
  825. * (KKONV . 'EQEX' . 'MAIFAN')
  826. * - les vitesses de cut-off pour le bas Mach
  827. * (KKONV . 'EQEX' . 'CO1')
  828. * (KKONV . 'EQEX' . 'CO2')
  829. *
  830. * *KKONV . 'GAZ' = le modelé de gaz qu'on considère
  831. * - si KKONV . 'GAZ' = 'PERFMONO', alors
  832. * on considère un gaz parfait mono-espèce
  833. * polytropique
  834. *
  835. * *KKONV . 'MODELE' = objet modele
  836. *
  837. * *KKONV . 'LISTCONS' = les noms des variables conservatives, i.e.
  838. * densité, q.d.m., energie totale par unité de
  839. * volume
  840. *
  841. * *KKONV . 'IMPL' = calcul implicite ou non ?
  842. *
  843. * *KKONV . 'METHODE' = méthode pour le calcul du flux convectif
  844. *
  845. * *KKONV . 'TYPEJACO' = 'VLH'
  846. * 'AUSMPLUS'
  847. * 'AUSMPLM'
  848. * (à donner si (KKONV . 'IMPL'))
  849. *
  850. * *KKONV . 'ORDREESP' = ordre en espace (1 ou 2) ;
  851. *
  852. * *KKONV . 'GRADRN' coeff. pour calculer le gradient de la densité
  853. * *KKONV . 'GRADVN' coeff. pour calculer le gradient de la vitesse
  854. * *KKONV . 'GRADPN' coeff. pour calculer le gradient de la pression
  855. * *KKONV . 'VLIM' vitesses au bord imposées
  856. * (à donner si (KKONV . 'ORDREESP') = 2)
  857. *
  858. * *KKONV . 'LIMITEUR' = limiteur utilisé
  859. * (à donner si (KKONV . 'ORDREESP') = 2)
  860. *
  861. * *KKONV . 'NFROZLIM' = entier
  862. * On gele les limiteurs quand
  863. * RV . 'PASDETPS' . 'NUPASDT' = KKONV . 'NFROZLIM'
  864. * On le met dedans
  865. * *KKONV . 'FROZALR'
  866. * *KKONV . 'FROZALP'
  867. * *KKONV . 'FROZALV'
  868. *
  869. * *KKONV . 'ALPHA' = coefficient de securité pour le quel on
  870. * multiplie le pas de tps determiné par un
  871. * condition de type CFL.
  872. * Il peut etre:
  873. * - un flottant
  874. * - une mot que veut 'INF'
  875. *
  876. * *KKON . 'FACELIM' = maillage de centres de face ou on ne calcule pas
  877. * le flux convectif et le jacobien
  878. *
  879. * *KKON . 'CLIM' = LOGIQUE
  880. * si vrai on doit definir une procedure PKOCLI
  881. *
  882. * *KKON . 'DT' = output. Donne les pas de temps plus petit
  883. * (r_elem/(u+c))
  884. *
  885. 'DEBPROC' PKON ;
  886. 'ARGUMENT' KKONV * TABLE ;
  887. *
  888. CHPVID MATVID = 'KOPS' 'MATRIK' ;
  889. *
  890. METO = KKONV . 'METHODE' ;
  891. *
  892. RV = KKONV . 'EQEX' ;
  893. *
  894. LOGIMP = KKONV . 'IMPL';
  895. LOGEXP = 'NON' LOGIMP ;
  896. *
  897. ORDESP = KKONV . 'ORDREESP' ;
  898. *
  899. 'SI' (('NEG' (KKONV . 'ALPHA') 'INF') 'ET'
  900. ('NEG' ('TYPE' (KKONV . 'ALPHA')) FLOTTANT)) ;
  901. 'MESSAGE' 'PKON . ALPHA = ???' ;
  902. 'ERREUR' 21 ;
  903. 'FINSI' ;
  904. *
  905. UN = 'REDU' (RV . 'UN') ('DOMA' (KKONV . 'MODELE') 'CENTRE') ;
  906. *
  907. 'SI' ('NEG' (KKONV . 'GAZ') 'PERFMONO') ;
  908. *
  909. ******** EULER, monoespece, "calorically perfect" (cv = constant)
  910. *
  911. 'MESSAGE' ;
  912. 'MESSAGE' 'PKON . GAZ = ???' ;
  913. 'ERREUR' 21 ;
  914. 'FINSI' ;
  915. *
  916. **** Type de jacobien (Bas Mach ?)
  917. *
  918. 'SI' LOGIMP ;
  919. ITJACO = 0 ;
  920. 'SI' (('EGA' (KKONV . 'TYPEJACO') 'AUSMPLM') 'OU'
  921. ('EGA' (KKONV . 'TYPEJACO') 'RUSANOLM') 'OU'
  922. ('EGA' (KKONV . 'TYPEJACO') 'ROELM') 'OU'
  923. ('EGA' (KKONV . 'TYPEJACO') 'HLLCLM')) ;
  924. ITJACO = -1 ;
  925. 'FINSI' ;
  926. 'FINSI' ;
  927. *
  928. ITMETO = 0 ;
  929. 'SI' (('EGA' METO 'AUSMPLM') 'OU'
  930. ('EGA' METO 'RUSANOLM') 'OU'
  931. ('EGA' METO 'ROELM') 'OU'
  932. ('EGA' METO 'HLLCLM')) ;
  933. ITMETO = -1 ;
  934. 'FINSI' ;
  935. *
  936. ***** Les variables conservatives
  937. *
  938. MOT1 = 'EXTRAIRE' (KKONV . 'LISTCONS') 1 ;
  939. 'SI' ('EGA' ('VALE' 'DIME') 2) ;
  940. NOMMOM = 'EXTRAIRE' (KKONV . 'LISTCONS')
  941. ('LECT' 2 3 ) ;
  942. NOMVEL = 'MOTS' 'UX' 'UY' ;
  943. MOT2 = 'EXTRAIRE' (KKONV . 'LISTCONS') 4 ;
  944. NOMGP = 'MOTS' 'P1DX' 'P1DY' ;
  945. 'SINON' ;
  946. NOMMOM = 'EXTRAIRE' (KKONV . 'LISTCONS')
  947. ('LECT' 2 3 4) ;
  948. NOMVEL = 'MOTS' 'UX' 'UY' 'UZ' ;
  949. MOT2 = 'EXTRAIRE' (KKONV . 'LISTCONS') 5 ;
  950. NOMGP = 'MOTS' 'P1DX' 'P1DY' 'P1DZ' ;
  951. 'FINSI' ;
  952. RN = 'EXCO' MOT1 UN 'SCAL' ;
  953. GN = 'EXCO' NOMMOM UN NOMVEL ;
  954. RETN = 'EXCO' MOT2 UN 'SCAL' ;
  955. *
  956. ***** On calcule les variables primitive
  957. *
  958. GAMN = (RV . 'PGAZ' . 'GAMN') ;
  959. VN PN = 'PRIM' 'PERFMONO' RN GN RETN GAMN ;
  960. * VN PN = PPRIM RN GN RETN GAMN ;
  961. * 'SI' ((('MINIMUM' PN) < 0) 'OU' (('MINIMUM' RN) < 0)) ;
  962. * 'MESSAGE' 'Negative density or pressure' ;
  963. * KKONV . 'ANOM' = VRAI ;
  964. * RN = ('ABS' RN) '+' (('MAXIMUM' RN 'ABS') '*' 1.001) ;
  965. * PN = ('ABS' PN) '+' (('MAXIMUM' PN 'ABS') '*' 1.001) ;
  966. * 'FINSI' ;
  967. *
  968. **** Conditions aux limits ???
  969. *
  970. 'SI' (KKONV . 'CLIM') ;
  971.  
  972. * TABLIM = 'TABLE' definie dans le programme principal ;
  973.  
  974. KKONV . 'TABLIM' . 'RN' = RN ;
  975. KKONV . 'TABLIM' . 'VN' = VN ;
  976. KKONV . 'TABLIM' . 'PN' = PN ;
  977. KKONV . 'TABLIM' . 'GAMN' = GAMN ;
  978.  
  979. CHPLIM RESLIM JACLIM = PKOLIM (KKONV . 'TABLIM') ;
  980. MAILLIM = ('EXTRAIRE' CHPLIM 'MAILLAGE') 'ET' (KKONV . 'FACELIM') ;
  981. 'SINON' ;
  982. MAILLIM = KKONV . 'FACELIM' ;
  983. RESLIM JACLIM = 'KOPS' 'MATRIK' ;
  984. CHPLIM = 'COPIER' RESLIM ;
  985. 'FINSI' ;
  986. MAILLIM = 'CHANGER' 'POI1' MAILLIM ;
  987. *
  988. **** La gravite
  989. *
  990. *
  991. RESGRA = 'FIMP' 'VF' 'GRAVMONO' 'RESI' (KKONV . 'LISTCONS')
  992. RN GN (KKONV . 'GRAVITE') ;
  993. *
  994. JACGRA = 'FIMP' 'VF' 'GRAVMONO' 'JACOCONS' (KKONV . 'LISTCONS')
  995. RN GN (KKONV . 'GRAVITE') ;
  996. *
  997. * Fin contribution gravité
  998. *
  999.  
  1000. *
  1001. ***** On calcule les variables aux faces
  1002. *
  1003. ORDTPS = 1 ;
  1004.  
  1005. *
  1006. 'SI' (ORDESP 'EGA' 1) ;
  1007. *
  1008. ********* Ordre 1 en espace
  1009. *
  1010. ROF VITF PF GAMF = 'PRET' 'PERFMONO' 1 ORDTPS
  1011. (KKONV . 'MODELE') RN VN PN GAMN ;
  1012. 'SINON' ;
  1013. *
  1014. ********* Ordre 2 en espace
  1015. *
  1016. 'SI' (KKONV . 'CLIM') ;
  1017. GRADV ALV = 'PENT' (KKONV . 'MODELE') 'CENTRE' 'EULEVECT'
  1018. (KKONV . 'LIMITEUR') NOMVEL VN 'CLIM'
  1019. ((KKONV . 'VLIM') '+' ('EXCO' NOMVEL CHPLIM))
  1020. 'GRADGEO' (KKONV . 'GRADVN') ;
  1021. GRADR ALR = 'PENT' (KKONV . 'MODELE') 'CENTRE' 'EULESCAL'
  1022. (KKONV . 'LIMITEUR') ('MOTS' 'SCAL') RN
  1023. 'CLIM' ('EXCO' 'RN' CHPLIM) 'GRADGEO' (KKONV . 'GRADRN') ;
  1024. *
  1025. GRADP ALP = 'PENT' (KKONV . 'MODELE') 'CENTRE' 'EULESCAL'
  1026. (KKONV . 'LIMITEUR') ('MOTS' 'SCAL') PN
  1027. 'CLIM' ('EXCO' 'PN' CHPLIM) 'GRADGEO' (KKONV . 'GRADPN') ;
  1028. *
  1029. 'SINON' ;
  1030. GRADV ALV = 'PENT' (KKONV . 'MODELE') 'CENTRE' 'EULEVECT'
  1031. (KKONV . 'LIMITEUR') NOMVEL VN 'CLIM'
  1032. (KKONV . 'VLIM')
  1033. 'GRADGEO' (KKONV . 'GRADVN') ;
  1034. GRADR ALR = 'PENT' (KKONV . 'MODELE') 'CENTRE' 'EULESCAL'
  1035. (KKONV . 'LIMITEUR') ('MOTS' 'SCAL') RN
  1036. 'GRADGEO' (KKONV . 'GRADRN') ;
  1037. *
  1038. GRADP ALP = 'PENT' (KKONV . 'MODELE') 'CENTRE' 'EULESCAL'
  1039. (KKONV . 'LIMITEUR') ('MOTS' 'SCAL') PN
  1040. 'GRADGEO' (KKONV . 'GRADPN') ;
  1041. 'FINSI' ;
  1042. *
  1043. ****** Limiters = 0 on ghostcells
  1044. *
  1045. 'SI' (('EXISTE' RV 'MAIFAN')) ;
  1046. ALRLEV = ('REDU' ALR (RV . 'MAIFAN')) ;
  1047. ALPLEV = ('REDU' ALP (RV . 'MAIFAN')) ;
  1048. ALVLEV = ('REDU' ALV (RV . 'MAIFAN')) ;
  1049. CELL = ALR ;
  1050. ALR = ALR '-' ALRLEV ;
  1051. 'DETR' CELL ;
  1052. CELL = ALP ;
  1053. ALP = ALP '-' ALPLEV ;
  1054. 'DETR' CELL ;
  1055. CELL = ALV ;
  1056. ALV = ALV '-' ALVLEV ;
  1057. 'DETR' CELL ;
  1058. 'FINSI' ;
  1059. *
  1060. ****** Frozen Limiters
  1061. *
  1062. * External iterations
  1063. *
  1064. 'SI' ('EXISTE' KKONV 'NFROZLIM') ;
  1065. ITEREX = RV . 'PASDETPS' . 'NUPASDT' ;
  1066. 'SI' (ITEREX 'EGA' (KKONV . 'NFROZLIM')) ;
  1067. 'MESSAGE' ;
  1068. 'MESSAGE' 'External iterations' ;
  1069. 'MESSAGE' 'We froze the limiters' ;
  1070. KKONV . 'FROZALR' = 'COPIER' ALR ;
  1071. KKONV . 'FROZALP' = 'COPIER' ALP ;
  1072. KKONV . 'FROZALV' = 'COPIER' ALV ;
  1073. 'SINON' ;
  1074. 'SI' (ITEREX > (KKONV . 'NFROZLIM')) ;
  1075. *
  1076. * Min
  1077. *
  1078. DAR = (ALR '-' (KKONV . 'FROZALR')) 'ABS' ;
  1079. DAP = (ALP '-' (KKONV . 'FROZALP')) 'ABS' ;
  1080. DAV = (ALV '-' (KKONV . 'FROZALV')) 'ABS' ;
  1081. ALR = (ALR '+' (KKONV . 'FROZALR')) '-' DAR ;
  1082. ALP = (ALP '+' (KKONV . 'FROZALP')) '-' DAP ;
  1083. ALV = (ALV '+' (KKONV . 'FROZALV')) '-' DAV ;
  1084. ALR = ALR '/' 2.0 ;
  1085. ALV = ALV '/' 2.0 ;
  1086. ALP = ALP '/' 2.0 ;
  1087. KKONV . 'FROZALR' = 'COPIER' ALR ;
  1088. KKONV . 'FROZALP' = 'COPIER' ALP ;
  1089. KKONV . 'FROZALV' = 'COPIER' ALV ;
  1090. 'FINSI' ;
  1091. 'FINSI' ;
  1092. 'FINSI' ;
  1093. *
  1094. * Internal iterations
  1095. *
  1096. 'SI' ('EXISTE' KKONV 'NFROZLII') ;
  1097. ITERIN = RV . 'RESULTATS' . 'ITERIN' ;
  1098. 'SI' (ITERIN 'EGA' (KKONV . 'NFROZLII')) ;
  1099. 'MESSAGE' ;
  1100. 'MESSAGE' 'Internal iterations' ;
  1101. 'MESSAGE' 'We froze the limiters' ;
  1102. KKONV . 'FROZALR' = 'COPIER' ALR ;
  1103. KKONV . 'FROZALP' = 'COPIER' ALP ;
  1104. KKONV . 'FROZALV' = 'COPIER' ALV ;
  1105. 'SINON' ;
  1106. 'SI' (ITERIN > (KKONV . 'NFROZLII')) ;
  1107. DAR = (ALR '-' (KKONV . 'FROZALR')) 'ABS' ;
  1108. DAP = (ALP '-' (KKONV . 'FROZALP')) 'ABS' ;
  1109. DAV = (ALV '-' (KKONV . 'FROZALV')) 'ABS' ;
  1110. ALR = (ALR '+' (KKONV . 'FROZALR')) '-' DAR ;
  1111. ALP = (ALP '+' (KKONV . 'FROZALP')) '-' DAP ;
  1112. ALV = (ALV '+' (KKONV . 'FROZALV')) '-' DAV ;
  1113. ALR = ALR '/' 2.0 ;
  1114. ALV = ALV '/' 2.0 ;
  1115. ALP = ALP '/' 2.0 ;
  1116. KKONV . 'FROZALR' = 'COPIER' ALR ;
  1117. KKONV . 'FROZALP' = 'COPIER' ALP ;
  1118. KKONV . 'FROZALV' = 'COPIER' ALV ;
  1119. 'FINSI' ;
  1120. 'FINSI' ;
  1121. 'FINSI' ;
  1122. *
  1123.  
  1124. *
  1125. ********* Ordre 1 en temps
  1126. *
  1127. ROF VITF PF GAMF = 'PRET' 'PERFMONO' ORDESP ORDTPS
  1128. (KKONV . 'MODELE')
  1129. RN GRADR ALR
  1130. VN GRADV ALV
  1131. PN GRADP ALP
  1132. GAMN ;
  1133. 'FINSI' ;
  1134.  
  1135. *
  1136. 'SI' (ITMETO 'EGA' (-1)) ;
  1137. RESIDU DELTAT = 'KONV' 'VF' 'PERFMONO' 'RESI' METO
  1138. (KKONV . 'LISTCONS') (KKONV . 'MODELE')
  1139. ROF VITF PF GAMF
  1140. MAILLIM (RV . 'CO1')
  1141. (RV . 'CO2') ;
  1142. 'SINON' ;
  1143. RESIDU DELTAT = 'KONV' 'VF' 'PERFMONO' 'RESI' METO
  1144. (KKONV . 'LISTCONS') (KKONV . 'MODELE')
  1145. ROF VITF PF GAMF
  1146. MAILLIM ;
  1147. 'FINSI' ;
  1148. *
  1149. 'SI' ('EGA' ('TYPE' (KKONV . 'ALPHA')) FLOTTANT) ;
  1150. ALPDT = 'PROG' ((KKONV . 'ALPHA') '*' DELTAT) ;
  1151. 'SINON' ;
  1152. ALPDT = 'PROG' ;
  1153. 'FINSI' ;
  1154.  
  1155. KKONV . 'DT' = DELTAT ;
  1156.  
  1157. *
  1158. **** Low Mach
  1159. *
  1160. 'SI' (RV . 'BASMACH') ;
  1161. MATBM = 'KONV' 'VF' 'PERFMONO' 'GAMMCONS' (KKONV . 'LISTCONS')
  1162. ('DOMA' (KKONV . 'MODELE') 'CENTRE')
  1163. ('DOMA' (KKONV . 'MODELE') 'DIAMIN')
  1164. RN VN PN GAMN (RV . 'CO1')
  1165. (RV . 'CO2') ;
  1166. RV . 'GAMSDTAU' = 'KOPS' 'MULT'
  1167. (1. '/' (KKONV . 'CFLDTAU')) MATBM ;
  1168. 'FINSI' ;
  1169. *
  1170. 'SI' LOGIMP ;
  1171. 'SI' (ITJACO 'EGA' 0) ;
  1172. JACO = 'KONV' 'VF' 'PERFMONO' 'JACOCONS' (KKONV . 'MODELE')
  1173. (KKONV . 'LISTCONS')
  1174. MAILLIM (KKONV . 'TYPEJACO')
  1175. RN VN PN GAMN ;
  1176. 'SINON' ;
  1177. JACO = 'KONV' 'VF' 'PERFMONO' 'JACOCONS' (KKONV . 'MODELE')
  1178. (KKONV . 'LISTCONS')
  1179. MAILLIM (KKONV . 'TYPEJACO')
  1180. RN VN PN GAMN (RV . 'CO1')
  1181. (RV . 'CO2') ;
  1182. 'FINSI' ;
  1183. 'RESPRO' (JACO 'ET' JACLIM 'ET' JACGRA)
  1184. (RESIDU '+' RESLIM '+' RESGRA)
  1185. ALPDT ;
  1186. 'SINON' ;
  1187. 'RESPRO' (RESIDU '+' RESLIM '+' RESGRA) ALPDT ;
  1188. 'FINSI' ;
  1189. *
  1190. **** On detrui les choses qui ne servent plus
  1191. *
  1192. 'DETR' UN ;
  1193. 'OUBL' UN ;
  1194. 'DETR' RN ;
  1195. 'DETR' GN ;
  1196. 'DETR' RETN ;
  1197. 'DETR' VN ;
  1198. 'DETR' PN ;
  1199. 'OUBL' RN ;
  1200. 'OUBL' GN ;
  1201. 'OUBL' RETN ;
  1202. 'OUBL' VN ;
  1203. 'OUBL' PN ;
  1204. *
  1205. **** Les MCHAML faces
  1206. *
  1207. 'DETR' ROF ;
  1208. 'DETR' VITF ;
  1209. 'DETR' PF ;
  1210. 'DETR' GAMF ;
  1211. 'OUBL' ROF ;
  1212. 'OUBL' VITF ;
  1213. 'OUBL' PF ;
  1214. 'OUBL' GAMF ;
  1215. *
  1216. **** Les pentes et les limiteurs
  1217. *
  1218. 'SI' (ORDESP 'EGA' 2);
  1219. *
  1220. 'DETR' GRADR ;
  1221. 'DETR' GRADP ;
  1222. 'DETR' GRADV ;
  1223. 'DETR' ALR ;
  1224. 'DETR' ALP ;
  1225. 'DETR' ALV;
  1226. *
  1227. 'OUBL' GRADR ;
  1228. 'OUBL' GRADP ;
  1229. 'OUBL' GRADV ;
  1230. 'OUBL' ALR ;
  1231. 'OUBL' ALP ;
  1232. 'OUBL' ALV;
  1233. *
  1234. 'FINSI' ;
  1235.  
  1236. 'FINPROC' ;
  1237. *****************************************************
  1238. *****************************************************
  1239. ** FIN PROCEDURE PKON **
  1240. *****************************************************
  1241. *****************************************************
  1242.  
  1243.  
  1244.  
  1245.  
  1246. *********************************************************************
  1247. **** Procedure PKOLIM ***********************************************
  1248. *********************************************************************
  1249.  
  1250. 'DEBPROC' PKOLIM ;
  1251. 'ARGUMENT' TABLIM*'TABLE' ;
  1252.  
  1253. LISTP = 'MOTS' 'RN' 'UX' 'UY' 'PN' ;
  1254.  
  1255. RCHLIM1 RCHRES1 = 'KONV' 'VF' 'PERFMONO' 'CLIM' 'RESI'
  1256. MDOMINT MLIGG LISTCONS LISTP
  1257. (TABLIM . 'RN') (TABLIM . 'VN') (TABLIM . 'PN')
  1258. (TABLIM . 'GAMN') (TABLIM . 'CHINSS') 'INSS' ;
  1259.  
  1260. RJACO1 = 'KONV' 'VF' 'PERFMONO' 'CLIM' 'JACOCONS'
  1261. MDOMINT MLIGG LISTCONS LISTP
  1262. (TABLIM . 'RN') (TABLIM . 'VN') (TABLIM . 'PN')
  1263. (TABLIM . 'GAMN') (TABLIM . 'CHINSS') 'INSS' ;
  1264.  
  1265. RCHLIM2 RCHRES2 = 'KONV' 'VF' 'PERFMONO' 'CLIM' 'RESI'
  1266. MDOMINT MLIGD LISTCONS LISTP
  1267. (TABLIM . 'RN') (TABLIM . 'VN') (TABLIM . 'PN')
  1268. (TABLIM . 'GAMN') (TABLIM . 'CHOUTSS') 'OUTSS' ;
  1269.  
  1270. RJACO2 = 'KONV' 'VF' 'PERFMONO' 'CLIM' 'JACOCONS'
  1271. MDOMINT MLIGD LISTCONS LISTP
  1272. (TABLIM . 'RN') (TABLIM . 'VN') (TABLIM . 'PN')
  1273. (TABLIM . 'GAMN') (TABLIM . 'CHOUTSS') 'OUTSS' ;
  1274.  
  1275.  
  1276. CHPLIM = RCHLIM1 '+' RCHLIM2 ;
  1277. RESLIM = RCHRES1 '+' RCHRES2 ;
  1278. JACLIM = RJACO1 'ET' RJACO2 ;
  1279.  
  1280. 'RESPRO' CHPLIM RESLIM JACLIM ;
  1281. 'FINPROC' ;
  1282.  
  1283. *********************************************************************
  1284. **** Procedure CALC *************************************************
  1285. *********************************************************************
  1286. *
  1287. * Personal procedure
  1288. *
  1289. 'DEBP' CALC ;
  1290. 'ARGU' RVX*'TABLE' ;
  1291. *
  1292. RV = RVX . 'EQEX' ;
  1293. UN = RV . 'UN' ;
  1294. MCALC = RVX . 'MODELE' ;
  1295. *
  1296. * During the external iteration (except the first; in which
  1297. * UNM = UN of the previous step )
  1298. *
  1299. 'SI' ('NEG' 0 (RV . 'RESULTATS' . 'ITERIN')) ;
  1300.  
  1301. RN = 'REDU' ('DOMA' MCALC 'CENTRE')
  1302. ('EXCO' UN NOMDEN ('MOTS' 'SCAL')) ;
  1303. GN = 'REDU' ('DOMA' MCALC 'CENTRE')
  1304. ('EXCO' NOMMOM UN NOMVEL) ;
  1305. RETN = 'REDU' ('DOMA' MCALC 'CENTRE')
  1306. ('EXCO' NOMRET UN ('MOTS' 'SCAL')) ;
  1307. VN PN = 'PRIM' 'PERFMONO' RN GN RETN (RV . 'PGAZ' . 'GAMN') ;
  1308. *
  1309. 'SI' ('EGA' (RVX . 'COMPT') 0) ;
  1310. RVX . 'IT' = 'PROG' ;
  1311. RVX . 'ER' = 'PROG' ;
  1312. 'SINON' ;
  1313. CHPVOL = 'DOMA' MCALC 'VOLUME' ;
  1314. VOLTOT = 'XTY' CHPVOL ('MANUEL' CHPO
  1315. ('DOMA' MCALC 'CENTRE') 1 'SCAL' 1.) ('MOTS' 'SCAL')
  1316. ('MOTS' 'SCAL');
  1317. ERRO = 'ABS' (PN '-' (RVX . 'PN0')) ;
  1318. ERRO = 'XTY' ERRO CHPVOL ('MOTS' 'SCAL')
  1319. ('MOTS' 'SCAL') ;
  1320. ERRO = ERRO '/' VOLTOT ;
  1321. RVX . 'IT' = (RVX . 'IT') 'ET' ('PROG'
  1322. (RVX . 'COMPT')) ;
  1323. RVX . 'ER' = (RVX . 'ER') 'ET' ('PROG' ERRO) ;
  1324. 'FINSI' ;
  1325. RVX . 'PN0' = PN ;
  1326. RVX . 'COMPT' = (RVX . 'COMPT') '+' 1 ;
  1327. 'FINSI' ;
  1328. *
  1329. * We change the cut-off during the internal iterations
  1330. *
  1331. 'SI' FAUX ;
  1332. 'SI' ((RV . 'RESULTATS' . 'ITERIN') > 0) ;
  1333. CUMAX = RV . 'CO1MAX' ;
  1334. CUMIN = RV . 'CO1MIN' ;
  1335. DCU = (CUMIN '-' CUMAX) '/' 5 ;
  1336. CU = CUMAX '+' (DCU * (RV . 'RESULTATS' . 'ITERIN')) ;
  1337. * Take the max between CU and CUMIN
  1338. A = CUMIN '+' CU ;
  1339. B = 'ABS' (CUMIN '-' CU) ;
  1340. CU = 0.5 '*' (A '+' B) ;
  1341. *
  1342. RV . 'CO1' = CU ;
  1343. RV . 'CO2' = CU ;
  1344. 'FINSI' ;
  1345. 'FINSI' ;
  1346. *
  1347. IALPDT = 'PROG' ;
  1348. IRESU IJACO ='KOPS' 'MATRIK' ;
  1349. *
  1350. 'MENAGE' ;
  1351. *
  1352. 'SI' (RVX . 'IMPL') ;
  1353. 'RESPRO' IJACO IRESU IALPDT ;
  1354. 'SINON' ;
  1355. 'RESPRO' IRESU IALPDT ;
  1356. 'FINSI' ;
  1357. *
  1358. 'FINP' ;
  1359. *
  1360. ************************************************************************
  1361. ************************************************************************
  1362. ***************** FIN PARTIE PROCEDURES ********************************
  1363. ************************************************************************
  1364. ************************************************************************
  1365. *
  1366.  
  1367. TYEL = 'QUA4' ;
  1368.  
  1369. 'OPTION' 'DIME' 2 'ELEM' TYEL 'ISOV' 'SULI'
  1370. 'ECHO' 1 'TRAC' 'X' ;
  1371.  
  1372.  
  1373. GRAPH = VRAI ;
  1374. GRAPH = FAUX ;
  1375.  
  1376. ******************
  1377. ******************
  1378. ******************
  1379. **** MAILLAGE ****
  1380. ******************
  1381. ******************
  1382. ******************
  1383. ******************
  1384. *
  1385. *
  1386. RAF = 16 ;
  1387.  
  1388. NX1 = 1 '*' RAF ;
  1389. NX2 = 1 '*' RAF ;
  1390. NX3 = 4 '*' RAF ;
  1391. NY = 2 '*' RAF ;
  1392. DY = 2.0 '/' NY ;
  1393.  
  1394. H1 = 0.268 ;
  1395.  
  1396. A1 = (1. '-' DY) 0.0 ;
  1397. A2 = 1.0 0.0 ;
  1398. A3 = 2.0 0.0 ;
  1399. A4 = 3.0 H1 ;
  1400. A5 = 7.0 H1 ;
  1401. A6 = (7.0 '+' DY) H1 ;
  1402.  
  1403. B1 = (1.0 '-' DY) 2.0 ;
  1404. B2 = 1.0 2.0 ;
  1405. B3 = 2.0 2.0 ;
  1406. B4 = 3.0 2.0 ;
  1407. B5 = 7.0 2.0 ;
  1408. B6 = (7.0 '+' DY) 2.0 ;
  1409.  
  1410. BAS1 = A2 'DROI' NX1 A3 ;
  1411. BAS2 = A3 'DROI' NX2 A4 ;
  1412. BAS3 = A4 'DROI' NX3 A5 ;
  1413. HAU3 = B5 'DROI' NX3 B4 ;
  1414. HAU2 = B4 'DROI' NX2 B3 ;
  1415. HAU1 = B3 'DROI' NX1 B2 ;
  1416.  
  1417. COTEG = B2 'DROI' NY A2 ;
  1418. COTED = A5 'DROI' NY B5 ;
  1419.  
  1420. DOMINT = 'DALLER' (BAS1 ET BAS2 ET BAS3) COTED
  1421. (HAU3 ET HAU2 ET HAU1) COTEG 'PLAN' ;
  1422.  
  1423. LIGG = COTEG ;
  1424. LIGD = COTED ;
  1425.  
  1426. MDOMINT = 'MODELISER' DOMINT 'EULER' ;
  1427. MLIGG = 'MODELISER' LIGG 'EULER' ;
  1428. MLIGD = 'MODELISER' LIGD 'EULER' ;
  1429.  
  1430. *
  1431. **** Creation of DOMAINE tables via the MODEL object
  1432. *
  1433.  
  1434. TDOMINT = 'DOMA' MDOMINT 'VF' ;
  1435. TLIGG = 'DOMA' MLIGG 'VF' ;
  1436. TLIGD = 'DOMA' MLIGD 'VF' ;
  1437.  
  1438. QDOMINT = TDOMINT . 'QUAF' ;
  1439. QLIGD = TLIGD . 'QUAF' ;
  1440. QLIGG = TLIGG . 'QUAF' ;
  1441.  
  1442. 'ELIMINATION' QDOMINT (DY '/' 100.) QLIGG ;
  1443. 'ELIMINATION' QDOMINT (DY '/' 100.) QLIGD ;
  1444.  
  1445. 'SI' GRAPH ;
  1446. 'TRACER' (DOMINT 'ET' (LIGG 'COULEUR' 'ROUG')
  1447. 'ET' (LIGD 'COULEUR' 'BLEU'))
  1448. 'TITRE' 'Domaine total' ;
  1449. 'FINSI' ;
  1450.  
  1451. 'SI' FAUX ;
  1452. 'OPTION' 'SAUVER' ('CHAINE' './D_sauv/'
  1453. 'mail' RAF '.sauv') ;
  1454. 'SAUV' ;
  1455. 'FIN' ;
  1456. 'FINSI' ;
  1457. *
  1458. ***************************************************************
  1459. ***************************************************************
  1460. ***************************************************************
  1461. ************** Initial conditions *****************************
  1462. ***************************************************************
  1463. ***************************************************************
  1464. ***************************************************************
  1465. *
  1466. 'SI' FAUX ;
  1467. RAF = 16 ;
  1468. FICHER = './D_sauv/' ;
  1469. 'OPTION' 'RESTITUER' ('CHAINE' FICHER 'mail' RAF '.sauv') ;
  1470. 'RESTITUER' ;
  1471. 'FINSI' ;
  1472. *
  1473. * Names of conserved variables and others
  1474. *
  1475. NOMDEN = 'MOTS' 'RN' ;
  1476. NOMMOM = 'MOTS' 'RUX' 'RUY' ;
  1477. NOMRET = 'MOTS' 'RETN' ;
  1478. NOMVEL = 'MOTS' 'UX' 'UY' ;
  1479. * NOMPRE = 'MOTS' 'NOMPRE' ;
  1480. LISTCONS = NOMDEN 'ET' NOMMOM 'ET' NOMRET ;
  1481. *
  1482.  
  1483. gamscal = 1.4 ;
  1484. GAMN = 'MANUEL' 'CHPO' (TDOMINT . 'CENTRE') 1 'SCAL' gamscal;
  1485.  
  1486. Minf = 2.0D0 ;
  1487. alpha = 0.D0 ;
  1488. RAIR = 288. ;
  1489.  
  1490. 'SI' ('NEG' ALPHA 0.0) ;
  1491. 'MESSAGE' 'Attention aux C.L.' ;
  1492. 'ERREUR' 21 ;
  1493. 'FINSI' ;
  1494.  
  1495. rhoinf = 1.0D0 ;
  1496. rhouinf = 'COS' alpha ;
  1497. rhovinf = 'SIN' alpha ;
  1498. rhoEtinf = 2.0D0 '+' (gamscal '*' Minf '*' Minf
  1499. '*' (gamscal '-' 1.0D0)) ;
  1500. rhoEtinf = rhoEtinf '/' (2.D0 '*' gamscal '*' Minf
  1501. '*' Minf '*' (gamscal '-' 1.0D0)) ;
  1502.  
  1503. RN0 = 'MANUEL' 'CHPO' (TDOMINT . 'CENTRE') 1 'SCAL' rhoinf ;
  1504. GN0 = 'MANUEL' 'CHPO' (TDOMINT . 'CENTRE') 2 'UX' rhouinf
  1505. 'UY' rhovinf ;
  1506. RETN0 = 'MANUEL' 'CHPO' (TDOMINT . 'CENTRE') 1 'SCAL' rhoEtinf ;
  1507.  
  1508. UNCONS = ('NOMC' 'RN' RN0 'NATU' 'DISCRET') 'ET' ('NOMC'
  1509. ('MOTS' 'UX' 'UY') GN0 ('MOTS' 'RUX' 'RUY') 'NATU' 'DISCRET') 'ET'
  1510. ('NOMC' 'RETN' RETN0 'NATU' 'DISCRET') ;
  1511.  
  1512. VN0 PN0 = 'PRIM' 'PERFMONO' RN0 GN0 RETN0 GAMN ;
  1513. pinf = 'MAXIMUM' PN0 ;
  1514.  
  1515. VN2 = 'PSCAL' VN0 VN0 ('MOTS' 'UX' 'UY') ('MOTS' 'UX' 'UY') ;
  1516. C2 = GAMN '*' ( PN0 '/' RN0) ;
  1517. CN0 = C2 '**' 0.5 ;
  1518.  
  1519. MACH2 = VN2 '/' C2;
  1520. MACHN0 = MACH2 '**' 0.5;
  1521. TN0 = PN0 '/' (Rair * RN0) ;
  1522.  
  1523. *
  1524. **** Plot of IC
  1525. *
  1526.  
  1527. 'SI' GRAPH ;
  1528.  
  1529. CHM_RN = 'KCHA' MDOMINT 'CHAM' RN0 ;
  1530. CHM_PN = 'KCHA' MDOMINT 'CHAM' PN0 ;
  1531. CHM_VN = 'KCHA' MDOMINT 'CHAM' VN0 ;
  1532.  
  1533. 'TRACER' CHM_RN MDOMINT
  1534. 'TITR' ('CHAINE' 'RN at t=' 0.0);
  1535. 'TRACER' CHM_PN MDOMINT
  1536. 'TITR' ('CHAINE' 'PN at t=' 0.0);
  1537. 'TRACER' CHM_VN MDOMINT
  1538. 'TITR' ('CHAINE' 'MACHN at t=' 0.0);
  1539.  
  1540. 'FINSI' ;
  1541.  
  1542. 'SI' FAUX ;
  1543. *
  1544. 'OPTION' 'SAUVER'
  1545. ('CHAINE' FICHER 'ic' RAF '.sauv') ;
  1546. 'SAUV' ;
  1547. 'FINSI' ;
  1548. *
  1549. *
  1550. 'SI' FAUX ;
  1551. FICHER = './D_sauv/' ;
  1552. 'OPTION' 'RESTITUER' ('CHAINE' FICHER 'ic16.sauv') ;
  1553. 'RESTITUER' ;
  1554. 'FINSI' ;
  1555. *
  1556. *****************************************************
  1557. *****************************************************
  1558. *****************************************************
  1559. **************** La table RV **********************
  1560. *****************************************************
  1561. *****************************************************
  1562. *****************************************************
  1563. *
  1564. RV = 'TABLE' ;
  1565. RV . 'ANOM' = FAUX ;
  1566. * Constant time step
  1567. CFLREF = 50. ;
  1568. UREF = rhouinf '/' rhoinf ;
  1569. RV . 'DTIMP' = CFLREF * DY '/' UREF ;
  1570. *
  1571. RV . 'ORDTPS' = 1 ;
  1572. *
  1573. RV . 'UN' = UNCONS ;
  1574. RV . 'LISTCONS' = LISTCONS ;
  1575. RV . 'ERROMOTS' = NOMRET ;
  1576. *
  1577. RV . 'CLIM' = FAUX ;
  1578. *
  1579. RV . 'CONS' = FAUX ;
  1580. *
  1581. RV . 'TFINAL' = 0. ;
  1582. RV . 'NITMAEX' = 100000 ;
  1583. *
  1584. RV . 'NITMAIN' = 10 ;
  1585. RV . 'NITMIIN' = 10 ;
  1586. RV . 'EPSINT' = 1.0D-3 ;
  1587. *
  1588. * RV . 'FEXT' = 20 ;
  1589. * RV . 'FINT' = 1 ;
  1590. *
  1591. RV . 'LISTOPER' = 'MOTS' 'CALC' 'PKON' ;
  1592. *
  1593. CALCTAB = 'TABLE' ;
  1594. RV . '1CALC' = CALCTAB ;
  1595. PKONTAB = 'TABLE' ;
  1596. RV . '2PKON' = PKONTAB ;
  1597. *
  1598. RV . 'MATIDE' = 'KOPS' 'MATIDE' LISTCONS ('DOMA' MDOMINT 'CENTRE')
  1599. 'MATRIK' ;
  1600. *
  1601. **** Parametres de la procedure PROLIM
  1602. *
  1603. * Gas model
  1604. * Gas properties
  1605. RV . 'PGAZ' = 'TABLE' ;
  1606. RV . 'PGAZ' . 'R' = Rair ;
  1607. RV . 'PGAZ' . 'GAMN' = gamn ;
  1608. RV . 'PGAZ' . 'MU' = 0.0 ;
  1609. RV . 'PGAZ' . 'LAMBDA' = 0.0 ;
  1610. * Bas Mach (PKON)
  1611. RV . 'BASMACH' = FAUX ;
  1612. * RV . 'CO1' = 'MANUEL' 'CHPO' ('DOMA' MDOMINT 'CENTRE')
  1613. * 1 'SCAL' (1.0D2) ;
  1614. * RV . 'CO1MAX' = 'MANUEL' 'CHPO' ('DOMA' MDOMINT 'CENTRE')
  1615. * 1 'SCAL' (1.0D2) ;
  1616. * RV . 'CO1MIN' = 'MANUEL' 'CHPO' ('DOMA' MDOMINT 'CENTRE')
  1617. * 1 'SCAL' (1.0D0) ;
  1618. * RV . 'CO2' = 'COPIER' ( RV . 'CO1') ;
  1619. * RV . 'CO2' can be Modified into PDIF
  1620. *****************
  1621. ** CALCUL *******
  1622. *****************
  1623. * Personal procedure
  1624. *
  1625. CALCTAB . 'ANOM' = FAUX ;
  1626. CALCTAB . 'EQEX' = RV ;
  1627. CALCTAB . 'MODELE' = MDOMINT ;
  1628. * We call this procedure during the external iterations ->
  1629. CALCTAB . 'IMPL' = VRAI ;
  1630. CALCTAB . 'COMPT' = 0 ;
  1631. *
  1632. *****************
  1633. * PKON **********
  1634. *****************
  1635. CHPVID MATVID = 'KOPS' 'MATRIK' ;
  1636. PKONTAB . 'CFLDTAU' = 10000. ;
  1637. PKONTAB . 'ANOM' = FAUX ;
  1638. PKONTAB . 'EQEX' = RV ;
  1639. PKONTAB . 'GAZ' = 'PERFMONO' ;
  1640. PKONTAB . 'MODELE' = MDOMINT ;
  1641. PKONTAB . 'LISTCONS' = LISTCONS ;
  1642. * PKONTAB . 'METHODE' = 'CENTERED' ;
  1643. * PKONTAB . 'METHODE' = 'RUSANOLM' ;
  1644. * PKONTAB . 'METHODE' = 'AUSMPLM' ;
  1645. PKONTAB . 'METHODE' = 'VLH' ;
  1646. * PKONTAB . 'METHODE' = 'ROELM' ;
  1647. * PKONTAB . 'METHODE' = 'HLLC' ;
  1648. *
  1649. PKONTAB . 'IMPL' = VRAI ;
  1650. 'SI' (PKONTAB . 'IMPL') ;
  1651. * PKONTAB . 'TYPEJACO' = 'AUSMPLUS' ;
  1652. PKONTAB . 'TYPEJACO' = 'VLH' ;
  1653. 'FINSI' ;
  1654. *
  1655. PKONTAB . 'ORDREESP' = 2 ;
  1656. 'SI' ((PKONTAB . 'ORDREESP') 'EGA' 2) ;
  1657. PKONTAB . 'VLIM' = CHPVID ;
  1658. CHPENLIM = 'MANUEL' 'CHPO' (('DOMA' MLIGG 'CENTRE') 'ET'
  1659. ('DOMA' MLIGD 'CENTRE')) 1 'SCAL' 0.0 ;
  1660. CHPE2LIM = 'MANUEL' 'CHPO' (('DOMA' MLIGG 'CENTRE') 'ET'
  1661. ('DOMA' MLIGD 'CENTRE')) 2
  1662. 'UX' 1.0 'UY' 0.0 ;
  1663. TOTO TITI MCHRCON = 'PENTE' MDOMINT 'CENTRE' 'EULESCAL'
  1664. 'LIMITEUR' ('MOTS' 'SCAL') RN0 'CLIM' CHPENLIM ;
  1665. TOTO TITI MCHVCON = 'PENTE' MDOMINT 'CENTRE' 'EULEVECT'
  1666. 'LIMITEUR' ('MOTS' 'UX' 'UY') GN0 'CLIM' CHPE2LIM ;
  1667. PKONTAB . 'LIMITEUR' = 'LIMITEUR' ;
  1668. PKONTAB . 'GRADRN' = MCHRCON ;
  1669. PKONTAB . 'GRADPN' = MCHRCON ;
  1670. PKONTAB . 'GRADVN' = MCHVCON ;
  1671. 'FINSI' ;
  1672. * Gravité
  1673. * PKONTAB . 'CORRGRA' = FAUX ;
  1674. PKONTAB . 'GRAVITE' = 'MANUEL' 'CHPO' ('DOMA' MDOMINT 'CENTRE') 2
  1675. 'UX' 0.0 'UY' 0.0 ;
  1676. *
  1677. MAIVID = 'DIFF' ('DOMA' MLIGG 'CENTRE')
  1678. ('DOMA' MLIGG 'CENTRE') ;
  1679. PKONTAB . 'FACELIM' = MAIVID ;
  1680. PKONTAB . 'ALPHA' = 'INF' ;
  1681. PKONTAB . 'CLIM' = VRAI ;
  1682. PKONTAB . 'TABLIM' = TABLE ;
  1683. *
  1684. * Normalisation du profile parabolique, pour obtenir que
  1685. * le flux rentrante vaut MINJ
  1686. *
  1687. PKONTAB . 'TABLIM' . 'CHINSS' = 'MANUEL' 'CHPO' ('DOMA' MLIGG
  1688. 'CENTRE') 4 'RN' rhoinf 'UX' (rhouinf '/' rhoinf)
  1689. 'UY' (rhovinf '/' rhoinf) 'PN' pinf ;
  1690. PKONTAB . 'TABLIM' . 'CHOUTSS' = CHPVID ;
  1691. *
  1692. ***********************************
  1693. * Inversion de la matrice *********
  1694. ***********************************
  1695. *
  1696. * RV . 'MATUPDAT' updating
  1697. * RV . 'MUPEXT' external iterations updating
  1698. * RV . 'MUPINT' internal iterations updating
  1699. * RV . 'MUPLIN' We update the matrix if in the previous
  1700. * internal iteration the number of linear
  1701. * iterations to solve the system were bigger
  1702. * than (RV . 'MUPLIN')
  1703. RV . 'MATUPDAT' = FAUX ;
  1704. 'SI' ('NON' ( RV . 'MATUPDAT')) ;
  1705. RV . 'MUPEXT' = 1 ;
  1706. RV . 'MUPINT' = 50 ;
  1707. RV . 'MUPLIN' = 4000 ;
  1708. 'FINSI' ;
  1709. RV . 'MATINV' = 'TABLE' 'METHINV' ;
  1710. MATTAB = RV . 'MATINV' ;
  1711. * MATTAB . 'TYPINV' = 1 : methode exact
  1712. * MATTAB . 'TYPINV' = 5 ; GMRES
  1713. MATTAB . 'TYPINV' = 5 ;
  1714. MATTAB . 'IMPINV' = 0 ;
  1715. *
  1716. * Matrice pour assurer que la matrice à inverser est correctement
  1717. * assemblé
  1718. *
  1719. * MATTAB . 'MATASS' definie en EXEXIM
  1720. * MATTAB . 'MAPREC' "
  1721. * MATTAB . 'XINIT' "
  1722. *
  1723.  
  1724. * Methode de numerotation de DDL
  1725. MATTAB . 'TYRENU' = 'RIEN' ;
  1726. MATTAB . 'PCMLAG' = 'APR2' ;
  1727. MATTAB . 'GMRESTRT' = 500 ;
  1728. MATTAB . 'SCALING' = 1 ;
  1729. * ILU 3
  1730. * ILUT (dual truncation) 5
  1731. * ILUTP 9
  1732. * Dans le cas ILUT il faut definir
  1733. * ILUTLFIL
  1734. * ILUTDTOL
  1735. MATTAB . 'PRECOND' = 5 ;
  1736. MATTAB . 'OUBMAT' = 0 ;
  1737. MATTAB . 'ILUTPPIV' = 0.1 ;
  1738. MATTAB . 'ILUTPMBL' = 0 ;
  1739. MATTAB . 'ILUTLFIL' = 4. ;
  1740. MATTAB . 'ILUTDTOL' = 0. ;
  1741. MATTAB . 'NITMAX' = 3000 ;
  1742. MATTAB . 'RESID' = 1.D-5 ;
  1743. *
  1744. **** Save results into a file
  1745. *
  1746. SI FAUX ;
  1747. FICHER1 = ('CHAINE' FICHER 'main' RAF
  1748. (PKONTAB . 'METHODE')
  1749. 'OE' (PKONTAB . 'ORDREESP')
  1750. 'OT' (RV . 'ORDTPS') '.sauv') ;
  1751. 'OPTION' 'SAUVER' FICHER1 ;
  1752. 'MESSAGE' 'We save results into' ;
  1753. 'MESSAGE' FICHER ;
  1754. 'MESSAGE' ;
  1755. 'FINSI' ;
  1756. *
  1757. **** Exexcution EXEXIM
  1758. *
  1759. LISTTPS = ('PROG' 100.0) ;
  1760. 'REPETER' BL1 ('DIME' LISTTPS) ;
  1761. RV . 'TFINAL' = 'EXTRAIRE' LISTTPS &BL1 ;
  1762. * 'TEMPS' 'ZERO' ;
  1763. EXEXIM RV ;
  1764. * 'TEMPS' 'IMPR' ;
  1765. *
  1766. **** To save memory storage
  1767. *
  1768. 'OUBLIER' MATTAB MATASS ;
  1769. 'OUBLIER' MATTAB MAPREC ;
  1770. 'MENAGE' ;
  1771. 'SI' FAUX ;
  1772. 'SAUVER' 'LABEL' ('CHAINE' &BL1) ;
  1773. 'FINSI' ;
  1774. 'FIN' BL1 ;
  1775.  
  1776. ***************************************************************
  1777. ***************************************************************
  1778. ***************************************************************
  1779. ************** Plot of the solutions **************************
  1780. ***************************************************************
  1781. ***************************************************************
  1782. ***************************************************************
  1783. *
  1784. 'SI' FAUX ;
  1785. FICHER =
  1786. './D_sauv/main16VLHOE2OT1.sauv' ;
  1787. 'OPTION' 'RESTITUER' FICHER ;
  1788. 'RESTITUER' ;
  1789. 'FINSI' ;
  1790. *
  1791. * LOGGNP = logical. If VRAI, files for gnuplot are created
  1792. *
  1793. LOGGNP = VRAI ;
  1794. VALECH = 1 ;
  1795.  
  1796. 'OPTION' 'ECHO' VALECH 'TRAC' 'X' ;
  1797.  
  1798. TPS = RV . 'PASDETPS' . 'TPS' ;
  1799. METO = PKONTAB . 'METHODE' ;
  1800. ORD_ESP = PKONTAB . 'ORDREESP' ;
  1801. ORD_TPS = RV . 'ORDTPS' ;
  1802.  
  1803. NTOTEL = 'NBNO' ('DOMA' MDOMINT 'CENTRE') ;
  1804.  
  1805. *
  1806. **** Les variables conservatives
  1807. *
  1808.  
  1809. GAMN = 'REDU' GAMN ('DOMA' MDOMINT 'CENTRE') ;
  1810. RN = 'EXCO' NOMDEN (RV . 'UN') ('MOTS' 'SCAL') ;
  1811. GN = 'EXCO' NOMMOM (RV . 'UN') ('MOTS' 'UX' 'UY') ;
  1812. RETN = 'EXCO' NOMRET (RV . 'UN') ('MOTS' 'SCAL') ;
  1813.  
  1814. *
  1815. **** Les variables primitives
  1816. *
  1817.  
  1818. VN PN = 'PRIM' 'PERFMONO'
  1819. RN GN RETN GAMN ;
  1820.  
  1821. CSON2 = (GAMN '*' PN) '/' RN ;
  1822. VN2 = 'PSCAL' VN VN ('MOTS' 'UX' 'UY') ('MOTS' 'UX' 'UY') ;
  1823. MACHN2 = VN2 '/' CSON2 ;
  1824. MACHN = MACHN2 '**' 0.5 ;
  1825.  
  1826. TITOLO = ('CHAINE' METO ', OE = ' ORD_ESP ', OT =' ORD_TPS
  1827. ', NBEL = ' NTOTEL ' ,tps =' TPS) ;
  1828.  
  1829. EVO1 = 'EVOL' 'MANU' 'it' (CALCTAB . 'IT') 'err'
  1830. ((CALCTAB . 'ER') '+' 1.0D-16) ;
  1831.  
  1832. *
  1833. *** GRAPHIQUE DES SOLUTIONS
  1834. *
  1835.  
  1836. 'SI' GRAPH ;
  1837.  
  1838. 'TRACER' DOMINT 'TITRE' ('CHAINE' 'Maillage') ;
  1839.  
  1840. CHM_RN = 'KCHA' MDOMINT 'CHAM' RN ;
  1841. CHM_PN = 'KCHA' MDOMINT 'CHAM' PN ;
  1842. CHM_VN = 'KCHA' MDOMINT 'CHAM' VN ;
  1843. CHM_MACH = 'KCHA' MDOMINT 'CHAM' MACHN ;
  1844.  
  1845. 'TRACER' CHM_RN MDOMINT ('CONTOUR' DOMINT)
  1846. 'TITR' ('CHAINE' ' RN : ' TITOLO) ;
  1847. RNV = 'ELNO' TDOMINT ('REDU' RN TDOMINT . 'CENTRE') ;
  1848. 'OPTION' 'ISOV' 'LIGN' ;
  1849. 'TRACER' DOMINT RNV ('CONTOUR' DOMINT)
  1850. 'TITRE' ('CHAINE' 'RN : ' TITOLO) 15 ;
  1851. 'OPTION' 'ISOV' 'SULI' ;
  1852. 'TRACER' CHM_PN MDOMINT ('CONTOUR' DOMINT)
  1853. 'TITR' ('CHAINE' 'PN : ' TITOLO) ;
  1854. PNV = 'ELNO' TDOMINT ('REDU' PN TDOMINT . 'CENTRE') ;
  1855. 'OPTION' 'ISOV' 'LIGN' ;
  1856. 'TRACER' DOMINT PNV ('CONTOUR' DOMINT)
  1857. 'TITRE' ('CHAINE' 'PN : ' TITOLO) 15 ;
  1858. 'OPTION' 'ISOV' 'SULI' ;
  1859. 'TRACER' CHM_MACH MDOMINT ('CONTOUR' DOMINT)
  1860. 'TITR' ('CHAINE' 'MACHN : ' TITOLO);
  1861. MACHNV = 'ELNO' TDOMINT ('REDU' MACHN TDOMINT . 'CENTRE') ;
  1862. 'OPTION' 'ISOV' 'LIGN' ;
  1863. 'TRACER' DOMINT MACHNV ('CONTOUR' DOMINT)
  1864. 'TITRE' ('CHAINE' 'Mach : ' TITOLO) 15 ;
  1865. 'OPTION' 'ISOV' 'SULI' ;
  1866. 'TRACER' CHM_VN MDOMINT ('CONTOUR' DOMINT)
  1867. 'TITR' ('CHAINE' 'VN : ' TITOLO) ;
  1868. VECN = 'VECTEUR' VN (8. '/' RAF) 'UX' 'UY' 'JAUNE' ;
  1869. 'TRACER' DOMINT VECN ('CONTOUR' DOMINT)
  1870. 'TITRE' ('CHAINE' 'VN : ' TITOLO) ;
  1871. *
  1872. 'OPTION' 'ISOV' 'SULI' ;
  1873. 'DESSIN' EVO1 LOGY 'TITRE' 'Error' ;
  1874. *
  1875. 'FINSI' ;
  1876.  
  1877.  
  1878. *
  1879. **** Test de convergence
  1880. *
  1881.  
  1882. AA = 'EXTRAIRE' (CALCTAB . 'ER') ('DIME' (CALCTAB . 'ER')) ;
  1883.  
  1884. 'SI' (AA > 1.0D-8) ;
  1885. 'MESSAGE' 'Probleme en KONV' ;
  1886. 'ERREUR' 5 ;
  1887. 'FINSI' ;
  1888.  
  1889. *
  1890. *** Test
  1891. *
  1892.  
  1893. PCEN1 = (TDOMINT . 'CENTRE') 'POIN' 'PROC' (2.5 (H1 '/' 2.0)) ;
  1894. 'SI' GRAPH ;
  1895. 'TRACER' (DOMINT 'ET' PCEN1) 'TITRE'
  1896. 'Test 1: solution derrier le premier choc' ;
  1897. 'FINSI' ;
  1898. ro1 = 'EXTRAIRE' RN 'SCAL' PCEN1 ;
  1899.  
  1900. erro = ((ro1 '-' 1.7289) 'ABS') '/' 1.7289 ;
  1901. 'SI' (erro > 1.0D-2) ;
  1902. 'ERREUR' 5 ;
  1903. 'FINSI' ;
  1904.  
  1905. p1 = 'EXTRAIRE' PN 'SCAL' PCEN1 ;
  1906.  
  1907. erro = ((p1 '-' 0.3919) 'ABS') '/' 0.3919 ;
  1908. 'SI' (erro > 5.0D-2) ;
  1909. 'ERREUR' 5 ;
  1910. 'FINSI' ;
  1911.  
  1912. m1 = 'EXTRAIRE' MACHN 'SCAL' PCEN1 ;
  1913.  
  1914. erro = ((m1 '-' 1.44572) 'ABS') '/' 1.44572 ;
  1915. 'SI' (erro > 5.0D-2) ;
  1916. 'ERREUR' 5 ;
  1917. 'FINSI' ;
  1918.  
  1919. * Derrier le mach stem on a le mach min
  1920. * MMIN = 0.577350
  1921. * Il faut avoir un maillage assez fin pour l'avoir
  1922.  
  1923. MMIN = 'MINIMUM' MACHN ;
  1924. 'MESSAGE' ('CHAINE' 'MMIN_ex =' 0.577350) ;
  1925. 'MESSAGE' ('CHAINE' 'MMIN =' MMIN) ;
  1926.  
  1927. 'SI' (MMIN > 1.0) ;
  1928. 'ERREUR' 5 ;
  1929. 'FINSI' ;
  1930. 'FIN' ;
  1931.  
  1932.  
  1933.  

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