Télécharger exec.procedur

Retour à la liste

Numérotation des lignes :

  1. * EXEC PROCEDUR GOUNAND 25/11/12 21:15:13 12399
  2. ************************************************************************
  3. * EXECUTE UN ALGORITHME DÉCRIT DANS UNE TABL RV DE TYPE EQEX
  4. * CETTE TABL EST CRÉÉE PAR L'OPÉRATEUR EQEX
  5. ************************************************************************
  6. * HISTORIQUE
  7. * 20/12/99 = Rajout de la gestion de la matrice servant à l'assemblage
  8. * (rv.'METHINV'.'MATASS')
  9. * 12/05/06 = ajout STOPITER, NUITER et STOPPDT
  10. * 21/12/07 = ajout projection algébrique incrémentale (cf. GRESP)
  11. * 06/05/14 = ajout test DFDT : qd niter>1, on vérifie que le 2eme
  12. * argument est distinct de linconnue
  13. * 05/06/14 = on teste qd niter>1 et itma>1, car certains cas utilisent
  14. * DFDT pour pénaliser (dvisi et ccar3)
  15. * 05/02/16 = ajout de l'historique RV.'INCO'.'HIST'
  16. * 16/05/18 = corrections mineures + lifting
  17. ************************************************************************
  18. DEBP EXEC RV*'TABLE' NPARTI/'ENTIER' LOPP/'LISTMOTS' ;
  19. *
  20. *
  21. *
  22. *
  23. * +-------------------------------------------------------------------+
  24. * | |
  25. * | I N I T I A L I S A T I O N S E T V É R I F I C A T I O N S |
  26. * | |
  27. * +-------------------------------------------------------------------+
  28. *
  29. *
  30. ************************************************************************
  31. *
  32. * Ajout test DFDT : qd niter>1, on vérifie que le 2eme argument est
  33. * distinct de linconnue (anomalie #8050)
  34. SI (((RV.'NITER') > 1) ET ((RV.'ITMA') > 1)) ;
  35. NOP = DIME (RV.'LISTOPER') ;
  36. REPE IOP NOP ;
  37. NOMPER = EXTR (RV.'LISTOPER') &IOP ;
  38. SI (EGA NOMPER 'DFDT') ;
  39. NOMTAB = CHAI &IOP NOMPER ;
  40. RVN = RV.NOMTAB ;
  41. TYPARG2 = TYPE RVN.'ARG2' ;
  42. SI (EGA TYPARG2 MOT) ;
  43. NOMUN = EXTR (RVN.'LISTINCO') 1 ;
  44. SI (EGA NOMUN RVN.'ARG2') ;
  45. ERRE 1038 ;
  46. FINS ;
  47. FINS ;
  48. FINS ;
  49. FIN IOP ;
  50. FINS ;
  51. *
  52. ************************************************************************
  53. *
  54. * Utilisation de RESOU plutot que KRES ?
  55. TRESOU = FAUX ;
  56. SI (EXIS RV 'TRESOU') ;
  57. TRESOU = RV.'TRESOU' ;
  58. FINS ;
  59. *
  60. ************************************************************************
  61. *
  62. * Parallélisation des résolutions lorsqu'elles sont découplées
  63. TKPR = FAUX ;
  64. SI (EXIS RV 'TKPR') ;
  65. TKPR = RV.'TKPR' ;
  66. FINS ;
  67. *
  68. ************************************************************************
  69. *
  70. * Impressions liées au parallélisme
  71. IMPARA = FAUX ;
  72. SI (EXIS RV 'IMPARA') ;
  73. IMPARA = RV.'IMPARA' ;
  74. FINS ;
  75. *
  76. ************************************************************************
  77. *
  78. * Niveau d'impression global
  79. IIMPR = RV.'IMPR' ;
  80. *
  81. ************************************************************************
  82. *
  83. * Liste des opérateurs potentiellement parallélisables
  84. * LOPERPAR = MOTS 'NS' 'TSCA' 'DFDT' 'KONV' 'LAPN' 'FROT' 'FIMP' 'TOIMP' ;
  85. * LOPERPAR = MOTS 'NS' 'TSCA' 'DFDT' 'LAPN' 'KONV' ;
  86. LOPERPAR = MOTS 'NS' 'TSCA' 'DFDT' ;
  87. * LOPERPAR = MOTS 'NSQT' ;
  88. *
  89. * Parallélisation du calcul des matrices élémentaires si :
  90. * 1) RV.'TCPT' = VRAI
  91. * 2) NPART > 1
  92. * 3) On a bien des objets MMODEL et non pas des tables 'DOMAINE'
  93. *
  94. TCPT = FAUX ;
  95. SI (EXIS RV 'TCPT') ;
  96. TCPT = RV.'TCPT' ;
  97. FINS ;
  98. *
  99. * Préparation pour paralléliser le calcul des matrices élémentaires
  100. SI TCPT ;
  101. *
  102. * On partitionne en fonction du nombre d'assstants (= processeurs)
  103. * par défaut ou bien N (si précisé dans l'instruction EXEC RV N)
  104. SI (EXIS NPARTI) ;
  105. NPART = NPARTI ;
  106. SINON ;
  107. NPART = VALE 'ASSI' ;
  108. FINS ;
  109. *
  110. SI (NON (EXIS RV 'TABPARTM')) ;
  111. TABPARTM = TABL ;
  112. RV.'TABPARTM' = TABPARTM ;
  113. *
  114. REPE IOP (DIME (RV.'LISTOPER')) ;
  115. NOMPER = EXTR &IOP (RV.'LISTOPER') ;
  116. NOMTAB = CHAI &IOP NOMPER ;
  117. RVN = RV.NOMTAB ;
  118. $MD = RVN.'DOMZ' ;
  119. TYM = TYPE $MD ;
  120. *
  121. SI (NON (EGA TYM 'MMODEL')) ;
  122. TCPT = FAUX ;
  123. QUIT IOP ;
  124. FINS ;
  125. *
  126. SI (EXIS LOPERPAR NOMPER) ;
  127. SI IMPARA ;
  128. MESS 'On parallélise ' NOMPER ' NPART =' NPART ;
  129. FINS ;
  130. SI (NON (EXIS TABPARTM $MD)) ;
  131. $MDP = PART 'ARLE' NPART $MD ;
  132. *
  133. $BID = TABL 'ESCLAVE' ;
  134. REPE BIBI NPART ;
  135. * $BID.&BIBI = TABL 'KIZX' ;
  136. $BID.&BIBI = COPI RVN ;
  137. $BID.&BIBI.'DOMZ'= $MDP.&BIBI ;
  138. $TDZ = DOMA ($BID.&BIBI.'DOMZ') 'TABL' ;
  139. $BID.&BIBI.'TDOMZ'= $TDZ ;
  140. FIN BIBI ;
  141. *
  142. TABPARTM.'$bid' = $BID ;
  143. * TABPARTM.'$mdp' = $MDP ;
  144. RVN.'$mdp' = $MDP ;
  145. RVN.'$bid' = $BID ;
  146. FINS ;
  147. SINON ;
  148. SI IMPARA ;
  149. MESS 'On ne parallélise pas ' NOMPER ;
  150. FINS ;
  151. FINS ;
  152. *
  153. FIN IOP ;
  154. *
  155. SINON ;
  156. TABPARTM = RV.'TABPARTM' ;
  157. FINS ;
  158. *
  159. SI (EGA (DIME TABPARTM) 0) ;
  160. TCPT=FAUX ;
  161. SI IMPARA ;
  162. MESS 'Il n y a pas d opérateurs à paralléliser !' ;
  163. FINS ;
  164. FINS ;
  165. *
  166. SI (NPART <EG 1) ;
  167. SI IMPARA ;
  168. MESS 'NPART <EG 1 : On ne partitionne pas ' ;
  169. FINS ;
  170. TCPT = FAUX ;
  171. FINS ;
  172. *
  173. FINS ;
  174. *
  175. ************************************************************************
  176. *
  177. * Initialisation des critères d'arrêt (type LOGIQUE) positionnables
  178. * par l'utilisateur pendant la simulation
  179. *
  180. * (boucle interne)
  181. SI (NON (EXIS RV 'STOPITER')) ;
  182. RV.'STOPITER' = FAUX ;
  183. FINS ;
  184. *
  185. * (boucle externe)
  186. SI (NON (EXIS RV 'STOPPDT')) ;
  187. RV.'STOPPDT' = FAUX ;
  188. FINS ;
  189. *
  190. ************************************************************************
  191. *
  192. * LOGIQUE forçant le recalcul de la matrice de pression a chaque pas
  193. * de temps (boucle externe)
  194. CALPRE = FAUX ;
  195. SI (EXIS RV 'CALPRE') ;
  196. VERTYTAB RV 'CALPRE' 'LOGIQUE' ;
  197. CALPRE = RV.'CALPRE' ;
  198. FINS ;
  199. *
  200. ************************************************************************
  201. *
  202. * Option 'XEQUA' (non documentée...)
  203. SI (NON (EXIS RV 'XEQUA')) ;
  204. RV.'XEQUA' = FAUX ;
  205. FINS ;
  206. *
  207. ************************************************************************
  208. ************************************************************************
  209. ************************************************************************
  210. ************************************************************************
  211. *
  212. * Bifurcation gérée en interne (l'indice 'NAVISTOK' n'a pas vocation
  213. * a être ajouté par l'utilisateur)
  214. SI (EGA (RV.'NAVISTOK') 0) ;
  215. EXAC RV ;
  216. QUIT EXEC ;
  217. FINS ;
  218. *
  219. ************************************************************************
  220. ************************************************************************
  221. ************************************************************************
  222. ************************************************************************
  223. *
  224. * Schéma temporel pour Navier-Stokes
  225. TESTPR = EXIS RV 'PRESSION' ;
  226. TESTPRJ = EXIS RV 'PROJ' ;
  227. *
  228. SI TESTPR ;
  229. RVP = RV.'PRESSION' ;
  230. ACHP MATPR= KOPS 'MATRIK' ;
  231. RVP.'MATP' = MATPR ;
  232. FINS ;
  233. *
  234. SI TESTPRJ ;
  235. RVP = RV.'PROJ' ;
  236. FINS ;
  237. *
  238. SI (IIMPR > 0) ;
  239. SI TESTPR ;
  240. MESS 'Algorithme semi explicite (ANCIEN)' ;
  241. MESS '==================================' ;
  242. FINS ;
  243. SI TESTPRJ ;
  244. MESS 'Algorithme de Projection' ;
  245. MESS '========================' ;
  246. FINS ;
  247. SI (NON (TESTPR OU TESTPRJ)) ;
  248. MESS 'Algorithme standard implicite ou explicite ' ;
  249. MESS '===========================================' ;
  250. FINS ;
  251. FINS ;
  252. *
  253. ************************************************************************
  254. *
  255. * (ancien algo)
  256. * Choix du type de schéma de projection : |
  257. * PSCT VPI1 VPI2 PENA
  258. * -----------------------------------------+-----+-----+-----++------
  259. * TGRAD = Formulation en gradient | NON | NON | NON || NON
  260. * TMDM1 = Correction Gresho | NON | OUI | NON || NON
  261. * TPNM2 = Elimination end of step velocity | NON | NON | OUI || NON
  262. * |
  263. * (nouvel algo)
  264. TYPROJ = 'VPI1' ;
  265. ROW = 1. ;
  266. SI (EXIS RV 'TYPROJ') ;
  267. TYPROJ=RV.'TYPROJ' ;
  268. SI (NON (EXIS (MOTS 'PSCT' 'VPI1' 'VPI2' 'PENA') TYPROJ)) ;
  269. MESS '*****************************************************' ;
  270. MESS ' ERREUR ERREUR ERREUR ERREUR ERREUR ERREUR ' ;
  271. MESS ' ' ;
  272. MESS ' Le mot ' TYPROJ ' n existe pas dans la liste. ' ;
  273. MESS ' Les méthodes de projection autorisées sont : ' ;
  274. MESS ' VPI1, VPI2, PSCT et PENA ' ;
  275. MESS '*****************************************************' ;
  276. ERRE 21 ;
  277. QUIT EXEC ;
  278. FINS ;
  279. FINS ;
  280. *
  281. SI (EGA TYPROJ 'PSCT') ;
  282. TGRAD = FAUX ;
  283. TMDM1 = FAUX ;
  284. TPNM2 = FAUX ;
  285. FINS ;
  286. *
  287. SI (EGA TYPROJ 'VPI1') ;
  288. TGRAD = FAUX ;
  289. TMDM1 = VRAI ;
  290. TPNM2 = FAUX ;
  291. FINS ;
  292. *
  293. SI (EGA TYPROJ 'VPI2') ;
  294. TGRAD = FAUX ;
  295. TMDM1 = FAUX ;
  296. TPNM2 = VRAI ;
  297. FINS ;
  298. *
  299. SI (EGA TYPROJ 'PENA') ;
  300. TGRAD = FAUX ;
  301. TMDM1 = FAUX ;
  302. TPNM2 = FAUX ;
  303. FINS ;
  304. *
  305. ************************************************************************
  306. *
  307. * Affectations différentes selon que l'on est en 2D ou en 3D
  308. IDIM1 = VALE 'DIME' ;
  309. NOMVI = RV.'NOMVI' ;
  310. SI (EGA IDIM1 2) ;
  311. VNUL = 0.D0 0.D0 ;
  312. VUNI = 1.D0 1.D0 ;
  313. CNVI1 = CHAI '1' NOMVI ;
  314. CNVI2 = CHAI '2' NOMVI ;
  315. LC = MOTS CNVI1 CNVI2 ;
  316. LCU = MOTS 'UX' 'UY' ;
  317. SINON ;
  318. VNUL = 0.D0 0.D0 0.D0 ;
  319. VUNI = 1.D0 1.D0 1.D0 ;
  320. CNVI1 = CHAI '1' NOMVI ;
  321. CNVI2 = CHAI '2' NOMVI ;
  322. CNVI3 = CHAI '3' NOMVI ;
  323. LC = MOTS CNVI1 CNVI2 CNVI3 ;
  324. LCU = MOTS 'UX' 'UY' 'UZ' ;
  325. FINS ;
  326. *
  327. ************************************************************************
  328. *
  329. * Facteur de relaxation
  330. SI (NON (EXIS RV 'OMEGA')) ;
  331. OMEG = 1.D0 ;
  332. SINON ;
  333. OMEG = RV.'OMEGA' ;
  334. FINS ;
  335. *
  336. ************************************************************************
  337. *
  338. * Traitement d'un cas particulier = verrue (non documenté...)
  339. TESTRAN = TESTPR ET (EXIS RV 'CO') ;
  340. *
  341. ************************************************************************
  342. *
  343. * Initialisation de la table d'historique
  344. SI (NON (EXIS RV 'HIST')) ;
  345. RV.'HIST' = TABL ;
  346. FINS ;
  347. *
  348. ************************************************************************
  349. *
  350. * Nombre d'itérations externes (pas de temps)
  351. ITMAX = RV.'ITMA' ;
  352. SI (ITMAX < 1) ;
  353. ITMAX = 1 ;
  354. FINS ;
  355. *
  356. ************************************************************************
  357. *
  358. * Fréquence d'impression du solveur KRES
  359. IMPKRES = 0 ;
  360. *
  361. ************************************************************************
  362. *
  363. * Fréquence d'impression des pas de temps (opérateur TCRR)
  364. IMPTCRR = 0 ;
  365. SI (IIMPR >EG 0) ;
  366. SI (ITMAX EGA 1) ;
  367. IMPTCRR = 1 ;
  368. FINS ;
  369. SI TESTPRJ ;
  370. IMPTCRR = 1 ;
  371. FINS ;
  372. SI (NON (TESTPR OU TESTPRJ)) ;
  373. IMPTCRR = 1 ;
  374. FINS ;
  375. FINS ;
  376. *
  377. ************************************************************************
  378. *
  379. * FCPRECT : fréquence de recalcul des préc. dans la boucle externe
  380. * FCPRECI : fréquence de recalcul des préc. dans la boucle interne
  381. * FCPRECTP : idem pour la matrice de pression
  382. * FCPRECIP : idem pour la matrice de pression
  383. FCPRECT = RV. 'METHINV'.'FCPRECT' ;
  384. FCPRECI = RV. 'METHINV'.'FCPRECI' ;
  385. SI TESTPRJ ;
  386. FCPRECTP = RVP.'METHINV'.'FCPRECT' ;
  387. FCPRECIP = RVP.'METHINV'.'FCPRECI' ;
  388. FINS ;
  389. *
  390. * Force le calcul des préconditionneurs pour la première itération
  391. SI (NON (EXIS (RV.'METHINV') 'CALPREC')) ;
  392. RV.'METHINV'.'CALPREC' = VRAI ;
  393. FINS ;
  394. SI TESTPRJ ;
  395. SI (NON (EXIS (RVP.'METHINV') 'CALPREC')) ;
  396. RVP.'METHINV'.'CALPREC' = VRAI ;
  397. FINS ;
  398. FINS ;
  399. *
  400. ************************************************************************
  401. *
  402. * RESMN : résidu au pas de temps ou à l'itération interne précédente
  403. * RESMNP : idem pour la pression
  404. SI (NON (EXIS RV 'resmn')) ;
  405. RESMN MAPREC = KOPS 'MATRIK' ;
  406. RV.'resmn' = RESMN ;
  407. FINS ;
  408. SI (NON (EXIS RV 'resmnp')) ;
  409. RESMNP MAPRECP = KOPS 'MATRIK' ;
  410. RV.'resmnp' = RESMNP ;
  411. FINS ;
  412. *
  413. *
  414. *
  415. *
  416. * +-------------------------------------------------------------------+
  417. * | |
  418. * | A L G O R I T H M E D E R É S O L U T I O N |
  419. * | |
  420. * +-------------------------------------------------------------------+
  421. *
  422. * *******************************************
  423. * *******************************************
  424. * DEBUT DE LA BOUCLE EXTERNE (= PAS DE TEMPS)
  425. * *******************************************
  426. * *******************************************
  427. REPE BLOC1 ITMAX ;
  428. *
  429. * Doit-on recalculer les préconditionneurs ?
  430. SI (MULT &BLOC1 FCPRECT) ;
  431. RV.'METHINV'.'CALPREC' = VRAI ;
  432. FINS ;
  433. SI TESTPRJ ;
  434. SI (MULT &BLOC1 FCPRECTP) ;
  435. RVP.'METHINV'.'CALPREC' = VRAI ;
  436. FINS ;
  437. FINS ;
  438. *
  439. * Doit-on recalculer la matrice de pression ?
  440. TESTP1 = FAUX ;
  441. SI (TESTPR OU TESTPRJ) ;
  442. SI CALPRE ;
  443. TESTP1 = VRAI ;
  444. FINS ;
  445. SI (NON (EXIS RVP 'MATC')) ;
  446. TESTP1 = VRAI ;
  447. FINS ;
  448. FINS ;
  449. *
  450. *
  451. * ********************************************
  452. * ********************************************
  453. * DEBUT DE LA BOUCLE INTERNE (= NON-LINEARITE)
  454. * ********************************************
  455. * ********************************************
  456. REPE BLOCI (RV.'NITER') ;
  457. *
  458. * Numéro de l'itération interne courante
  459. RV.'NUITER' = &BLOCI ;
  460. *
  461. * Doit-on recalculer les préconditionneurs ?
  462. SI (MULT &BLOCI FCPRECI) ;
  463. RV.'METHINV'.'CALPREC' = VRAI ;
  464. FINS ;
  465. SI TESTPRJ ;
  466. SI (MULT &BLOCI FCPRECIP) ;
  467. RVP.'METHINV'.'CALPREC' = VRAI ;
  468. FINS ;
  469. FINS ;
  470. *
  471. *
  472. * ==========================================================
  473. * EXÉCUTION DE TOUS LES OPÉRATEURS/PROCÉDURES DE LA TABLE RV
  474. * => CONSTRUCTION DU SYSTÈME D'ÉQUATIONS DE Q.D.M.
  475. * ==========================================================
  476. *
  477. ST MAT = KOPS 'MATRIK' ;
  478. SF MAU = KOPS 'MATRIK' ;
  479. MDFDT = 0 ;
  480. REPE BLOC2 (DIME (RV.'LISTOPER')) ;
  481. NOMPER = EXTR &BLOC2 (RV.'LISTOPER') ;
  482. NOMTAB = CHAI &BLOC2 NOMPER ;
  483. RVN = RV.NOMTAB ;
  484. *
  485. * KFORM vaut 0 (EFM1) ou 1 (EF) ou 2 (VF) ou 3 (EFMC)
  486. MDFDT = MDFDT + RVN.'KOPT'.'KFORM' ;
  487. *
  488. * Exécution séquentielle
  489. SI (NON TCPT) ;
  490. MSI MAI = (TEXTE NOMPER) RVN ;
  491. *
  492. * Exécution parallèle (mémoire partagée)
  493. SINON ;
  494. SI (EXIS LOPERPAR NOMPER) ;
  495. SI IMPARA ;
  496. MESS ' On parallélise ' NOMPER ' NPART =' NPART ;
  497. FINS ;
  498. $MDP = RVN.'$mdp' ;
  499. $BID = RVN.'$bid' ;
  500. MSI MAI = ASSI 'TOUS' (TEXTE NOMPER) RVN $BID ;
  501. MSI = ETG MSI ;
  502. MAI = ETG MAI ;
  503. SINON ;
  504. SI IMPARA ;
  505. MESS NOMPER ' n est pas parallélisable' ;
  506. FINS ;
  507. MSI MAI = (TEXTE NOMPER) RVN ;
  508. FINS ;
  509. FINS ;
  510. *
  511. SI (EGA NOMPER 'DFDT') ;
  512. * ISCHT vaut 1 (BDF2) ou 2 (BDF4) ou 0 sinon (ordre 1)
  513. ISCHT = RVN.KOPT.'ISCHT' ;
  514. MAT = MAT ET MAI ;
  515. ST = ST ET MSI ;
  516. SINON ;
  517. MAU = MAU ET MAI ;
  518. * 'LIST' nomper ;
  519. * 'LIST' 'RESU' sf ;
  520. * 'LIST' 'RESU' msi ;
  521. SF = SF ET MSI ;
  522. FINS ;
  523. FIN BLOC2 ;
  524. *
  525. * ST/MAT contient le second membre et la matrice pour DFDT
  526. * SF/MAU contient le second membre et la matrice pour les autres opérateurs
  527. * S2/MA1 contient le second membre et la matrice pour l'ensemble
  528. S2 = SF ET ST ;
  529. MA1 = MAU ET MAT ;
  530. *
  531. *
  532. * ====================================================
  533. * TRAITEMENTS SPÉCIFIQUES POUR LA PRESSION (SI REQUIS)
  534. * ====================================================
  535. *
  536. SI (EXIS RV 'rvpd') ;
  537. RVPD = RV.'rvpd' ;
  538. IDIGV = RV.'IDigv' ;
  539. DIGV = RV.'Digv' ;
  540. MATPR = RVP.'MATP' ;
  541. FINS ;
  542. *
  543. *
  544. * 1) Calcul de C*D^(-1)*Ct pour l'algorithme semi-explicite (RV.'PRESSION')
  545. * **********************************************************************
  546. *
  547. SI (TESTPR ET TESTP1) ;
  548. RVPD = RVP.'DOMAINE' ;
  549. DIAGO = DOMA RVPD 'XXDIAGSI' ;
  550. SI (IDIM1 EGA 2) ;
  551. DIGV = (NOMC DIAGO CNVI1) ET (NOMC DIAGO CNVI2) ;
  552. SINON ;
  553. DIGV = (NOMC DIAGO CNVI1) ET (NOMC DIAGO CNVI2) ET (NOMC DIAGO CNVI3) ;
  554. FINS ;
  555. DIGV = KCHT RVPD 'VECT' 'SOMMET' 'COMP' LC DIGV ;
  556. *
  557. * Les noeuds de DIGV sur lesquels existe une CLIM en vitesse sont mis a 1.E30
  558. SI (EXIS RV 'CLIM') ;
  559. RVP.'CLIM' = RV.'CLIM' ;
  560. DIGV = KOPS DIGV 'CLIM' (RV.'CLIM') -1 ;
  561. FINS ;
  562. *
  563. IDIGV = INVE DIGV ;
  564. *
  565. SI (NON (EXIS RVP 'DIAGV')) ;
  566. RVP.'DIAGV' = DIGV ;
  567. FINS ;
  568. *
  569. * KMAB => discrétisation de l'opérateur div(U)
  570. RVP.'MATC' = KMAB RVP ;
  571. RVP.'PRESSION' = KCHT RVPD 'SCAL' 'CENTRE' 0.D0 ;
  572. RVP.'GRADP' = KCHT RVPD 'VECT' 'SOMMET' VNUL ;
  573. ACHP MATPR = KOPS 'MATRIK' ;
  574. RVP.'MATP' = MATPR ;
  575. RV.'rvpd' = RVPD ;
  576. RV.'IDigv' = IDIGV ;
  577. RV.'Digv' = DIGV ;
  578. *
  579. FINS ;
  580. *
  581. *
  582. * 2) Calcul de C*D^(-1)*Ct pour l'algorithme de projection (RV.'PROJ')
  583. * *****************************************************************
  584. *
  585. SI (TESTPRJ ET TESTP1) ;
  586. *
  587. * -------------------------------------------------------------------
  588. * Construction de la matrice masse diagonale à partir des tables DFDT
  589. * -------------------------------------------------------------------
  590. *
  591. DIAGO MMA = KOPS 'MATRIK' ;
  592. IDFDT = 0 ;
  593. REPE BLOCJ (DIME (RV.'LISTOPER')) ;
  594. NOMPER = EXTR &BLOCJ (RV.'LISTOPER') ;
  595. NOMTAB = CHAI &BLOCJ NOMPER ;
  596. SI ((EGA NOMPER 'DFDT') ET (EXIS (RV.NOMTAB) 'LISTINCO')) ;
  597. SI (EXIS (RV.NOMTAB.'LISTINCO') NOMVI) ;
  598. IDFDT = IDFDT + 1 ;
  599. RVPD = RV.NOMTAB.'DOMZ' ;
  600. DIAGO = DIAGO ET (DOMA RVPD 'XXDIAGSI') ;
  601. FINS ;
  602. FINS ;
  603. FIN BLOCJ ;
  604. *
  605. SI (EGA IDFDT 0) ;
  606. MESS 'Pas de DFDT ????' ;
  607. ERRE 21 ;
  608. FINS ;
  609. *
  610. SI (IDIM1 EGA 2) ;
  611. DIGV = (NOMC DIAGO CNVI1) ET (NOMC DIAGO CNVI2) ;
  612. SINON ;
  613. DIGV = (NOMC DIAGO CNVI1) ET (NOMC DIAGO CNVI2) ET (NOMC DIAGO CNVI3) ;
  614. FINS ;
  615. *
  616. DIGV = KCHT RVPD 'VECT' 'SOMMET' 'COMP' LC DIGV ;
  617.  
  618. * DIG1 = matrice diagonale indépendante des conditions aux limites
  619. DIG1 = COPI DIGV ;
  620. IDIAG = INVE DIG1 ;
  621. *
  622. * Les noeuds de DIGV sur lesquels existe une CLIM en vitesse sont mis a 1.E30
  623. DIGV = KOPS DIGV 'CLIM' (RV.'CLIM') -1 ;
  624. *
  625. IDIGV = INVE DIGV ;
  626. *
  627. SI (NON (EXIS RVP 'DIAGV')) ;
  628. RVP.'DIAGV' = DIGV ;
  629. FINS ;
  630. RVP.'INCO' = RV.'INCO' ;
  631. *
  632. *
  633. * -----------------------------------------------------------
  634. * Exécution de tous les opérateurs/procédures de la table RVP
  635. * -----------------------------------------------------------
  636. *
  637. * TVNPC et TVNP indiquent que l'opérateur VNIMP est présent
  638. * (respectivement avec MSOMMET ou CENTREP0/CENTREP1)
  639. TVNP = FAUX ;
  640. TVNPC = FAUX ;
  641. *
  642. * SVNPC/MVNPC contient le second membre et la matrice pour VNIMP+MSOMMET
  643. * SR/MAR contient le second membre et la matrice pour les VNIMP+CENTREPx
  644. * SP/MAP contient le second membre et la matrice pour les autres opérateurs
  645. SVNPC MVNPC = KOPS 'MATRIK' ;
  646. SR MAR = KOPS 'MATRIK' ;
  647. SP MAP = KOPS 'MATRIK' ;
  648. *
  649. REPE BLOCPJ (DIME (RVP.'LISTOPER')) ;
  650. NOMPER = EXTR &BLOCPJ (RVP.'LISTOPER') ;
  651. NOMTAB = CHAI &BLOCPJ NOMPER ;
  652. *
  653. SI (EGA NOMPER 'KBBT') ;
  654. * IKOMP vaut 0 (NOCONS) ou 1 (CONS) ou 2 (CONS2)
  655. RVP.NOMTAB.'KOPT'.'IKOMP' = 1 ;
  656. FINS ;
  657. MSI MAI = (TEXTE NOMPER) (RVP.NOMTAB) ;
  658. *
  659. *######################## ATTENTION !!!!!!!!
  660. *######################## MSIG/MAIG SONT UTILISES HORS DE BLOCPJ
  661. *######################## LEUR VALEUR EST INCERTAINE......
  662. SI TGRAD ;
  663. SI (IIMPR > 0) ;
  664. MESS 'Procedure PROJCT (Gradient) Operateur : ' NOMPER ;
  665. FINS ;
  666. * IKOMP vaut 0 (NOCONS) ou 1 (CONS) ou 2 (CONS2)
  667. RVP.NOMTAB.'KOPT'.'IKOMP' = 0 ;
  668. MSIG MAIG = (TEXTE NOMPER) (RVP.NOMTAB) ;
  669. FINS ;
  670. *########################
  671. *########################
  672. *########################
  673. *
  674. SI (EGA NOMPER 'VNIMP') ;
  675. * DISCPRES vaut 3 (CENTREP0) ou 4 (CENTREP1) ou 5 (MSOMMET)
  676. SI (EGA (RVP.'DISCPRES') 5) ;
  677. TVNPC = VRAI ;
  678. MVNPC = MVNPC ET MAI ;
  679. SVNPC = SVNPC ET MSI ;
  680. SINON ;
  681. TVNP = VRAI ;
  682. MAR = MAR ET MAI ;
  683. SR = SR ET MSI ;
  684. FINS ;
  685. SINON ;
  686. MAP = MAP ET MAI ;
  687. SP = SP ET MSI ;
  688. FINS ;
  689. FIN BLOCPJ ;
  690. *
  691. * Séparation des sous-matrices type C*Ct (MAC) des autres sous-matrices (MATPC)
  692. MATPC MAC = KOPS 'CMCTSPLT' MAP ;
  693. *
  694. *######################## ATTENTION !!!!!!!!
  695. *######################## LA VALEUR DE MAIG EST INCERTAINE......
  696. SI TGRAD ;
  697. MATPCG MACG = KOPS 'CMCTSPLT' MAIG ;
  698. RVP.'MATG' = MACG ;
  699. FINS ;
  700. *########################
  701. *########################
  702. *
  703. SI TVNPC ;
  704. MAC = MAC ET MVNPC ;
  705. FINS ;
  706. RVP.'MATC' = MAC ;
  707. *
  708. SCR MCR = KOPS 'MATRIK' ;
  709. SI TVNP ;
  710. RVP.'MBTR' = MAR ;
  711. DUNIT = IDIGV ;
  712. * KOPS 'CMCT' A B C calcule la matrice A*C^(-1)*Bt
  713. CRT = KOPS 'CMCT' MAC MAR DUNIT ;
  714. CTR = KOPS 'CMCT' MAR MAC DUNIT ;
  715. RRT = KOPS 'CMCT' MAR MAR DUNIT ;
  716. * MCR = MCR ET CRT ET CTR ET RRT ;
  717. MCR = CRT ET CTR ET RRT ;
  718. FINS ;
  719. RVP.'TVNP' = TVNP ;
  720. *
  721. SI (EGA (RVP.'DISCPRES') 5) ;
  722. SI (IIMPR > 0) ;
  723. MESS 'Cas des pressions CONTINUES' ;
  724. FINS ;
  725. * MATPR = MATPC ET MCR ;
  726. * MCR est vide !
  727. MATPR = MATPC ;
  728. SINON ;
  729. SI (IIMPR > 0) ;
  730. MESS 'Cas des pressions DISCONTINUES' ;
  731. FINS ;
  732. MATPR = KOPS 'CMCT' MAC MAC IDIGV ;
  733. MATPR = MATPC ET MATPR ET MCR ;
  734. *
  735. SI TRESOU ;
  736. MATPR = KOPS 'RIMA' MATPR 'NSYM' ;
  737.  
  738. INCU = EXTR MAC 'COMP' ;
  739. INCP = EXTR MAC 'COMP' 'DUAL' ;
  740. INCUP = INCU ET INCP ;
  741. OPTI 'INCO' INCUP INCUP ;
  742. *
  743. * RIGIDITE/CHPOINT associés aux C.L. en pression
  744. Si('EXIS' rvp 'rigp') ;
  745. rigp=rvp.'rigp' ;
  746. fpi =rvp.'climreso' ;
  747. Sinon ;
  748. incpres=extr incp 1 ;
  749. mip=extr rvp.clim 'MAILLAGE' ;
  750. rigp=BLOQ mip incpres ;
  751. fpi =DEPI RIGP rvp.'CLIM' ;
  752. rvp.'rigp'=rigp ;
  753. rvp.'climreso'=fpi ;
  754. Finsi ;
  755. matpr = matpr et rigp ;
  756.  
  757.  
  758. SI (IIMPR > 0) ;
  759. MESS '***** ON UTILISE RESOU POUR LA PRESSION *****' ;
  760. FINS ;
  761. SINON ;
  762. SI (IIMPR > 0) ;
  763. MESS '***** ON UTILISE KRES POUR LA PRESSION *****' ;
  764. FINS ;
  765. FINS ;
  766. FINS ;
  767. *
  768. RV.'rvpd' = RVPD ;
  769. RV.'IDigv' = IDIGV ;
  770. RV.'Digv' = DIGV ;
  771. RVP.'MATP' = MATPR ;
  772. *
  773. FINS ;
  774. *
  775. *
  776. * 3) Calcul de Ct*P pour l'algorithme semi-explicite (RV.'PRESSION')
  777. * ***************************************************************
  778. *
  779. SI TESTPR ;
  780. DT = (RV.'PASDETPS'.'DELTAT') * (RV.'ALFA') ;
  781. RVP.'DELTAT' = DT ;
  782. *
  783. * F = COPI S2 ;
  784. * LC = EXTR DIGV 'COMP' ;
  785. F = S2 ;
  786. FU = KCHT RVPD 'VECT' 'SOMMET' 'COMP' LC (EXCO F LC) ;
  787. *
  788. * DM1F vaut (-1 * RV.'CLIM' / DT) aux noeuds supportant une C.L.
  789. * DM1F vaut (-1 * FU * IDIGV) partout ailleurs
  790. SI (EXIS RV 'CLIM') ;
  791. DM1F = KOPS (DT '*' (KOPS FU '*' IDIGV)) 'CLIM' (RV.'CLIM') 3 ;
  792. DTI = -1.D0 / DT ;
  793. DM1F = DTI * DM1F ;
  794. SINON ;
  795. DM1F = (-1.D0) * (KOPS FU '*' IDIGV) ;
  796. FINS ;
  797. *
  798. * Calcul de -C*D^(-1)*F
  799. RVP.'PRESSION' = KMF (RVP.'MATC') DM1F ;
  800. *
  801. * /\/\/\/\/\/\/\/\/\/\/
  802. * Calcul de la pression (vieille syntaxe KRES)
  803. * /\/\/\/\/\/\/\/\/\/\/
  804. KRES RVP (RVP.'PRESSION') 'BETA' (RVP.'KBETA') (RVP.'BETA')
  805. 'PIMP' (RVP.'KPIMP') (RVP.'PIMP') ;
  806. RV.'INCO'.'PRESSION' = RVP.'PRESSION' ;
  807.  
  808. * Calcul de CtP, c'est-à-dire grad(p)
  809. RVP.'GRADP' = KMTP 1 (RVP.'MATC') (RVP.'PRESSION') LC ;
  810. S2 = S2 + (RVP.'GRADP') ;
  811. FINS ;
  812. *
  813. *
  814. * 4) Calcul de M*D^(-1) puis Ct*P pour l'algorithme de projection (RV.'PROJ')
  815. * ************************************************************************
  816. *
  817. SI TESTPRJ ;
  818. DT = (RV.'PASDETPS'.'DELTAT') * (RV.'ALFA') ;
  819. RVP.'DELTAT' = DT ;
  820. *
  821. *
  822. * ------------------------------------
  823. * Calcul du produit M*D^(-1) si requis
  824. * ------------------------------------
  825. *
  826. SI TMDM1 ;
  827. SI ((EXIS RV 'MDM1') ET (NON CALPRE)) ;
  828. MDM1 = RV.'MDM1' ;
  829. SINON ;
  830. SI (IIMPR > 0) ;
  831. MESS 'On calcule M*D^(-1)' ;
  832. FINS ;
  833. *
  834. STN MATN = KOPS 'MATRIK' ;
  835. ROW = 0. ;
  836. REPE BLOCPJ1 (DIME (RVP.'LISTOPER')) ;
  837. NOMPER1 = EXTR &BLOCPJ1 (RVP.'LISTOPER') ;
  838. NOMTAB1 = CHAI &BLOCPJ1 NOMPER1 ;
  839. SI (EGA NOMPER1 'KBBT') ;
  840. NOMIV1 = EXTR (RVP.NOMTAB1.'LISTINCO') 1 ;
  841. *
  842. REPE BLOCPJ2 (DIME (RV.'LISTOPER')) ;
  843. NOMPER2 = EXTR &BLOCPJ2 (RV.'LISTOPER') ;
  844. NOMTAB2 = CHAI &BLOCPJ2 NOMPER2 ;
  845. SI (EGA NOMPER2 'DFDT') ;
  846. NOMIV2 = EXTR (RV.NOMTAB2.'LISTINCO') 1 ;
  847. *
  848. SI (EGA NOMIV2 NOMIV1) ;
  849. SI (EGA TYPROJ 'PENA') ;
  850. RWI = (RV.NOMTAB2).ARG1 ;
  851. TRWI = TYPE RWI ;
  852. SI (EGA TRWI 'MOT') ;
  853. RWI = RV.'INCO'.RWI ;
  854. TRWI = TYPE RWI ;
  855. FINS ;
  856. SI (IIMPR > 0) ;
  857. MESS 'Type du coefficient RWI = ' TRWI ;
  858. FINS ;
  859. *
  860. SI (EGA TRWI 'FLOTTANT') ;
  861. ROW = MAXI (PROG RWI ROW) ;
  862. FINS ;
  863. SI ((EGA TRWI 'CHPOINT') OU (EGA TRWI 'MCHAML')) ;
  864. ROW = MAXI (PROG (MAXI RWI) ROW) ;
  865. FINS ;
  866. SINON ;
  867. ROW = 1. ;
  868. FINS ;
  869. * MESS 'ROW = ' ROW ;
  870. *
  871. MSI MAI = DFDT (RV.NOMTAB2) ;
  872. MATN = MATN ET MAI ;
  873. * DOMZP = RV.NOMTAB2.'DOMZ' ;
  874. * STI = KCHT DOMZP 'VECT' 'SOMMET' 'COMP' LC VUNI ;
  875. FINS ;
  876. FINS ;
  877. FIN BLOCPJ2 ;
  878. FINS ;
  879. FIN BLOCPJ1 ;
  880. *
  881. SI (EGA TYPROJ 'PENA') ;
  882. MDM1 = 1. ;
  883. SINON ;
  884. MDM1 = KMF MATN IDIAG ;
  885. FINS ;
  886. *
  887. SI (EGA ISCHT 1) ;
  888. MDM1 = MDM1 * ((DT*2.)/3.) ;
  889. SINON ;
  890. MDM1 = MDM1 * DT ;
  891. FINS ;
  892. *
  893. RV.'MDM1' = MDM1 ;
  894. FINS ;
  895. FINS ;
  896. *
  897. *
  898. * ---------------------------
  899. * Calcul du produit Ct*P[n-1]
  900. * ---------------------------
  901. *
  902. TVNP = RVP.'TVNP' ;
  903.  
  904. SI (EXIS (RV.'INCO') 'PRESSION') ;
  905. PPI = RV.'INCO'.'PRESSION' ;
  906. *
  907. * TPNM2 Elimination of end of step velocity (2*P[n] - P[n-1])
  908. SI (EXIS (RV.'INCO') 'PNM2') ;
  909. PPI = (2 * PPI) - (RV.'INCO'.'PNM2') ;
  910. FINS ;
  911. *
  912. * TGRAD=VRAI => Formulation en u*grad(p)
  913. * TGRAD=FAUX => Formulation en p*div(u)
  914. SI TGRAD ;
  915. CPRE = KMF (RVP.'MATG') PPI 'TRAN' ;
  916. SINON ;
  917. CPRE = KMF (RVP.'MATC') PPI 'TRAN' ;
  918. FINS ;
  919. *
  920. * Prise en compte des C.L. (opérateur VNIMP avec CENTREP0/CENTREP1)
  921. SI TVNP ;
  922. CXRE = KMF (RVP.'MBTR') PPI 'TRAN' ;
  923. CPRE = CPRE ET CXRE ;
  924. FINS ;
  925.  
  926. * Consistence selon Gresho
  927. SI TMDM1 ;
  928. GRADPRES = KOPS MDM1 '*' CPRE ;
  929. * Consistence selon Guermond
  930. SINON ;
  931. GRADPRES = CPRE ;
  932. FINS ;
  933. OUBL CPRE ;
  934. RV.'INCO'.'GRADPRES' = NOMC GRADPRES LCU LC ;
  935. *
  936. SI TGRAD ;
  937. S2 = SF - (RV.'INCO'.'GRADPRES') + ST ;
  938. SINON ;
  939. S2 = SF + (RV.'INCO'.'GRADPRES') + ST ;
  940. FINS ;
  941. *
  942. FINS ;
  943. FINS ;
  944. *
  945. SI (EXIS RV 'CLIM') ;
  946. S1 = RV.'CLIM' ;
  947. SINON ;
  948. S1 = ' ' ;
  949. FINS ;
  950. RV.'S2' = S2 ;
  951. *
  952. *
  953. * ===========================================
  954. * RÉSOLUTION DU SYSTÈME D'ÉQUATIONS DE Q.D.M.
  955. * ===========================================
  956. *
  957. SI ((NON TESTPRJ) OU (EGA MDFDT 0)) ;
  958. *
  959. RV.'METHINV'.'XINIT' = RV.'resmn' ;
  960. *
  961. * Méthode de projection incrémentale
  962. * **********************************
  963. SI (EXIS RV 'GPROJ') ;
  964. SI (IIMPR > 0) ;
  965. MESS 'Résolution QDM - méthode de projection incrémentale' ;
  966. FINS ;
  967. RES = GRESP MA1 S1 S2 RV ;
  968. *
  969. * Système monolithique d'équations (U-P)
  970. * **************************************
  971. SINON ;
  972. SI (IIMPR > 0) ;
  973. MESS 'Résolution QDM - système monolithique (U-P)' ;
  974. FINS ;
  975. *
  976. SI ((RV.'METHINV'.'TYPINV' EGA 1) ET TRESOU) ;
  977. SI (IIMPR > 0) ;
  978. MESS 'ILU-Crout => on utilise RESOU' ;
  979. FINS ;
  980. *
  981. MA1 = KOPS 'RIMA' MA1 'NSYM' ;
  982. INCPRES = EXTR RV.'LISTINCO' 1 ;
  983. OPTI 'INCO' INCPRES INCPRES ;
  984. *
  985. * RIGIDITE/CHPOINT associés aux C.L.
  986. SI (EXIS RV 'trico1') ;
  987. TRICO = RV.'trico1' ;
  988. SINON ;
  989. INC = EXTR (RV.'CLIM') 'COMP' ;
  990. TRICO = TABL 'ESCLAVE' ;
  991. RV.'trico1' = TRICO ;
  992. NCMP = DIME INC ;
  993. REPE BINC NCMP ;
  994. ICO = EXTR &BINC INC ;
  995. RCLIM = EXCO (RV.'CLIM') ICO ICO ;
  996. MIP = EXTR RCLIM 'MAILLAGE' ;
  997. TRICO.&BINC = BLOQ MIP ICO ;
  998. FIN BINC ;
  999. FINS ;
  1000. S1 = VIDE 'CHPOINT/DISCRET' ;
  1001. REPE BINC NCMP ;
  1002. ICO = EXTR &BINC INC ;
  1003. RCLIM = EXCO (RV.'CLIM') ICO ICO ;
  1004. RIGP = TRICO.&BINC ;
  1005. S1 = S1 ET (DEPI RIGP RCLIM) ;
  1006. FIN BINC ;
  1007. *
  1008. RIGP = ET TRICO ;
  1009. MA1 = MA1 ET RIGP ;
  1010. FINS ;
  1011. *
  1012. RES = KRESP MA1 'TYPI' (RV.'METHINV')
  1013. 'CLIM' S1
  1014. 'SMBR' S2
  1015. 'IMPR' IMPKRES ;
  1016. FINS ;
  1017. FINS ;
  1018. *
  1019. * Méthode de projection standard
  1020. * ******************************
  1021. SI (TESTPRJ ET (NEG MDFDT 0)) ;
  1022. SI (IIMPR > 0) ;
  1023. MESS 'Résolution QDM - méthode de projection standard' ;
  1024. FINS ;
  1025. *
  1026. * LPART = EXTR MA1 'COMP' ;
  1027. LPART = KOPS 'EXTRCOUP' MA1 ;
  1028. NBPART = DIME LPART ;
  1029. * MESS 'Liste des composantes' ;
  1030. * LIST LPART ;
  1031. *
  1032. $MA1 = TABL 'ESCLAVE' ;
  1033. $S1 = TABL 'ESCLAVE' ;
  1034. $S2 = TABL 'ESCLAVE' ;
  1035. $RESMN = TABL 'ESCLAVE' ;
  1036. $TAB1 = TABL 'ESCLAVE' ;
  1037. *
  1038. SI (EXIS RV '$trico') ;
  1039. $TRICO = RV.'$trico' ;
  1040. SINON ;
  1041. $TRICO = TABL 'ESCLAVE' ;
  1042. RV.'$trico' = $TRICO ;
  1043. REPE BCLCOM NBPART ;
  1044. $TRICO.&BCLCOM = TABL 'ESCLAVE' ;
  1045. FIN BCLCOM ;
  1046. FINS ;
  1047. *
  1048. * On boucle sur les partitions du domaine (déjà déterminées plus haut)
  1049. REPE BCLCOM NBPART ;
  1050. * NMC = EXTR LPART &BCLCOM ;
  1051. NMC = LPART.&BCLCOM ;
  1052. * MESS 'NMC=' NMC &BCLCOM ;
  1053.  
  1054. * MA1I = EXTR MA1 (MOTS NMC) (MOTS NMC) ;
  1055. MA1I = KOPS 'EXTRINCO' NMC NMC MA1 ;
  1056. $MA1.&BCLCOM = MA1I ;
  1057. * $S1.&BCLCOM = EXCO S1 NMC NMC ;
  1058. * $S2.&BCLCOM = EXCO S2 NMC NMC ;
  1059. * RESMNI = EXCO (RV.'resmn') NMC 'NOID' NMC ;
  1060. $S1.&BCLCOM = EXCO S1 NMC 'NOID' ;
  1061. $S2.&BCLCOM = EXCO S2 NMC 'NOID' ;
  1062. RESMNI = EXCO (RV.'resmn') NMC 'NOID' ;
  1063. TAB1 = COPI RV.'METHINV' ;
  1064. * TAB1 = RV.'METHINV' ;
  1065. TAB1.'XINIT' = RESMNI ;
  1066. $TAB1.&BCLCOM = TAB1 ;
  1067. *
  1068. SI (IIMPR > 0) ;
  1069. MESS 'Mise à jour du préconditionnement' ;
  1070. FINS ;
  1071. SI (TAB1.'TYPINV' >EG 2) ;
  1072. LWORD1 LWORD2 = KOPS 'EXTRNINC' MA1I ;
  1073. WORD1 = EXTR LWORD1 1 ;
  1074. *
  1075. SI (NON (EXIS RV 'TABRES')) ;
  1076. RV.'TABRES' = TABL ;
  1077. FINS ;
  1078. TABRES = RV.'TABRES' ;
  1079. *
  1080. SI (TAB1.'CALPREC') ;
  1081. SI (NON (EXIS TABRES WORD1)) ;
  1082. TABRES.WORD1 = TABL ;
  1083. FINS ;
  1084. TABRES.WORD1.'MATASS' = MA1I ;
  1085. TABRES.WORD1.'MAPREC' = MA1I ;
  1086. FINS ;
  1087. TAB1.'MATASS' = TABRES.WORD1.'MATASS' ;
  1088. TAB1.'MAPREC' = TABRES.WORD1.'MAPREC' ;
  1089. FINS ;
  1090. FIN BCLCOM ;
  1091. *
  1092. * RÉSOLUTION PARALLÈLE
  1093. SI TKPR ;
  1094. SI IMPARA ;
  1095. MESS 'Les résolutions sont traitées en parallèle' ;
  1096. FINS ;
  1097. *
  1098. RES = ASSI 'TOUS' KRES $MA1 'TYPI' $TAB1
  1099. 'CLIM' $S1
  1100. 'SMBR' $S2
  1101. 'IMPR' IMPKRES ;
  1102. RES = ETG RES ;
  1103. *
  1104. * RÉSOLUTION SÉQUENTIELLE
  1105. SINON ;
  1106. SI IMPARA ;
  1107. MESS 'Les résolutions sont traitées séquentiellement' ;
  1108. FINS ;
  1109. *
  1110. RES = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  1111. $TRICO = RV.'$trico' ;
  1112. REPE BCLCOM NBPART ;
  1113. SI (($TAB1.&BCLCOM.'TYPINV' EGA 1) ET TRESOU) ;
  1114. MESS 'ILU-Crout => on utilise RESOU' ;
  1115. *
  1116. MATCOM = $MA1.&BCLCOM ;
  1117. MATCOM = KOPS 'RIMA' MATCOM 'NSYM' ;
  1118. *
  1119. * RIGIDITE/CHPOINT associés aux C.L.
  1120. SI (NON (EXIS ($TRICO.&BCLCOM) &BINC)) ;
  1121. INC = EXTR ($S1.&BCLCOM) 'COMP' ;
  1122. NCMP = DIME INC ;
  1123. REPE BINC NCMP ;
  1124. ICO = EXTR &BINC INC ;
  1125. OPTI 'INCO' ICO ICO ;
  1126. RCLIM = EXCO ICO ($S1.&BCLCOM) ICO ;
  1127. MIP = EXTR RCLIM 'MAILLAGE' ;
  1128. $TRICO.&BCLCOM.(&BINC) = BLOQ MIP ICO ;
  1129. FIN BINC ;
  1130. FINS ;
  1131. S1 = VIDE 'CHPOINT'/'DISCRET' ;
  1132. REPE BINC NCMP ;
  1133. ICO = EXTR &BINC INC ;
  1134. RCLIM = EXCO ICO ($S1.&BCLCOM) ICO ;
  1135. RIGP = $TRICO.(&BCLCOM).&BINC ;
  1136. S1 = S1 ET (DEPI RIGP RCLIM) ;
  1137. FIN BINC ;
  1138. *
  1139. RIGP = ETG ($TRICO.&BCLCOM) ;
  1140. MATCOM = MATCOM ET RIGP ;
  1141. *
  1142. RES1 = RESO MATCOM ($S2.&BCLCOM ET S1) ;
  1143. SINON ;
  1144. RES1 = KRES ($MA1.&BCLCOM) 'TYPI' ($TAB1.&BCLCOM)
  1145. 'CLIM' ($S1.&BCLCOM)
  1146. 'SMBR' ($S2.&BCLCOM)
  1147. 'IMPR' IMPKRES ;
  1148. FINS ;
  1149. RES = RES 'ET' RES1 ;
  1150. FIN BCLCOM ;
  1151. FINS ;
  1152. FINS ;
  1153. *
  1154. *
  1155. * ===============================================
  1156. * ÉTAPE DE PROJECTION STANDARD : CALCUL DE C*Û[n]
  1157. * ===============================================
  1158. *
  1159. SI TESTPRJ ;
  1160. *
  1161. CUN = KMF (RVP.'MATC') RES ;
  1162. SI TVNP ;
  1163. CXN = KMF (RVP.'MBTR') RES ;
  1164. CUN = CUN ET CXN ;
  1165. FINS ;
  1166. *
  1167. * On calcule les seconds membres de l'équation de pression
  1168. * s'ils existent (opérateurs FIMP)
  1169. REPE BLOCPJ (DIME (RVP.'LISTOPER')) ;
  1170. NOMPER = EXTR &BLOCPJ (RVP.'LISTOPER') ;
  1171. NOMTAB = CHAI &BLOCPJ NOMPER ;
  1172. SI (EGA NOMPER 'FIMP') ;
  1173. MSI MAI = (TEXTE NOMPER) (RVP.NOMTAB) ;
  1174. CUN = CUN ET MSI ;
  1175. FINS ;
  1176. FIN BLOCPJ ;
  1177. *
  1178. CUN = CUN * ROW * (-1./DT) ;
  1179. CUN = 'CHAN' CUN 'ATTRIBUT' 'NATURE' 'DISCRET' ;
  1180. *
  1181. * Calcul de Lamdba[n]
  1182. RVP.'METHINV'.'XINIT' = RV.'resmnp' ;
  1183. 'SI' ('ET' tresou ('EGA' ('TYPE' matpr) 'RIGIDITE')) ;
  1184. * Qd tresou et pression continue, on utilise KRES qd meme
  1185. fclim = RVP . 'climreso' ;
  1186. 'SINO' ;
  1187. fclim = RVP . 'CLIM' ;
  1188. 'FINS' ;
  1189. SL = KRESP MATPR 'TYPI' (RVP.'METHINV')
  1190. 'CLIM' fclim
  1191. 'SMBR' CUN
  1192. 'IMPR' IMPKRES ;
  1193. OUBL CUN ;
  1194. RV.'resmnp' = SL ;
  1195. *
  1196. CTL = KMF (RVP.'MATC') SL 'TRAN' ;
  1197. SI TVNP ;
  1198. CXL = KMF (RVP.'MBTR') SL 'TRAN' ;
  1199. CTL = CTL + CXL ;
  1200. FINS ;
  1201. *
  1202. * Elimination of end of step velocity
  1203. * (si 'PNM2' existe, on ne corrige pas)
  1204. SI (NON TPNM2) ;
  1205. SI (NON (EXIS (RV.'INCO') 'PNM2')) ;
  1206. A = NOMC LCU LC (KOPS IDIGV '*' CTL) ;
  1207. RES = RES + ((1./ROW)*A*DT) ;
  1208. FINS ;
  1209. FINS ;
  1210. OUBL CTL ;
  1211. *
  1212. FINS ;
  1213. *
  1214. *
  1215. * ===================
  1216. * AVANCEMENT EN TEMPS
  1217. * ===================
  1218. *
  1219. * SI (TESTPRJ ET (EGA MDFDT 0)) ;
  1220. * IMPTCRR = IIMPR ;
  1221. * FINS ;
  1222. SI (EGA MDFDT 0) ;
  1223. IMPTCRR = IIMPR ;
  1224. FINS ;
  1225. IMPKRES = 0 ;
  1226. *
  1227. * MESS 'On passe dans TCRR ' ;
  1228. LCMP = EXTR RES 'COMP' ;
  1229. SI (EXIS LCMP 'LX') ;
  1230. * AG = EXTR (EXCO RES 'LX') 'MAILLAGE' ;
  1231. * AR = EXTR RES 'MAILLAGE' ;
  1232. * ATN = DIFF AR AG ;
  1233. * RES = REDU RES ATN ;
  1234. RES = ENLE RES 'LX' ;
  1235. FINS ;
  1236. *
  1237. EPS = TCRR RES OMEG (RV.'INCO') 'IMPR' IMPTCRR ;
  1238. *
  1239. RV.'METHINV'.'CALPREC' = FAUX ;
  1240. SI (TESTPRJ) ;
  1241. RVP.'METHINV'.'CALPREC'= FAUX ;
  1242. FINS ;
  1243. *
  1244. RV.'resmn' = RES ;
  1245. *
  1246. MENA ;
  1247. *
  1248. SI (RV.'STOPITER') ;
  1249. RV.'STOPITER' = FAUX ;
  1250. QUIT BLOCI ;
  1251. FINS ;
  1252. *
  1253. FIN BLOCI ;
  1254. * ******************************************
  1255. * ******************************************
  1256. * FIN DE LA BOUCLE INTERNE (= NON-LINEARITE)
  1257. * ******************************************
  1258. * ******************************************
  1259. *
  1260. *
  1261. * MESS ' ITMAX= ' ITMAX ' MDFDT= ' MDFDT ;
  1262. *
  1263. IRT=0 ;
  1264. SI (EGA ITMAX 0) ;
  1265. IRT = TCNM RV 'NOUP' ;
  1266. SINON ;
  1267. IRT = TCNM RV ;
  1268. FINS ;
  1269. *
  1270. * ------------------------------------------------------------
  1271. * Avancement en temps pour l'algorithme de projection standard
  1272. * => P[n+1] = P[n] + Lambda
  1273. * ------------------------------------------------------------
  1274. SI TESTPRJ ;
  1275. SI (NON (EXIS (RV.'INCO') 'PRESSION')) ;
  1276. RV.'INCO'.'PRESSION' = SL ;
  1277. SI TPNM2 ;
  1278. RV.'INCO'.'PNM2' = SL ;
  1279. FINS ;
  1280. SINON ;
  1281. PNM1 = RV.'INCO'.'PRESSION' ;
  1282. SI (EGA ISCHT 1) ;
  1283. PN = PNM1 + (1.5*SL) ;
  1284. SINON ;
  1285. PN = PNM1 + SL ;
  1286. FINS ;
  1287.  
  1288. SI TPNM2 ;
  1289. RV.'INCO'.'PNM2' = PNM1 ;
  1290. FINS ;
  1291. RV.'INCO'.'PRESSION' = PN ;
  1292. FINS ;
  1293.  
  1294. SI ((EGA TYPROJ 'PSCT') OU (EGA TYPROJ 'PENA')) ;
  1295. RV.'INCO'.'PRESSION' = SL ;
  1296. FINS ;
  1297.  
  1298. OUBL SL ;
  1299. FINS ;
  1300. *
  1301. * ----------------------------------------
  1302. * Traitement spécifique (non documenté...)
  1303. * ----------------------------------------
  1304. SI TESTRAN ;
  1305. RV.'CO'.'VITESSE' = KOPS (RV.'INCO'.NOMVI) '-' (RV.'SEDIM') ;
  1306. K = 'ABS' (RV.'INCO'.'KN') ;
  1307. E = 'ABS' (RV.'INCO'.'EN') ;
  1308. K = KOPS (KOPS K '*' K) '/' E ;
  1309. DIF = KOPS (KOPS K '*' 0.09) '+' (RV.'COEF') ;
  1310. RV.'CO'.'DIFFU' = NOEL RVPD DIF ;
  1311. RV.'CO'.'TEMPERA' = RV.'INCO'.'CN' ;
  1312. FINS ;
  1313. *
  1314. *
  1315. *
  1316. RV.'METHINV'.'CALPREC' = FAUX ;
  1317. SI (TESTPRJ) ;
  1318. RVP.'METHINV'.'CALPREC'= FAUX ;
  1319. FINS ;
  1320. *
  1321. MENA ;
  1322. *
  1323. SI (EGA IRT 1) ;
  1324. MESS 'TEMPS FINAL ATTEINT : ' (RV.'PASDETPS'.'TPS') ;
  1325. QUIT BLOC1 ;
  1326. FINS ;
  1327. *
  1328. SI (RV.'STOPPDT') ;
  1329. RV.'STOPPDT' = FAUX ;
  1330. MESS 'ARRET DEMANDÉ AU TEMPS : ' (RV.'PASDETPS'.'TPS') ;
  1331. QUIT BLOC1 ;
  1332. FINS ;
  1333. *
  1334. FIN BLOC1 ;
  1335. * *****************************************
  1336. * *****************************************
  1337. * FIN DE LA BOUCLE EXTERNE (= PAS DE TEMPS)
  1338. * *****************************************
  1339. * *****************************************
  1340. *
  1341. *
  1342. SI TESTPR ;
  1343. RVP.'PRESSION' = KCHT RVPD 'SCAL' 'CENTRE' (RVP.'PRESSION') ;
  1344. RVP.'PN' = ELNO RVPD (RVP.'PRESSION') ;
  1345. FINS ;
  1346. *
  1347. * OUBLI EVENTUEL des matrices présentes dans la table RV et qui prennent de
  1348. * la place dans les sauvegardes
  1349. *
  1350. 'SI' ('EXIS' rv 'DETMAT') ;
  1351. ldetmat = rv . 'DETMAT' ;
  1352. 'SINO' ;
  1353. ldetmat = faux ;
  1354. 'FINS' ;
  1355.  
  1356. 'SI' ldetmat ;
  1357. REPIX rv ;
  1358. 'FINS' ;
  1359.  
  1360.  
  1361.  
  1362. *
  1363. FINP ;
  1364. *
  1365.  
  1366.  

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