Télécharger exec.procedur

Retour à la liste

Numérotation des lignes :

  1. * EXEC PROCEDUR MAGN 17/02/24 21:15:08 9323
  2. *X EXEC (Procedure)
  3. * Procedure EXEC
  4. *
  5. * Objet : Execute un algorithme décrit dans une table RV
  6. * de type EQEX.
  7. * Cette table est créée par l'opérateur EQEX
  8. *
  9. * Syntaxe : EXEC RV ;
  10. *
  11. ***********************************************************************
  12. * VERSION : ????
  13. * HISTORIQUE : 20/12/99: gounand
  14. * Rajout de la gestion de la matrice servant à l'assemblage
  15. * (rv . 'METHINV' . 'MATASS')
  16. *
  17. * HISTORIQUE : 12/05/06 : ajout STOPITER, NUITER et STOPPDT
  18. * HISTORIQUE : 21/12/07 : ajout projection algébrique incrémentale
  19. * (cf. GRESP)
  20. * HISTORIQUE : 06/05/14 : ajout test DFDT : qd niter>1, on vérifie
  21. * que le 2eme argument est distinct de linconnue.
  22. * HISTORIQUE : 05/06/14 : on teste qd niter>1 et itma>1, car certains
  23. * cas utilisent DFDT pour pénaliser (dvisi et
  24. * ccar3)
  25. * HISTORIQUE :
  26. ************************************************************************
  27. * DISCPRES = (d'apres KMIC)
  28. * KPRE=3 pression P0 KPRE=4 pression P1 KPRE=2 cas macro 1ère génération
  29. * KPRE=5 pression MSOMMET
  30. ************************************************************************
  31. 'DEBPROC' EXEC ;
  32. 'ARGUMENT' rv*'TABLE ' nparti/'ENTIER' lopp/'LISTMOTS';
  33. *
  34. * Ajout test DFDT : qd niter>1, on vérifie que le 2eme argument est
  35. * distinct de linconnue.
  36. *
  37. niter = rv . 'NITER' ;
  38. itma = rv . 'ITMA' ;
  39. 'SI' ('ET' ('>' niter 1) ('>' itma 1)) ;
  40. nop = 'DIME' (rv . 'LISTOPER') ;
  41. 'REPETER' iop nop ;
  42. nomper = 'EXTRAIRE' (rv . 'LISTOPER') &iop ;
  43. 'SI' ('EGA' nomper 'DFDT') ;
  44. notable = 'CHAINE' &iop nomper ;
  45. rvn = rv . notable ;
  46. typarg2 = 'TYPE' rvn . 'ARG2' ;
  47. 'SI' ('EGA' typarg2 'MOT') ;
  48. nomun = 'EXTRAIRE' (rvn . 'LISTINCO') 1 ;
  49. 'SI' ('EGA' nomun rvn . 'ARG2') ;
  50. * ***** ERREUR 1038 ***** dans l'opérateur ERRE
  51. * Procedure EXEC: NITER>1 et noms d'inconnues au pas courant et precedent
  52. * identiques dans un DFDT.
  53. 'ERREUR' 1038 ;
  54. 'FINSI' ;
  55. 'FINSI' ;
  56. 'FINSI' ;
  57. 'FIN' iop ;
  58. 'FINSI' ;
  59.  
  60.  
  61. ************************************************************************
  62. ************************************************************************
  63. *On utilise RESOU
  64. TRESOU=FAUX ;
  65. Si(EXIST RV 'TRESOU') ;
  66. TRESOU=RV.'TRESOU' ;
  67. Finsi ;
  68.  
  69. *Parallélisation des résolutions lorsqu'elles sont découplées
  70. TKPR=FAUX ;
  71. Si(EXIST RV 'TKPR') ;
  72. TKPR=rv.'TKPR' ;
  73. Finsi;
  74.  
  75. *Parallélisation du calcul des matrices élémentaires
  76. TCPT=FAUX ;
  77. Si ('EXIS' RV 'TCPT') ;
  78. TCPT=RV.'TCPT' ;
  79. Finsi ;
  80.  
  81. * Impressions liées au parallélisme
  82. IMPARA=FAUX ;
  83. Si ('EXIS' RV 'IMPARA') ;
  84. IMPARA=RV.'IMPARA' ;
  85. Finsi ;
  86.  
  87. * La liste des opérateurs potentiellement parallélisables est donnée
  88. * dans loperpar
  89. *loperpar=mots 'NS' 'TSCA' 'DFDT' 'KONV' 'LAPN' 'FROT' 'FIMP' 'TOIMP';
  90. loperpar=mots 'NS' 'TSCA' 'DFDT' 'LAPN' 'KONV';
  91. loperpar=mots 'NS' 'TSCA' 'DFDT';
  92. * loperpar=mots 'NSQT';
  93.  
  94. ************************************************************************
  95. ************************************************************************
  96. *-----------------------------------------------------------------------
  97. SI TCPT ;
  98. * Préparation pour paralléliser le calcul des matrices élémentaires
  99. * Il y a 3 conditions pour paralléliser le matrices élémentaires
  100. * 1/ RV.'TCPT' = VRAI
  101. * 2/ Npart> 1
  102. * 3/ On a bien des objets MMODEL et non pas des tables DOMAINES
  103.  
  104. * On partitionne en fonction du nombre de proc par défaut ou n
  105. * si précisé dans l'instruction exec rv n ;
  106. * Si Npart <eg 1 : On ne partitionne pas
  107. si (exist nparti);npart=nparti;sinon;npart=valeur assis;finsi;
  108.  
  109. SI (NON ('EXIST' RV 'TABPARTM')) ;
  110. TABPARTM=TABLE ;
  111. rv.'TABPARTM'=TABPARTM ;
  112. 'REPETER' IOP ('DIME' (rv . 'LISTOPER')) ;
  113. nomper = 'EXTRAIRE' &IOP (rv . 'LISTOPER') ;
  114. notable= 'MOT' ('TEXTE' ('CHAINE' &IOP nomper)) ;
  115. rvn=rv . notable ;
  116. $md = rvn.'DOMZ' ;
  117. tym=type $md ;
  118. si(NON ('EGA' tym 'MMODEL')) ;
  119. TCPT=FAUX ;
  120. quitter IOP ;
  121. finsi; ;
  122. * mess 'nomper=' nomper ;
  123. * list loperpar ;
  124. Si ('EXIST' LOPERPAR nomper) ;
  125. mess ' On parallélise ' nomper ' npart =' npart ;
  126. Si (non ('EXIST' TABPARTM $md)) ;
  127. $mdp= part 'ARLE' npart $md ;
  128. * $mdp= part npart $md ;
  129.  
  130. $bid=table 'ESCLAVE';
  131. repeter BIBI npart;
  132. * $bid.&BIBI='TABLE' 'KIZX' ;
  133. $bid.&BIBI='COPIER' rvn ;
  134.  
  135. $bid.&BIBI.'DOMZ'= $mdp.&BIBI ;
  136. $tdz = doma ($bid.&BIBI.'DOMZ') 'TABLE' ;
  137. $bid.&BIBI.'TDOMZ'= $tdz ;
  138.  
  139. * list rvn ;
  140. * list $bid.&BIBI;
  141. * quitter exec;
  142.  
  143. FIN BIBI;
  144. TABPARTM.'$bid'=$bid ;
  145. * TABPARTM.'$mdp'=$mdp ;
  146. rvn.'$mdp'=$mdp ;
  147. rvn.'$bid'=$bid ;
  148. Finsi ;
  149. Sinon ;
  150. mess ' On ne parallélise pas ' nomper ;
  151. Finsi ;
  152. 'FIN' IOP ;
  153. SINON ;
  154. TABPARTM = rv.'TABPARTM' ;
  155. FINSI ;
  156. *-----------------------------------------------------------------------
  157. Si('EGA' (dime TABPARTM) 0);TCPT=FAUX ;
  158. mess 'Il n y a pas d opérateurs à paralléliser !' ;
  159. FINSI ;
  160.  
  161. Si (Npart <eg 1); mess ' Npart <eg 1 : On ne partitionne pas ';
  162. TCPT=FAUX; Finsi; ;
  163.  
  164. FINSI ;
  165. *-----------------------------------------------------------------------
  166.  
  167. *Logique d'arret
  168. 'SI' ('NON' ('EXISTE' rv 'STOPITER')) ;
  169. rv . 'STOPITER' = FAUX ;
  170. 'FINSI' ;
  171. 'SI' ('NON' ('EXISTE' rv 'STOPPDT')) ;
  172. rv . 'STOPPDT' = FAUX ;
  173. 'FINSI' ;
  174.  
  175. * Logique pilotant le recalcul de la matrice de pression
  176. CALPRE=FAUX ;
  177. Si ('EXIST' rv 'CALPRE') ;
  178. vertytab rv 'CALPRE' 'LOGIQUE' ;
  179. CALPRE=rv.'CALPRE' ;
  180. Finsi ;
  181.  
  182. Si(NON('EXIST' rv 'XEQUA'));
  183. rv.'XEQUA'= FAUX ;
  184. Finsi ;
  185.  
  186.  
  187. 'SI' ('EGA' (rv . 'NAVISTOK') 0) ;
  188. EXAC rv ;
  189. 'QUITTER' EXEC ;
  190. 'FINSI' ;
  191.  
  192. *******PROJ*************************************************************
  193. *******PROJ Trois possibilités *****************************************
  194. *******PROJ TMDM1 (vrai)_> Correction Gresho NON
  195. *******PROJ TGRAD (vrai)-> Formulation Gradient NON
  196. *******PROJ TPNM2 (vrai)-> elimination end of step velocity OUI
  197. *******PROJ TMDM1 = VRAI TGRAD = FAUX TPNM2 = FAUX ancien algo
  198. TYPROJ='VPI1' ;
  199. ROW = 1. ;
  200. 'SI' ('EXIST' RV 'TYPROJ') ;
  201. TYPROJ=RV.'TYPROJ' ;
  202. 'SI' (non (exist (MOTS 'PSCT' 'VPI1' 'VPI2' 'PENA') TYPROJ));
  203. Mess '*********************************************************' ;
  204. Mess ' ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ' ;
  205. Mess ' ' ;
  206. Mess 'Le mot ' TYPROJ ' n existe pas dans la liste.' ;
  207. Mess 'Les méthodes de projection autorisées sont :' ;
  208. Mess 'VPI1, VPI2, PSCT et PENA' ;
  209. Mess '*********************************************************' ;
  210. erreur 21 ;
  211. quitter EXEC ;
  212. 'FINSI' ;
  213. 'FINSI' ;
  214.  
  215. 'SI' ('EGA' TYPROJ 'PSCT') ;
  216. TGRAD = FAUX ;
  217. TMDM1 = FAUX ;
  218. TPNM2 = FAUX ;
  219. 'FINSI' ;
  220. 'SI' ('EGA' TYPROJ 'VPI1') ;
  221. TGRAD = FAUX ;
  222. TMDM1 = VRAI ;
  223. TPNM2 = FAUX ;
  224. 'FINSI' ;
  225. 'SI' ('EGA' TYPROJ 'VPI2') ;
  226. TGRAD = FAUX ;
  227. TMDM1 = FAUX ;
  228. TPNM2 = VRAI ;
  229. 'FINSI' ;
  230. 'SI' ('EGA' TYPROJ 'PENA') ;
  231. TGRAD = FAUX ;
  232. TMDM1 = FAUX ;
  233. TPNM2 = FAUX ;
  234. 'FINSI' ;
  235.  
  236. *******PROJ Quatres possibilités ***************************************
  237. *******PROJ*************************************************************
  238.  
  239. nomvi=rv . 'NOMVI' ;
  240.  
  241. 'SI' ('EGA' ('VALEUR' 'DIME') 2) ;
  242. vnul=0.D0 0.D0 ;
  243. vuni=1.D0 1.D0 ;
  244. cnvi1= 'MOT' ('TEXTE' ('CHAINE' 1 nomvi)) ;
  245. cnvi2= 'MOT' ('TEXTE' ('CHAINE' 2 nomvi)) ;
  246. lc= mots cnvi1 cnvi2 ;
  247. lcu=mots 'UX' 'UY' ;
  248. 'SINON' ;
  249. vnul=0.D0 0.D0 0.D0 ;
  250. vuni=1.D0 1.D0 1.D0 ;
  251. cnvi1= 'MOT' ('TEXTE' ('CHAINE' 1 nomvi)) ;
  252. cnvi2= 'MOT' ('TEXTE' ('CHAINE' 2 nomvi)) ;
  253. cnvi3= 'MOT' ('TEXTE' ('CHAINE' 3 nomvi)) ;
  254. lc= mots cnvi1 cnvi2 cnvi3 ;
  255. lcu=mots 'UX' 'UY' 'UZ' ;
  256. 'FINSI' ;
  257. 'SI' ('NON' ('EXISTE' rv 'OMEGA')) ;
  258. omeg=1.D0 ;
  259. 'SINON' ;
  260. omeg=rv . 'OMEGA' ;
  261. 'FINSI' ;
  262.  
  263. testpr ='EXISTE' rv 'PRESSION' ;
  264. testprj ='EXISTE' rv 'PROJ' ;
  265. testran=testpr 'ET' ('EXISTE' rv 'CO') ;
  266.  
  267. si testpr ; rvp = rv.'PRESSION' ;
  268. achp matpr= 'KOPS' 'MATRIK' ;
  269. rvp.'MATP'= matpr;
  270. finsi ;
  271. si testprj; rvp = rv.'PROJ' ; Finsi ;
  272.  
  273. 'SI' (rv.'IMPR' >EG 1) ;
  274. si testpr ;
  275. mess 'Algorithme semi explicite (ANCIEN)';
  276. mess '==================================';
  277. Finsi ;
  278. si testprj;
  279. mess 'Algorithme de Projection';
  280. mess '========================';
  281. finsi ;
  282. si ( non (testpr ou testprj)) ;
  283. mess 'Algorithme standard implicite ou explicite ';
  284. mess '===========================================';
  285. finsi ;
  286. 'FINSI' ;
  287.  
  288. 'SI' ('NON' ('EXISTE' rv 'HIST')) ;
  289. rv . 'HIST' = 'TABLE' ;
  290. 'FINSI' ;
  291.  
  292.  
  293. ITMA=(rv . 'ITMA') ;
  294. IMPTCRR=0 ;
  295. IMPKRES=0 ;
  296. 'SI' ('&lt;EG' ITMA 1) ;
  297. ITMA=1 ;
  298. IMPTCRR=1 ;
  299. 'FINSI' ;
  300. Si (testprj ) ; IMPTCRR=1 ; finsi ;
  301. Si ( non (testpr ou testprj)) ; IMPTCRR=1 ; finsi ;
  302.  
  303.  
  304. * Gestion de la matrice de préconditionnement
  305. *
  306. * calprec : doit-on recalculer le préconditionneur
  307. * fcprect : fréquence de recalcul du préc. en fn du pas de temps
  308. * fcpreci : fréquence de recalcul du préc. dans la boucle
  309. * d'itérations internes pour les non-linéarités
  310. * fcprectp : idem pour la matrice de pression
  311. * fcprecip : idem pour la matrice de pression
  312. * resmn : le résidu au pas de temps ou à l'itération interne précédente
  313. *
  314. calprec = VRAI ;
  315. fcprect = rv. 'METHINV' . 'FCPRECT' ;
  316. fcpreci = rv. 'METHINV' . 'FCPRECI' ;
  317.  
  318. 'SI'(NON (exist rv 'resmnp')) ;
  319. resmnp maprecp = 'KOPS' 'MATRIK' ;
  320. rv.'resmnp'=resmnp ;
  321. 'FINSI' ;
  322.  
  323. 'SI'(NON (exist rv 'resmn'));
  324. resmn maprec = 'KOPS' 'MATRIK' ;
  325. rv.'resmn'=resmn ;
  326. 'FINSI' ;
  327.  
  328. 'SI' ('NON' ('EXIST' rv.'METHINV' 'CALPREC')) ;
  329. rv.'METHINV'.'CALPREC'= VRAI ;
  330. 'FINSI' ;
  331. 'SI' testprj ;
  332. fcprectp = rvp. 'METHINV' . 'FCPRECT' ;
  333. fcprecip = rvp. 'METHINV' . 'FCPRECI' ;
  334. 'SI' ('NON' ('EXIST' rvp.'METHINV' 'CALPREC')) ;
  335. rvp.'METHINV'.'CALPREC'= VRAI ;
  336. 'FINSI' ;
  337. 'FINSI' ;
  338.  
  339. 'REPETER' bloc1 ITMA ;
  340. 'SI' ('MULT' &bloc1 fcprect) ;
  341. rv.'METHINV'.'CALPREC' = VRAI ;
  342. 'FINSI' ;
  343. 'SI' (testprj) ;
  344. 'SI' ('MULT' &bloc1 fcprectp) ;
  345. rvp.'METHINV'.'CALPREC' = VRAI ;
  346. 'FINSI' ;
  347. 'FINSI' ;
  348. testp1 = FAUX ;
  349. si (testpr ou testprj) ;
  350. Si CALPRE ; testp1=VRAI ; Finsi ;
  351. Si (non (exist rvp 'MATC')) ; testp1=VRAI ; Finsi ;
  352. finsi ;
  353.  
  354. 'REPETER' bloci (rv . 'NITER') ;
  355. rv . 'NUITER' = &bloci ;
  356. 'SI' ('MULT' &bloci fcpreci) ;
  357. rv.'METHINV'.'CALPREC' = VRAI ;
  358. 'FINSI' ;
  359.  
  360. 'SI' (testprj) ;
  361. 'SI' ('MULT' &bloci fcprecip) ;
  362. rvp.'METHINV'.'CALPREC' = VRAI ;
  363. 'FINSI' ;
  364. 'FINSI' ;
  365. st mat = 'KOPS' 'MATRIK' ;
  366. sf mau = 'KOPS' 'MATRIK' ;
  367.  
  368. mdfdt = 0 ;
  369. 'REPETER' bloc2 ('DIME' (rv . 'LISTOPER')) ;
  370. nomper = 'EXTRAIRE' &bloc2 (rv . 'LISTOPER') ;
  371. notable= 'MOT' ('TEXTE' ('CHAINE' &bloc2 nomper)) ;
  372.  
  373. * mess 'Operateur Bloc2 mdfdt ? ' nomper ;
  374.  
  375. rvn=rv . notable;
  376.  
  377. mdfdt = mdfdt + rvn . 'KOPT' . 'KFORM' ;
  378.  
  379. si (ega nomper 'DFDT ');
  380. ISCHT= (rvn.kopt.'ISCHT') ;
  381. Si (NON TCPT) ;
  382. msi mai= ('TEXTE' nomper) rvn ;
  383. Sinon ;
  384. Si ('EXIST' LOPERPAR nomper) ;
  385. Si IMPARA ;
  386. mess ' On parallélise ' nomper ' npart =' npart ;
  387. Finsi ;
  388. $mdp=rvn.'$mdp' ;
  389. $bid=rvn.'$bid' ;
  390. * msi mai= 'ASSI' 'TOUS' ('TEXTE' nomper) rvn $mdp ;
  391. msi mai= 'ASSI' 'TOUS' ('TEXTE' nomper) rvn $bid ;
  392. msi=etg msi ;
  393. mai=etg mai ;
  394. Sinon ;
  395. Si IMPARA ;
  396. mess nomper ' n est pas parallélisable' ;
  397. Finsi ;
  398. msi mai= ('TEXTE' nomper) rvn ;
  399. Finsi ;
  400. Finsi ;
  401. mat = mat 'ET' mai ;
  402. st = st 'ET' msi ;
  403.  
  404. sinon ;
  405.  
  406. Si (NON TCPT) ;
  407. msi mai= ('TEXTE' nomper) rvn ;
  408. Sinon ;
  409. Si ('EXIST' LOPERPAR nomper) ;
  410. Si IMPARA ;
  411. mess ' On parallélise ' nomper ' npart =' npart ;
  412. Finsi ;
  413. $mdp=rvn.'$mdp' ;
  414. $bid=rvn.'$bid' ;
  415. * msi mai= 'ASSI' 'TOUS' ('TEXTE' nomper) rvn $mdp $bid;
  416. msi mai= 'ASSI' 'TOUS' ('TEXTE' nomper) rvn $bid;
  417. msi=etg msi ;
  418. mai=etg mai ;
  419. Sinon ;
  420. Si IMPARA ;
  421. mess nomper ' n est pas parallélisable' ;
  422. Finsi ;
  423. msi mai= ('TEXTE' nomper) rvn ;
  424. Finsi ;
  425. Finsi ;
  426.  
  427. mau = mau 'ET' mai ;
  428. sf = sf 'ET' msi ;
  429.  
  430. finsi ;
  431.  
  432. 'FIN' bloc2 ;
  433.  
  434. s2 = sf et st ;
  435. ma1 = mau 'ET' mat ;
  436.  
  437. ********** Traitement PRESSION ****************************
  438. *mess 'Traitement PRESSION';
  439.  
  440. 'SI' (exist rv 'rvpd') ;
  441. rvpd = rv.'rvpd' ;
  442. IDigv=rv.'IDigv';
  443. Digv=rv.'Digv';
  444. matpr= rvp.'MATP' ;
  445. 'FINSI' ;
  446.  
  447. */1 CALCUL de CMCT pour PRESSION
  448. 'SI' (testpr et testp1) ;
  449.  
  450. rvpd = (rvp.'DOMAINE') ;
  451. Diago = doma rvpd 'XXDIAGSI' ;
  452. si ( ega ('VALEUR' 'DIME') 2) ;
  453. Digv= ( exco Diago 'SCAL' cnvi1 ) et ( exco Diago 'SCAL' cnvi2 ) ;
  454. sinon ;
  455. Digv= ( exco Diago 'SCAL' cnvi1 ) et ( exco Diago 'SCAL' cnvi2 ) et
  456. ( exco Diago 'SCAL' cnvi3 ) ;
  457. finsi ;
  458. Digv = kcht rvpd vect sommet comp lc Digv ;
  459.  
  460. 'SI' ('EXISTE' rv 'CLIM') ;
  461. rvp . 'CLIM' = rv . 'CLIM' ;
  462. Digv = 'KOPS' Digv 'CLIM' (rv . 'CLIM') -1;
  463. 'FINSI' ;
  464.  
  465. IDigv= 'INVERSE' digv ;
  466.  
  467. 'SI' ('NON' ('EXISTE' rvp 'DIAGV')) ;
  468. rvp . 'DIAGV' = digv ;
  469. 'FINSI' ;
  470.  
  471. rvp . 'MATC' = 'KMAB' rvp ;
  472. rvp . 'PRESSION' = 'KCHT' rvpd 'SCAL'
  473. 'CENTRE' 0.D0 ;
  474. rvp . 'GRADP' = 'KCHT' rvpd 'VECT'
  475. 'SOMMET' vnul ;
  476.  
  477. achp matpr= 'KOPS' 'MATRIK' ;
  478. rvp . 'MATP' = matpr ;
  479. rv.'rvpd'=rvpd;
  480. rv.'IDigv'=IDigv;
  481. rv.'Digv'=Digv;
  482.  
  483. 'FINSI' ;
  484.  
  485. */3 CALCUL de CMCT pour PROJ
  486. 'SI' (testprj et testp1) ;
  487.  
  488. Diago mma = 'KOPS' 'MATRIK' ;
  489.  
  490. idfdt = 0 ;
  491. 'REPETER' blocj ('DIME' (rv . 'LISTOPER')) ;
  492. nomper = 'EXTRAIRE' &blocj (rv . 'LISTOPER') ;
  493. notable= 'MOT' ('TEXTE' ('CHAINE' &blocj nomper)) ;
  494. * mess 'Operateur-> ' nomper ;
  495. si ((ega nomper 'DFDT ') et
  496. ('EXIST' (rv.notable) 'LISTINCO'));
  497. si ('EXIST' (rv. notable.'LISTINCO') nomvi);
  498. idfdt=idfdt + 1 ;
  499. Diago=Diago et (doma (rv. notable .'DOMZ') 'XXDIAGSI');
  500. rvpd=rv. notable . 'DOMZ';
  501. finsi ;
  502. finsi ;
  503. 'FIN' blocj ;
  504. si (ega idfdt 0) ; mess ' Pas de DFDT ?? ' ; erreur 21 ; finsi ;
  505.  
  506. si ( ega ('VALEUR' 'DIME') 2) ;
  507. Digv= ( exco Diago 'SCAL' cnvi1 ) et ( exco Diago 'SCAL' cnvi2 ) ;
  508. sinon ;
  509. Digv= ( exco Diago 'SCAL' cnvi1 ) et ( exco Diago 'SCAL' cnvi2 ) et
  510. ( exco Diago 'SCAL' cnvi3 ) ;
  511. finsi ;
  512. * Digv = kcht rvpd vect sommet comp lc (Digv*Ro) ;
  513. Digv = kcht rvpd vect sommet comp lc Digv ;
  514. * Matrice diagonale ne contenant pas les conditions aux limites : Diag
  515. Diag = copier Digv;
  516. IDiag = 'INVERSE' Diag ;
  517.  
  518. Digv = 'KOPS' Digv 'CLIM' (rv . 'CLIM') -1;
  519.  
  520. IDigv= 'INVERSE' digv ;
  521.  
  522. 'SI' ('NON' ('EXISTE' rvp 'DIAGV')) ;
  523. rvp . 'DIAGV' = digv ;
  524. 'FINSI' ;
  525.  
  526. rvp.'INCO'=rv.'INCO' ;
  527.  
  528. sp map = 'KOPS' 'MATRIK' ;
  529. sr mar = 'KOPS' 'MATRIK' ;
  530. svnpc mvnpc = 'KOPS' 'MATRIK' ;
  531. 'REPETER' blocpj ('DIME' (rvp . 'LISTOPER')) ;
  532. nomper = 'EXTRAIRE' &blocpj (rvp . 'LISTOPER') ;
  533. notable= 'MOT' ('TEXTE' ('CHAINE' &blocpj nomper)) ;
  534. * mess 'Procedure PROJ Operateur : ' nomper ;
  535.  
  536. si (EGA nomper 'KBBT');
  537. rvp . notable . 'KOPT' . 'IKOMP' = 1 ;
  538. finsi ;
  539.  
  540. msi mai=('TEXTE' nomper) (rvp . notable) ;
  541.  
  542. * quitter exec;
  543. *******PROJ*************************************************************
  544. *******PROJ TGRAD calcul maig (Formulation en Gradient) DEBUT*** *******
  545. Si TGRAD ;
  546. mess 'Procedure PROJCT (Gradient) Operateur : ' nomper ;
  547. rvp . notable . 'KOPT' . 'IKOMP' = 0 ;
  548. msig maig=('TEXTE' nomper) (rvp . notable) ;
  549. Finsi ;
  550. *******PROJ -> MATG FIN*****
  551. *******PROJ/////////////////////////////////////////////////////////////
  552.  
  553. TVNP=FAUX;
  554. TVNPC=FAUX;
  555. Si (('EGA' nomper 'VNIMP ') et (non (ega (rvp.'DISCPRES') 5)));
  556. TVNP=VRAI ;
  557. mar = mar 'ET' mai ;
  558. sr = sr 'ET' msi ;
  559. Finsi ;
  560.  
  561. * mess 'nomper=' nomper (rvp.'DISCPRES');
  562. Si (('EGA' nomper 'VNIMP ') et (ega (rvp.'DISCPRES') 5));
  563. TVNPC=VRAI;
  564. mvnpc=mvnpc et mai ;
  565. svnpc=svnpc et msi ;
  566. Finsi ;
  567.  
  568. Si (non ('EGA' nomper 'VNIMP '));
  569. map = map 'ET' mai ;
  570. sp = sp 'ET' msi ;
  571. Finsi ;
  572.  
  573. 'FIN' blocpj ;
  574.  
  575. matpc mac = kops 'CMCTSPLT' map ;
  576. *******PROJ*************************************************************
  577. *******PROJ TGRAD (vrai Formulation en Gradient) CMCTSPLT DEBUT*** *******
  578. Si TGRAD ;
  579. matpcg macg = kops 'CMCTSPLT' maig ;
  580. Finsi ;
  581. *******PROJ -> MATG FIN*****
  582. *******PROJ/////////////////////////////////////////////////////////////
  583.  
  584. Si TVNPC; mac=mac et mvnpc; Finsi;
  585. rvp . 'MATC' = mac ;
  586.  
  587. *******PROJ*************************************************************
  588. *******PROJ TGRAD (vrai Formulation en Gradient) -> MATG DEBUT*** *******
  589. SI TGRAD ; rvp . 'MATG' = macg; FINSI ;
  590. *******PROJ -> MATG FIN*****
  591. *******PROJ/////////////////////////////////////////////////////////////
  592.  
  593. scr mcr = 'KOPS' 'MATRIK' ;
  594. Si TVNP ;
  595. rvp . 'MBTR' = mar ;
  596. Dunit=Idigv;
  597. crt= kops 'CMCT' mac mar (Dunit) ;
  598. ctr= kops 'CMCT' mar mac (Dunit) ;
  599. rrt= kops 'CMCT' mar mar (Dunit) ;
  600. mcr= mcr et crt et ctr et rrt ;
  601. Finsi ;
  602. rvp . 'TVNP' = TVNP ;
  603.  
  604. Si( ega (rvp.'DISCPRES') 5 ) ;
  605. mess ' Cas des pressions continues' ;
  606. matpr = matpc et mcr ;
  607. Sinon ;
  608. mess ' Cas des pressions discontinues' ;
  609.  
  610. matpr = kops 'CMCT' mac mac IDigv ;
  611. * matpr = 'CMCT' mac mac IDigv ;
  612.  
  613. matpr = matpc et matpr et mcr ;
  614.  
  615. Si TRESOU ;
  616. * mess 'ON UTILISE RESOU POUR LA PRESSION **************';
  617. matpr = kops 'RIMA' matpr 'NSYM' ;
  618.  
  619. incu=extr mac 'COMP' ;
  620. incp=extr mac 'COMP' 'DUAL' ;
  621. incup = incu et incp ;
  622. opti INCO incup incup ;
  623.  
  624. Si('EXIS' rvp 'rigp') ;
  625. rigp=rvp.'rigp' ;
  626. Sinon ;
  627. incpres=extr incp 1 ;
  628. mip=extr rvp.clim 'MAILLAGE' ;
  629. rigp=BLOQ mip incpres ;
  630. rvp.'rigp'=rigp ;
  631. Finsi ;
  632. fpi =DEPI RIGP rvp.'CLIM' ;
  633. rvp.clim=fpi ;
  634. matpr = matpr et rigp ;
  635.  
  636. mess 'ON UTILISE RESOU POUR LA PRESSION **************';
  637. Sinon ;
  638. mess 'ON UTILISE KRES POUR LA PRESSION ***************';
  639. * mess 'ON UTILISE KRES POUR LA PRESSION ***************';
  640. Finsi ;
  641.  
  642. Finsi ;
  643.  
  644. rvp . 'MATP' = matpr ;
  645. rv.'rvpd'=rvpd;
  646. rv.'IDigv'=IDigv;
  647. rv.'Digv'=Digv;
  648. 'FINSI' ;
  649. *************
  650. ** Fin calcul CMCT pour testp1 et testprj
  651. ******************************************
  652. * t
  653. *************** Calcul de C p Pression
  654. 'SI' testpr ;
  655.  
  656. dt = (rv . 'PASDETPS' . 'DELTAT') '*' (rv . 'ALFA') ;
  657. rvp . 'DELTAT' = dt ;
  658. f = 'COPIER' s2 ;
  659. u = rv . 'INCO' . nomvi ;
  660.  
  661. lc = 'EXTRAIRE' digv 'COMP' ;
  662. fu = 'KCHT' rvpd 'VECT' 'SOMMET'
  663. 'COMP' lc ('EXCO' f lc) ;
  664.  
  665. 'SI' ('EXISTE' rv 'CLIM') ;
  666. dti = -1.D0 '/' dt ;
  667. dm1f= 'KOPS' (dt '*' ('KOPS' fu '*' IDigv))
  668. 'CLIM' (rv . 'CLIM') 3 ;
  669. dm1f= dti * dm1f ;
  670. 'SINON' ;
  671. dm1f= (-1.D0) '*' ('KOPS' fu '*' IDigv) ;
  672. 'FINSI' ;
  673.  
  674. rvp . 'PRESSION' = 'KMF' (rvp . 'MATC') dm1f ;
  675.  
  676. 'KRES' rvp (rvp . 'PRESSION')
  677. 'BETA' (rvp . 'KBETA') (rvp . 'BETA')
  678. 'PIMP' (rvp . 'KPIMP') (rvp . 'PIMP') ;
  679. rvp . 'GRADP' = 'KMTP' 1 (rvp . 'MATC')
  680. (rvp . 'PRESSION') lc ;
  681. s2 = s2 + (rvp . 'GRADP') ;
  682. rv.'INCO'.'PRESSION'=rvp . 'PRESSION';
  683.  
  684. 'FINSI' ;
  685.  
  686. *******PROJ*************************************************************
  687. *******PROJ MDM1 Ici on calcule M D-1 pour ensuite calculer Ctp DEBUT*** *******
  688. *******PROJ on ne calcule M D-1 que si (rv 'MDM1') n'existe pas DEBUT*** *******
  689. *******PROJ ou CALPRE VRAI DEBUT*** *******
  690. 'SI' testprj ;
  691.  
  692. dt = (rv . 'PASDETPS' . 'DELTAT') '*' (rv . 'ALFA') ;
  693. rvp . 'DELTAT' = dt ;
  694.  
  695. ** Produit M D-1
  696. 'SI' TMDM1 ;
  697. 'SI' (('EXIST' rv 'MDM1') et (NON CALPRE)) ;
  698. MDM1=rv.'MDM1' ;
  699. 'SINON' ;
  700. mess ' On calcule MD-1 ' ;
  701. stn matn= 'KOPS' 'MATRIK' ;
  702.  
  703. ROW = 0.;
  704. 'REPETER' blocpj1 ('DIME' (rvp . 'LISTOPER')) ;
  705. nomper1 = 'EXTRAIRE' &blocpj1 (rvp . 'LISTOPER') ;
  706. notable1= 'MOT' ('TEXTE' ('CHAINE' &blocpj1 nomper1)) ;
  707. * mess 'Operateur ' nomper1 ;
  708.  
  709. si (ega nomper1 'KBBT ');
  710. nomiv1= extr (rvp . notable1 . 'LISTINCO') 1 ;
  711.  
  712. 'REPETER' blocpj2 ('DIME' (rv . 'LISTOPER')) ;
  713. nomper2 = 'EXTRAIRE' &blocpj2 (rv . 'LISTOPER') ;
  714. notable2= 'MOT' ('TEXTE' ('CHAINE' &blocpj2 nomper2)) ;
  715. * mess 'Operateur ' nomper2 ;
  716.  
  717. si (ega nomper2 'DFDT ');
  718. nomiv2= extr (rv . notable2 . 'LISTINCO') 1 ;
  719. si ('EGA' nomiv2 nomiv1) ;
  720.  
  721. Si (EGA TYPROJ 'PENA');
  722. rwi=(rv . notable2) . ARG1;
  723. trwi = type rwi ; mess ' type du coeff rwi ' trwi;
  724.  
  725. Si (EGA trwi 'FLOTTANT');
  726. ROW = maxi (prog rwi ROW);
  727. Finsi ;
  728. Si ((EGA trwi 'CHPOIN') ou (EGA trwi 'MCHAML')) ;
  729. ROW = maxi (prog (maxi rwi) ROW);
  730. Finsi ;
  731. Si (EGA (type rwi) 'MOT');
  732. rwi = rv . 'INCO' . rwi ;
  733. Si (EGA (type rwi) 'FLOTTANT');
  734. ROW = maxi (prog rwi ROW);
  735. Finsi ;
  736. Si ((EGA trwi 'CHPOIN') ou (EGA trwi 'MCHAML')) ;
  737. ROW = maxi (prog (maxi rwi) ROW);
  738. Finsi ;
  739. Finsi ;
  740. Sinon ;
  741. ROW = 1. ;
  742. Finsi ;
  743. * mess 'ROW = ' ROW ;
  744.  
  745. domzp=rv . notable2 . 'DOMZ' ;
  746. msi mai='DFDT' (rv . notable2) ;
  747. matn = matn et mai ;
  748. sti = kcht domzp vect sommet comp lc vuni;
  749. finsi ;
  750. finsi ;
  751. 'FIN' blocpj2 ;
  752. finsi ;
  753. 'FIN' blocpj1 ;
  754.  
  755. Si (EGA TYPROJ 'PENA');
  756. MDM1=1. ;
  757. SINON ;
  758. MDM1='KMF' matn IDiag ;
  759. FINSI ;
  760.  
  761. Si(EGA ISCHT 1);
  762. MDM1=MDM1 * ((dt*2.)/3.) ;
  763. Sinon ;
  764. MDM1=MDM1 * dt ;
  765. Finsi ;
  766.  
  767. rv.'MDM1' = MDM1 ;
  768.  
  769. *******PROJ MDM1 -> rv.'MDM1' FIN*****
  770. *******PROJ/////////////////////////////////////////////////////////////
  771. 'FINSI';
  772. 'FINSI';
  773. *******PROJ*************************************************************
  774. *******PROJ t n-1 DEBUT*** *******
  775. *******PROJ Calcul de C P DEBUT*** *******
  776.  
  777. TVNP=rvp.'TVNP' ;
  778.  
  779. 'SI' ('EXIST' (rv.'INCO') 'PRESSION') ;
  780. PPI = rv.'INCO'.'PRESSION' ;
  781. 'SI' ('EXIST' (rv.'INCO') 'PNM2') ;
  782. * TPNM2 elimination of end of step velocity (2 Pn - Pn-1)
  783. PPI = 2*(PPI) - rv.'INCO'.'PNM2' ;
  784. 'FINSI' ;
  785.  
  786. *Formulation en u grad p
  787. Si (Exist rvp 'MATG');
  788. cpre = 'KMF' (rvp . 'MATG') PPI 'TRAN' ;
  789. *Formulation en p div u
  790. Sinon;
  791. cpre = 'KMF' (rvp . 'MATC') PPI 'TRAN' ;
  792. Finsi ;
  793.  
  794. Si TVNP ;
  795. cxre = 'KMF' (rvp . 'MBTR') PPI 'TRAN' ;
  796. cpre = cpre et cxre ;
  797. Finsi ;
  798.  
  799. *******PROJ MDM1
  800. Si TMDM1 ;
  801. * consistence selon (Gresho)
  802. gradpres = 'KOPS' MDM1 '*' cpre ;
  803. Sinon ;
  804. * consistence selon (Guermond)
  805. gradpres = cpre ;
  806. Finsi ;
  807.  
  808. oublier cpre ;
  809. rv.'INCO'.'GRADPRES' = 'NOMC' lcu lc gradpres;
  810.  
  811. *Formulation en u grad p
  812. Si (Exist rvp 'MATG');
  813. s2 = sf - (rv.'INCO'.'GRADPRES') + st ;
  814. Sinon ;
  815. *Formulation en p div u
  816. s2 = sf + (rv.'INCO'.'GRADPRES') + st ;
  817. Finsi ;
  818.  
  819. 'FINSI' ;
  820.  
  821. *******PROJ t n-1 FIN*****
  822. *******PROJ MDM1 '*' C P -> rv.'INCO'.'GRADPRES' FIN*****
  823. *******PROJ t n-1 FIN*****
  824. *******PROJ si (p div u) -> S2 = F + C P + st FIN*****
  825. *******PROJ t n-1 FIN*****
  826. *******PROJ si (u grad p) -> S2 = F - C P + st FIN*****
  827. *******PROJ/////////////////////////////////////////////////////////////
  828. 'FINSI' ;
  829.  
  830. ********** FIN Traitement PRESSION ************************
  831. * mess ' FIN Traitement PRESSION' ;
  832.  
  833. 'SI' ('EXISTE' rv 'CLIM') ;
  834. s1 = rv . 'CLIM' ;
  835. 'SINON' ;
  836. s1=' ' ;
  837. 'FINSI' ;
  838. rv . 'S2' = s2 ;
  839.  
  840. *******************************************************************
  841. * Résolution hors QDM méthode de projection
  842. 'SI'((NON testprj) ou (EGA mdfdt 0));
  843. *mess '* Résolution hors QDM méthode de projection ';
  844.  
  845. rv . 'METHINV' . 'XINIT' = rv.'resmn' ;
  846.  
  847. 'SI' ('EXISTE' rv 'GPROJ') ;
  848. res = GRESP ma1 s1 s2 rv ;
  849. 'SINON' ;
  850.  
  851. Si (('EGA' rv.'METHINV'.'TYPINV' 1) et TRESOU) ;
  852. mess ' ILU-Crout on utilise RESOU ' ;
  853. ma1= kops 'RIMA' ma1 'NSYM' ;
  854. incpres=extr rv.'LISTINCO' 1 ;
  855. opti INCO incpres incpres ;
  856.  
  857. Si('EXIS' rv 'trico1') ;
  858. trico=rv.'trico1' ;
  859. Sinon ;
  860. inc=extr rv.clim 'COMP' ;
  861. trico = 'TABLE' 'ESCLAVE' ;
  862. rv.'trico1'=trico ;
  863. ncmp=dime inc; ;
  864. Repeter BINC ncmp; ;
  865. ico = extr &BINC inc ; ;
  866. rclim = exco rv.'CLIM' ico ico ;
  867. mip=extr rclim 'MAILLAGE' ;
  868. trico.(&BINC) = (BLOQ mip ico) ;
  869. Fin BINC ;
  870. Finsi ;
  871. S1 = vide 'CHPOINT'/'DISCRET' ;
  872. Repeter BINC ncmp ;
  873. ico = extr &BINC inc ;
  874. rclim = exco rv.'CLIM' ico ico ;
  875. rigp = trico.&BINC ;
  876. S1 = S1 et (DEPI RIGP rclim) ;
  877. FIN BINC ;
  878.  
  879. rigp = et trico ;
  880. ma1 = ma1 et rigp ;
  881. Finsi ;
  882.  
  883. res = KRESP ma1 'TYPI' (rv . 'METHINV')
  884. 'CLIM' s1
  885. 'SMBR' s2
  886. 'IMPR' IMPKRES ;
  887. 'FINSI' ;
  888.  
  889. 'FINSI' ;
  890.  
  891. 'SI' (testprj et (non(EGA mdfdt 0)));
  892. *******PROJ*************************************************************
  893. *******PROJ Résolution QDM DEBUT*** *******
  894. *******PROJ (On éclate les résolutions) DEBUT*** *******
  895.  
  896. * Résolution QDM méthode de projection (On éclate les résolutions)
  897. mess ' Résolution QDM méthode de projection';
  898.  
  899. *? lpart = 'EXTR' ma1 'COMP' ;
  900. lpart = 'KOPS' 'EXTRCOUP' ma1;
  901. nbpart = dime lpart ;
  902. ** mess ' Liste des composantes' ;
  903. ** list lpart ;
  904.  
  905. $ma1 =table 'ESCLAVE';
  906. $s1 =table 'ESCLAVE';
  907. $s2 =table 'ESCLAVE';
  908. $resmn=table 'ESCLAVE';
  909. $tab1 =table 'ESCLAVE';
  910. Si ('EXIST' RV '$trico') ;
  911. $trico = RV.'$trico' ;
  912. sinon ;
  913. $trico =table 'ESCLAVE' ;
  914. repeter Bclcom nbpart;
  915. $trico.&Bclcom = table 'ESCLAVE';
  916. RV.'$trico' = $trico ;
  917. Fin Bclcom ;
  918. Finsi ;
  919.  
  920. repeter Bclcom nbpart ;
  921. *? nmc='EXTR' lpart &Bclcom ;
  922. nmc=lpart.&Bclcom ;
  923. ** mess ' ---------> NMC=' NMC &bclcom ;
  924.  
  925. *? MA1i = 'EXTR' ma1 (mots nmc) (mots nmc) ;
  926. MA1i = 'KOPS' 'EXTRINCO' nmc nmc ma1 ;
  927. $ma1 .&Bclcom = MA1i ;
  928. *? $s1 .&Bclcom = exco s1 nmc nmc ;
  929. *? $s2 .&Bclcom = exco s2 nmc nmc ;
  930. *? resmni = exco (rv.'resmn') nmc 'NOID' nmc ;
  931. $s1 .&Bclcom = exco s1 nmc 'NOID' ;
  932. $s2 .&Bclcom = exco s2 nmc 'NOID' ;
  933. resmni = exco (rv.'resmn') nmc 'NOID' ;
  934. TAB1 = copie rv . 'METHINV' ;
  935. * TAB1 = rv . 'METHINV' ;
  936. TAB1 . 'XINIT' = resmni ;
  937. $tab1 .&Bclcom = TAB1 ;
  938.  
  939. *-------------------------------------------------------------------------
  940. *mess ' Mise à jour du préconditionnement';
  941. 'SI' ('>EG' TAB1 . 'TYPINV' 2) ;
  942. lword1 lword2 = 'KOPS' 'EXTRNINC' MA1i ;
  943. word1 = 'EXTR' lword1 1 ;
  944.  
  945. 'SI' ('NON' ('EXIS' rv 'TABRES')) ;
  946. rv . 'TABRES' = 'TABLE' ;
  947. 'FINSI' ;
  948. TABRES=rv.'TABRES';
  949.  
  950. 'SI' (TAB1 . 'CALPREC') ;
  951. 'SI' ('NON' ('EXIS' TABRES word1)) ;
  952. TABRES . word1 = 'TABLE' ;
  953. TABRES . word1 . 'MATASS' = MA1i ;
  954. TABRES . word1 . 'MAPREC' = MA1i ;
  955. 'MESS' 'On recalcule le preconditionneur';
  956. 'SINON' ;
  957. TABRES . word1 . 'MATASS' = MA1i ;
  958. TABRES . word1 . 'MAPREC' = MA1i ;
  959. 'MESS' 'On recalcule le preconditionneur';
  960. 'FINSI' ;
  961. 'FINSI' ;
  962. TAB1 . 'MATASS' = TABRES.word1.'MATASS' ;
  963. TAB1 . 'MAPREC' = TABRES.word1.'MAPREC' ;
  964. 'FINSI' ;
  965. *-------------------------------------------------------------------------
  966. Fin Bclcom ;
  967.  
  968. Si TKPR ;
  969. si IMPARA ;
  970. mess '..........';
  971. mess ' Les résolutions sont traitées en parallèle' ;
  972. mess '..........';
  973. finsi ;
  974.  
  975. res = ASSI TOUS KRES $ma1 'TYPI' $tab1
  976. 'CLIM' $s1
  977. 'SMBR' $s2
  978. 'IMPR' IMPKRES ;
  979. res=etg res ;
  980.  
  981. Sinon ;
  982. si IMPARA ;
  983. mess '..........';
  984. mess ' Les résolutions sont traitées séquentiellement' ;
  985. mess '..........';
  986. finsi ;
  987. res mm1= kops 'MATRIK' ;
  988. $trico = rv.'$trico' ;
  989.  
  990. REPETER BCLCOM nbpart ;
  991. TYPI=$tab1. &bclcom .'TYPINV' ;
  992.  
  993. Si (('EGA' TYPI 1) et TRESOU) ;
  994. matcom= $ma1.&bclcom ;
  995. matcom= kops 'RIMA' matcom 'NSYM' ;
  996.  
  997. Si(NON ('EXIST' $trico.&bclcom &BINC)) ;
  998. inc=extr ($s1.&bclcom) 'COMP' ;
  999. ncmp=dime inc; ;
  1000. Repeter BINC ncmp; ;
  1001. ico = extr &BINC inc ; ;
  1002. opti 'INCO' ico ico ;
  1003. rclim = exco ico ($s1.&bclcom) ico ;
  1004. mip=extr rclim 'MAILLAGE' ;
  1005. $trico.&bclcom.(&BINC) = (BLOQ mip ico) ;
  1006. Fin BINC ;
  1007. Finsi ;
  1008. S1 = vide 'CHPOINT'/'DISCRET' ;
  1009. Repeter BINC ncmp ;
  1010. ico = extr &BINC inc ;
  1011. rclim = exco ico ($s1.&bclcom) ico ;
  1012. rigp = $trico.(&bclcom).&BINC ;
  1013. S1 = S1 et (DEPI RIGP rclim) ;
  1014. FIN BINC ;
  1015.  
  1016. rigp = etg ($trico.&bclcom) ;
  1017.  
  1018. matcom = matcom et rigp ;
  1019.  
  1020. resi = 'RESOU' matcom ($s2.&bclcom et S1) ;
  1021. resi = resi 'CHAN' 'ATTRIBUT' 'NATURE' 'DISCRET' ;
  1022.  
  1023. Sinon ;
  1024. resi= KRES ($ma1.&bclcom) 'TYPI' ($tab1.&bclcom)
  1025. 'CLIM' ($s1.&bclcom)
  1026. 'SMBR' ($s2.&bclcom)
  1027. 'IMPR' IMPKRES ;
  1028. Finsi ;
  1029. res=res et resi ;
  1030. FIN BCLCOM ;
  1031. Finsi;
  1032.  
  1033. *mess ' Fin Résolution QDM méthode de projection';
  1034. * Fin Résolution QDM méthode de projection
  1035. *-------------------------------------------------------------------------------
  1036. *******PROJ Résolution QDM -> res FIN*****
  1037. *******PROJ (On éclate les résolutions) FIN*****
  1038. *******PROJ/////////////////////////////////////////////////////////////
  1039. 'FINSI' ;
  1040.  
  1041. 'SI' testprj ;
  1042. *******PROJ*************************************************************
  1043. *******PROJ ETAPE DE PROJECTION DEBUT*** *******
  1044. *******PROJ on calcul cun (alias c U tilde) DEBUT*** *******
  1045. * mess 'ETAPE DE PROJECTION ' ;
  1046. * _n
  1047. * C U
  1048. cun = ('KMF' (rvp . 'MATC') res) ;
  1049. Si TVNP ;
  1050. cxn = ('KMF' (rvp . 'MBTR') res) ;
  1051. cun = cun et cxn ;
  1052. Finsi ;
  1053.  
  1054. * mess ' On calcule les seconds membres de l équation de pression ' ;
  1055. * mess ' s ils existent (opérateurs FIMP) ' ;
  1056.  
  1057. 'REPETER' blocpj ('DIME' (rvp . 'LISTOPER')) ;
  1058. nomper = 'EXTRAIRE' &blocpj (rvp . 'LISTOPER') ;
  1059. notable= 'MOT' ('TEXTE' ('CHAINE' &blocpj nomper)) ;
  1060. si (ega nomper 'FIMP ');
  1061. * mess 'Seconds membres de l équation de pression Opérateur ' nomper ;
  1062. msi mai=('TEXTE' nomper) (rvp . notable) ;
  1063. cun = cun et msi ;
  1064. finsi ;
  1065. 'FIN' blocpj ;
  1066.  
  1067. cun = cun * ROW * (-1./dt) ;
  1068.  
  1069. rvp . 'METHINV' . 'XINIT' = rv.'resmnp' ;
  1070.  
  1071. sl= KRESP matpr 'TYPI' (rvp . 'METHINV')
  1072. 'CLIM' (rvp . 'CLIM' )
  1073. 'SMBR' cun
  1074. 'IMPR' IMPKRES ; oublier cun ;
  1075.  
  1076. rv.'resmnp' = sl ;
  1077. ctl = 'KMF' (rvp . 'MATC') sl 'TRAN' ;
  1078. Si TVNP ;
  1079. cxl = 'KMF' (rvp . 'MBTR') sl 'TRAN' ;
  1080. ctl = ctl + cxl ;
  1081. Finsi ;
  1082.  
  1083. * elimination of end of step velocity (Si exist PNM2) (on ne corrige pas)
  1084. 'SI'(NON TPNM2);
  1085. 'SI' (NON ('EXIST' (rv.'INCO') 'PNM2')) ;
  1086. a=nomc lcu lc ('KOPS' IDigv '*' ctl) ;
  1087. res = res + ((1./ROW)*a*dt) ;
  1088. 'FINSI' ;
  1089. 'FINSI' ;
  1090.  
  1091. oublier ctl ;
  1092.  
  1093. *******PROJ -> (alias c U tilde) FIN*****
  1094. *******PROJ -> sl (alias lambda) FIN*****
  1095. *******PROJ -> on corrige u FIN*****
  1096. *******PROJ/////////////////////////////////////////////////////////////
  1097. 'FINSI' ;
  1098.  
  1099. ***** Avancement en temps
  1100. *? Si (testprj et ('EGA' mdfdt 0)) ; IMPTCRR=RV.'IMPR' ; finsi ;
  1101. Si ('EGA' mdfdt 0) ; IMPTCRR=RV.'IMPR' ; finsi ;
  1102. IMPKRES=0 ;
  1103. * mess 'On passe dans TCRR ' ;
  1104. lcmp= extr res 'COMP';
  1105. Si('EXIST' lcmp 'LX') ;
  1106. ag= extr (exco res 'LX') 'MAILLAGE';
  1107. ar=extr res 'MAILLAGE' ;
  1108. atn= diff ar ag;
  1109. res=redu res atn ;
  1110. finsi ;
  1111.  
  1112. eps = 'TCRR' res omeg (rv . 'INCO') 'IMPR' IMPTCRR ;
  1113.  
  1114. rv.'METHINV'.'CALPREC' = FAUX ;
  1115. 'SI' (testprj) ;
  1116. rvp.'METHINV'.'CALPREC'= FAUX ;
  1117. 'FINSI' ;
  1118. rv.'resmn' = res ;
  1119. 'MENAGE' ;
  1120. *
  1121. 'SI' (rv . 'STOPITER') ;
  1122. rv . 'STOPITER' = FAUX ;
  1123. 'QUITTER' bloci ;
  1124. 'FINSI' ;
  1125. 'FIN' bloci ;
  1126. irt=0 ;
  1127.  
  1128. * mess ' ITMA= ' (rv . 'ITMA') ' mdfdt= ' mdfdt ;
  1129. 'SI' ('EGA' (rv . 'ITMA') 0) ;
  1130. * mess ' ON PASSE PLUS DS TCNM>>>>>>>>>>>>>>' ;
  1131. irt = 'TCNM' rv 'NOUP';
  1132. 'SINON' ;
  1133. * mess ' ON PASSE DS TCNM>>>>' (rv . 'ITMA') mdfdt;
  1134. irt = 'TCNM' rv ;
  1135. 'FINSI' ;
  1136.  
  1137. ***** Avancement en temps algorithme de projection
  1138. *******PROJ*************************************************************
  1139. *******PROJ P(n+1) = P(n) + sl DEBUT*** *******
  1140. * Algorithme de projection P(n+1) = P(n) + sl
  1141. 'SI' testprj ;
  1142.  
  1143. 'SI' (NON ('EXIST' (rv.'INCO') 'PRESSION'));
  1144. rv.'INCO'.'PRESSION' = sl;
  1145. Si TPNM2 ; rv.'INCO'.'PNM2' = sl ; Finsi ;
  1146. 'SINON' ;
  1147. PNM1=rv.'INCO'.'PRESSION';
  1148. si ( EGA ISCHT 1) ;
  1149. PN=PNM1 + (1.5*sl) ;
  1150. sinon ;
  1151. PN=PNM1 + sl ;
  1152. finsi ;
  1153.  
  1154. Si TPNM2 ; rv.'INCO'.'PNM2'=PNM1 ; Finsi ;
  1155. rv.'INCO'.'PRESSION'=PN ;
  1156. 'FINSI' ;
  1157.  
  1158. Si ((EGA TYPROJ 'PSCT') ou (EGA TYPROJ 'PENA')) ;
  1159. rv.'INCO'.'PRESSION' = sl;
  1160. Finsi ;
  1161.  
  1162. 'OUBLIER' sl ;
  1163. 'FINSI' ;
  1164. *******PROJ P(n+1) = P(n) + sl FIN*****
  1165. *******PROJ/////////////////////////////////////////////////////////////
  1166. ***** Avancement en temps FIN
  1167.  
  1168.  
  1169. 'SI' testran ;
  1170. rv . 'CO' . 'VITESSE' ='KOPS' (rv . 'INCO' . nomvi)
  1171. '-' (rv . 'SEDIM') ;
  1172. k = 'ABS' (rv . 'INCO' . 'KN') ;
  1173. e = 'ABS' (rv . 'INCO' . 'EN') ;
  1174. k = 'KOPS' ('KOPS' k '*' k) '/' e ;
  1175. dif = 'KOPS' ('KOPS' k '*' 0.09) '+' (rv . 'COEF') ;
  1176. rv . 'CO' . 'DIFFU' = 'NOEL' rvpd dif ;
  1177. rv . 'CO' . 'TEMPERA' = rv . 'INCO' . 'CN' ;
  1178. 'FINSI' ;
  1179. rv.'METHINV'.'CALPREC' = FAUX ;
  1180. 'SI' (testprj) ;
  1181. rvp.'METHINV'.'CALPREC'= FAUX ;
  1182. 'FINSI' ;
  1183. 'MENAGE' ;
  1184.  
  1185. 'SI' ('EGA' irt 1) ;
  1186. 'MESSAGE' ' Temps final atteint : '
  1187. (rv . 'PASDETPS' . 'TPS') ;
  1188. 'QUITTER' bloc1 ;
  1189. 'FINSI' ;
  1190. 'SI' (rv . 'STOPPDT') ;
  1191. rv . 'STOPPDT' = FAUX ;
  1192. 'MESSAGE' ' Arret demandé au temps : ' (rv . 'PASDETPS' . 'TPS') ;
  1193. 'QUITTER' bloc1 ;
  1194. 'FINSI' ;
  1195. 'FIN' bloc1 ;
  1196.  
  1197. 'SI' testpr ;
  1198. rvp . 'PRESSION' = 'KCHT' rvpd 'SCAL' 'CENTRE'
  1199. (rvp . 'PRESSION') ;
  1200. rvp . 'PN' = 'ELNO' rvpd
  1201. (rvp . 'PRESSION') ;
  1202. 'FINSI' ;
  1203. ************************ E X E C ************************************
  1204. 'FINPROC' ;
  1205.  
  1206.  
  1207.  
  1208.  
  1209.  
  1210.  
  1211.  
  1212.  
  1213.  
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  

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