Télécharger ale_mecaflu.dgibi

Retour à la liste

Numérotation des lignes :

  1. * fichier : ale_mecaflu.dgibi
  2. ************************************************************************
  3. ************************************************************************
  4.  
  5. ***************************************************************
  6. * *
  7. * NOM : ale_mecaflu.dgibi *
  8. * DESCRIPTION : fiche de validation CASTEM2000 *
  9. * Mécanique des Fluides *
  10. * Equations de Navier-Stokes en description ALE *
  11. * (Arbitraire Lagrange-Euler) *
  12. * géométrie initiale : cavité rectangulaire (2D)*
  13. * FONCTIONS *
  14. * TESTEES : 'NS' option 'CENTREE' & 'ALE' incompressible *
  15. * (entre formulation non conservative *
  16. * autres) éléments QUA4 *
  17. * 'FORME' pour les déplacements du maillage *
  18. * 'LAPN' option 'EF' 'IMPL' *
  19. * pour le calcul de la vitesse du *
  20. * maillage *
  21. * *
  22. * AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF) *
  23. * e-mail : gounand@semt2.smts.cea.fr *
  24. * *
  25. ***************************************************************
  26. * *
  27. * VERSION : v1, 29/12/97, version initiale *
  28. * HISTORIQUE : v1, 29/12/97, création *
  29. * HISTORIQUE : *
  30. * HISTORIQUE : *
  31. * HISTORIQUE : *
  32. * *
  33. ***************************************************************
  34. * *
  35. * Priere de completer la partie HISTORIQUE apres modification *
  36. * du jeu de donnees afin de faciliter la maintenance *
  37. * *
  38. ***************************************************************
  39. *
  40. * DESCRIPTION DETAILLEE :
  41. *
  42. * Géométrie :
  43. * ---------
  44. * A l'instant initial, le fluide est au repos dans une
  45. * cavité rectangulaire LxH ouverte (comme une gouttière).
  46. * Le fluide est newtonien,visqueux et incompressible.
  47. * Il est soumis à l'accélération de la pesanteur.
  48. *
  49. * z
  50. * ^
  51. * |
  52. *
  53. * | |
  54. * | |
  55. * R|----------------|Q
  56. * | | |
  57. * | | | g
  58. * |H | |
  59. * | L | \/
  60. * ------------------ - - - - - -> x
  61. * O P
  62. * On modélise son comportement par les équations de
  63. * Navier-Stokes en description ALE (les noeuds du maillage
  64. * sont mobiles). On désigne par v, la vitesse absolue du
  65. * fluide aux noeuds du maillage et par w, la vitesse absolue
  66. * de déplacement des noeuds du maillage.
  67. * Dans la description ALE, seul le terme de convection des
  68. * équations de Navier-Stokes change, il s'écrit :
  69. * (v-w).grad(v)
  70. * Si w=0, on retrouve la description eulérienne classique.
  71. * Si w=v, le terme de convection disparait => description
  72. * lagrangienne.
  73. * Dans le cas général, il nous faut une équation qui precrit w.
  74. *
  75. * Condition initiale :
  76. * ------------------
  77. * A l'instant t=0, on imprime un pulse de pression sur la
  78. * surface libre (RQ) de la forme :
  79. * P(t) = A Dirac(t) cos(pi x / L)
  80. * Celle-ci se met à osciller librement.
  81. *
  82. * Conditions aux limites :
  83. * ----------------------
  84. * - contrainte nulle sur la surface ;
  85. * - v.n = 0 sur les bords (il faut que Q et R puissent se
  86. * déplacer).
  87. *
  88. * Prescription de w :
  89. * -----------------
  90. * Trois facons de prescrire w ont été implémentés
  91. * (voir aussi plus loin les procédures correspondantes) :
  92. * - LAGR : lagrangienne : w=v
  93. * - SLAG : surface lagrangienne : w|surf=v|surf
  94. * et Laplacien(w)=0 sur le
  95. * domaine.
  96. * - CVS2LF : on impose w // Oz ie les points du maillage
  97. * doivent se déplacer uniquement verticalement.
  98. * Ceci nous amène à résoudre une équation de convection 1D sur la
  99. * surface qui est discrétisée en DF centrées <=> EF centrés.
  100. *
  101. * Tests effectués :
  102. * ---------------
  103. * - on prescrit w par CVS2LF (le plus compliqué) ;
  104. * - on vérifie que le volume se conserve (les schémas utilisés
  105. * ne conservent PAS, a priori, le volume) ;
  106. * - on compare les ordonnées des points Q et R en fonction du
  107. * temps (zQ(t) et zR(t)) avec les profils obtenus par une
  108. * autre simulation numérique (Ramaswamy).
  109. *
  110. * Voir rapport CEA/DMT 97/371
  111. * pour plus de précisions
  112. *
  113. *************************************************************
  114. * Références : - Gounand, S. 1997
  115. * Simulation Numérique d'écoulements à surface
  116. * libre.
  117. * Rapport CEA/DMT 97/371.
  118. * - Ramaswamy, B. 1990
  119. * Numerical simulation of unsteady viscous
  120. * free surface flow
  121. * J. Comp. Phys. Vol. 90 pp. 396-430.
  122. * - Ramaswamy, B. & Kawahara, M. 1987
  123. * Lagrangian finite element analysis applied
  124. * to viscous free surface fluid flow.
  125. * Int. J. for Num. Meth. in Fluids
  126. * Vol. 7 pp. 953-984.
  127. *
  128. ***************************************************************
  129. *
  130. * JEU DE DONNEE :
  131. *
  132. prg = ('CHAINE' 'Non Linear Oscillations (NS ALE)') ;
  133. **** Options
  134. * court = VRAI : le cas-test s'effectue en une trentaine
  135. * de secondes.
  136. * court = FAUX : le cas-test est plus long. On ne raffine
  137. * pas le maillage mais on allonge le temps
  138. * de simulation, ce qui permet une "vrai"
  139. * comparaison sur zQ(t) et zR(t) avec les
  140. * résultat de notre ami Ramaswamy.
  141. * graph = VRAI : on trace les graphiques (historiques, champs)
  142. * On met graph = faux pour la fiche
  143. * de validation.
  144. * inta = VRAI si on est en interactif ; 0 sinon
  145. *
  146. * N.B. si inta et graph sont VRAIs, on a droit au film des
  147. * champs de vitesses en fin d'exécution...
  148. *
  149. *
  150. * discconv : option de discrétisation des termes de
  151. * convection pour les équations de Navier-Stokes
  152. * info 'NS' ; pour les choix possibles
  153. *
  154. court = VRAI ;
  155. graph = FAUX ;
  156. inta = FAUX ;
  157. typelem = 'QUA4' ;
  158. discconv = 'CENTREE' ;
  159. *
  160. * Méthodes de déplacement du maillage (vmail) :
  161. * LAGR - déplacement lagrangien du maillage
  162. * SLAG - surface lagrangienne, vitesse intérieure interpolée
  163. * par un laplacien.
  164. * TOTAL : le contour entier est lagrangien (w=v)
  165. * INTBOR : la surface libre est lagrangienne (w|surf = v|surf)
  166. * Sur le fond, w=0
  167. * Sur les bords : interpolation linéaire de w
  168. * BORLIB : meme chose que INTBOR sauf :
  169. * Sur les bords : condition de Neumann pour le
  170. * laplacien
  171. * CVS2LF - w // axe z sur la surface => eqn conv resolue
  172. * par un schéma Leap-Frog (disc centrée dérivée 1°)
  173. * Options : idem SLAG sauf TOTAL.
  174. *
  175. *vmail = 'LAGR' ; optlapn = 'TOTAL' ;
  176. *vmail = 'SLAG' ;
  177. * optlapn = 'TOTAL' ;
  178. * optlapn = 'INTBOR' ;
  179. * optlapn = 'BORLIB' ;
  180. vmail = 'CVS2LF' ;
  181. optlapn = 'INTBOR' ;
  182. * optlapn = 'BORLIB' ;
  183. 'OPTION' 'DIME' 2 'ELEM' typelem ;
  184. 'OPTION' 'ECHO' 1 ;
  185. 'SI' ('NON' inta) ;
  186. 'OPTION' 'TRAC' 'PS' ;
  187. 'SINON' ;
  188. **od = 'TEXTE' 'OPTION DONN 3' ;
  189. 'FINSI' ;
  190.  
  191. *************************************************************
  192. **** Définition de quelques (!) procédures :
  193. *
  194.  
  195. ** **** D'intéret général :
  196.  
  197. * -> LOG10 :
  198. * LOG base10
  199. * -> CALCERR :
  200. * Erreur relative entre deux champoints (norme Linfini)
  201. * -> TRMAIL :
  202. * Tracé d'un maillage
  203. * -> TRVIT :
  204. * Tracé d'un chpoint de vitesse VECT SOMMET
  205. * -> TRCH :
  206. * Tracé d'un chpoint SCAL
  207.  
  208. ** **** Spécifique à l'ALE :
  209.  
  210. * Elles sont en grand nombre car il faut gérer soi-meme les
  211. * dicrétisations temporelle et spatiale (domaine mobile).
  212. * On ne peut pas utiliser (pour l'instant ?) EXEC pour s'en
  213. * occuper.
  214. * En outre, on propose plusieurs méthodes pour déplacer le
  215. * maillage.
  216.  
  217. * -> CREMAIL :
  218. * Création de la cavité et de tous les sous-maillages
  219. * nécessaires.
  220. * Tout ce qui concerne la géométrie doit se trouver ici
  221. * -> CDXHAUT :
  222. * Création des deltax pour la surface libre (ici $haut)
  223. * pour utilisation dans la procedure CVS2LF
  224. * (Différences Finies)
  225. * -> INITVAR :
  226. * Initialisation de la table des variables
  227. * Variables aux instants n+1/2 et n-1/2 (si nécessaire)
  228. * -> INITPDT :
  229. * Initialisation de la table des pas de temps
  230. * Tout ce qui concerne le calcul du pas de temps
  231. * -> INITHIST :
  232. * Initialisation de la table des historiques
  233. * Toutes les listes de scalaires
  234. * -> INITSAUV :
  235. * Initialisation de la table des sauvegardes
  236. * Sauvegarde des champoints dans une table indicée
  237. * par un entier associé à un de pas de temps
  238. * -> MAJPDT :
  239. * Mise à jour de la table des pas de temps
  240. * i.e calcul du nouveau
  241. * -> MAJHIST :
  242. * Mise à jour des différents historiques
  243. * -> MAJSAUV :
  244. * On sauvegarde les différents champoints dans une table
  245.  
  246. * -> SUMMARY :
  247. * Affiche un résumé des paramètres
  248. * -> TRTOUT :
  249. * Trace tous les champs
  250. ** NB : pour simplifier, on ne transmet pas les paramètres à
  251. ** SUMMARY et TRTOUT. C'est de la mauvaise programmation...
  252. * -> MESI :
  253. * Affichage du message pour la boucle d'itérations
  254. * -> MEST :
  255. * Affichage du message pour l'avance d'un pas de temps
  256.  
  257. * -> CALCON :
  258. * Calcul de la contrainte appliquée sur la surface au premier
  259. * pas de temps
  260. * -> PREPAS :
  261. * Faire le premier pas de temps
  262. * -> CVIT :
  263. * Faire un pas de temps : termes sources en n-1/2
  264. * matrice-masse en n
  265. * divergence-pression en n+1/2
  266. * -> LAGR :
  267. * vitesse du fluide (v) =>
  268. * vitesse du maillage (w) en LAGRangien (soit w=v)
  269. * -> SLAG :
  270. * on choisit w|surf = v|surf (Surface LAGrangienne)
  271. * on interpole ensuite w sur le reste du maillage par
  272. * une équation au laplacien
  273. * -> CVS2LF :
  274. * on calcule w|surf avec v|surf en imposant w|surf // Oy
  275. * => eqn convection sur la surface.
  276. * Elle est discrétisée en différences finies centrées
  277. * d'où le nom : ConVection Surface ordre 2 (schéma de
  278. * type Leap-Frog)
  279. * on interpole ensuite w sur le reste du maillage par
  280. * une équation au laplacien
  281. * ---> IVECT :
  282. * Interpolation d'un vecteur entre deux points sur
  283. * un segment. Un chpoint VECT => 2 chpos SCAL
  284. * ---> LAPC :
  285. * Résolution d'une équation scalaire en implicite ;
  286. * Laplacien + conditions Dirichlet ou Neumann
  287. *
  288. * -> ETENDRE :
  289. * Procédure qui étend un champoint VECT SOMMET a tous les
  290. * points (FACE, CENTRE...) du maillage total
  291. * -> CINVPDTM :
  292. * Calcul du pas de temps dit "de maillage"
  293.  
  294. ** **** Post-traitement :
  295.  
  296. * -> FILMVIT :
  297. * Construit une somme de déformées pour faire un film
  298. * avec les champs de vitesse sauvegardés
  299. * -> TRHIST
  300. * Tracé des historiques (la non plus, les paramètres ne
  301. * sont pas transmis).
  302.  
  303. *
  304. * LOG base10
  305. *
  306. 'DEBPROC' LOG10 machin*'FLOTTANT' ;
  307. 'SI' (machin '&lt;EG' 0.D0) ; a = -365.25 ;
  308. 'MESSAGE' 'Procédure LOG10 : donnée <= 0' ;
  309. 'SINON' ; a = (('LOG' machin) / ('LOG' 10.)) ;
  310. 'FINSI' ;
  311. 'FINPROC' a ;
  312.  
  313. *
  314. * Erreur relative entre deux champoints (norme Linfini)
  315. *
  316. 'DEBPROC' CALCERR vitp1*'CHPOINT ' vit*'CHPOINT ' ;
  317. 'ARGUMENT' cle*'MOT ' ;
  318. 'SI' ('EGA' cle 'ECHELLE') ;
  319. 'ARGUMENT' vref*'FLOTTANT' ;
  320. 'SI' (vref '&lt;EG' 0.D0) ;
  321. 'ERREUR' 'L échelle doit etre positive' ;
  322. 'FINSI' ;
  323. 'SINON' ;
  324. mavp1 = 'MAXIMUM' vitp1 'ABS' ;
  325. mav = 'MAXIMUM' vit 'ABS' ;
  326. pmav = 'PROG' mavp1 mav ;
  327. mimav = 'MINIMUM' pmav ;
  328. mamav = 'MAXIMUM' pmav ;
  329. 'SI' (mamav '&lt;EG' 0.D0) ;
  330. 'ERREUR' 'Les deux champs sont nuls' ;
  331. 'FINSI' ;
  332. 'SI' (mimav '&lt;EG' 0.D0) ;
  333. 'MESSAGE' 'Procédure CALCERR : un des champs est nul' ;
  334. 'MESSAGE' ' => option MOYENNE' ;
  335. cle = 'MOYENNE' ;
  336. 'FINSI' ;
  337. 'SI' ('EGA' cle 'MINMAX') ;
  338. vref = mimav ;
  339. 'SINON' ;
  340. 'SI' ('EGA' cle 'MOYENNE') ;
  341. vref = (mimav '+' mamav ) '/' 2.0D0 ;
  342. 'SINON' ;
  343. 'ERREUR' 'Mauvaise option' ;
  344. 'FINSI' ;
  345. 'FINSI' ;
  346. 'FINSI' ;
  347. 'FINPROC' (('MAXIMUM' (vitp1 '-' vit) 'ABS') '/' vref) ;
  348.  
  349. *
  350. * Tracé d'un maillage
  351. *
  352. 'DEBPROC' TRMAIL mailp*'MAILLAGE' tphyp/'FLOTTANT' ;
  353. 'SI' ('EXISTE' tphyp) ;
  354. 'TRACER' mailp 'TITR' ('CHAINE' 'Maillage à t=' tphyp) ;
  355. 'SINON' ;
  356. 'TRACER' mailp 'TITR' 'Maillage' ;
  357. 'FINSI' ;
  358. 'FINPROC' ;
  359.  
  360. *
  361. * Tracé d'un chpoint de vitesse VECT SOMMET
  362. *
  363. 'DEBPROC' TRVIT vitp*'CHPOINT ' vitp2/'CHPOINT ' ;
  364. 'ARGUMENT' mailp*'MAILLAGE' ;
  365. titvp = 'Vitesses' ;
  366. 'REPETER' OPT ;
  367. 'ARGUMENT' cle/'MOT ' ;
  368. 'SI' ('NON' ('EXISTE' cle)) ;
  369. 'QUITTER' OPT ;
  370. 'FINSI' ;
  371. 'SI' ('EGA' cle 'AMPLIF') ;
  372. 'ARGUMENT' amp*'FLOTTANT' ;
  373. 'FINSI' ;
  374. 'SI' ('EGA' cle 'TEMPS') ;
  375. 'ARGUMENT' tphp*'FLOTTANT' ;
  376. titvp = ('CHAINE' titvp ' à t=' tphp) ;
  377. 'FINSI' ;
  378. 'FIN' OPT ;
  379. 'SI' ('NEG' ('TYPE' amp) 'FLOTTANT') ;
  380. mvp = ('MAXIMUM' vitp 'ABS') ;
  381. 'SI' (mvp '&lt;EG' 0.D0) ;
  382. * 'ERREUR' 'Champ de vitesses nul' ;
  383. 'MESSAGE' 'TRVIT : Champ de vitesses nul' ;
  384. 'QUITTER' TRVIT ;
  385. 'SINON' ;
  386. xp yp = 'COORDONNEE' mailp ;
  387. rp = 'PROG' (('MAXIMUM' xp) '-' ('MINIMUM' xp)) (('MAXIMUM' yp) '-' ('MINIMUM' yp)) ;
  388. amp = ('MAXIMUM' rp) '/' (15.D0 '*' mvp) ;
  389. 'FINSI' ;
  390. 'FINSI' ;
  391. ungp = 'VECTEUR' vitp amp 'UX' 'UY' 'JAUNE' ;
  392. 'SI' ('EXISTE' vitp2) ;
  393. ungp2 = 'VECTEUR' vitp2 amp 'UX' 'UY' 'ROUGE' ;
  394. ungp = (ungp2 'ET' ungp) ;
  395. 'FINSI' ;
  396. 'TRACER' ungp mailp 'TITR' titvp ;
  397. 'FINPROC';
  398.  
  399. *
  400. * Tracé d'un chpoint SCAL
  401. *
  402. 'DEBPROC' TRCH vvp*'CHPOINT ' ;
  403. 'SI' ('NEG' ('DIME' ('EXTRAIRE' vvp 'COMP')) 1) ;
  404. 'ERREUR' 'Il faut un champ à UNE composante' ;
  405. 'FINSI' ;
  406. tvvp = 'EXTRAIRE' vvp 'TYPE' ;
  407. 'SI' ('EGA' tvvp 'CENTRE ') ;
  408. 'ARGUMENT' $tdefp*'TABLE ' cle*'MOT ' ;
  409. 'SI' ('EGA' cle 'TRICHE') ;
  410. vvp = ('ELNO' $tdefp ('KCHT' $tdefp 'SCAL' tvvp vvp)) ;
  411. mvvp = ($tdefp . 'MAILLAGE') ;
  412. tm = mvvp ;
  413. 'SINON' ;
  414. 'SI' ('EGA' cle 'NORMAL') ;
  415. tm = ($tdefp . 'MAILLAGE') {
  416. mvvp = 'MODELISER' tm 'THERMIQUE' ;
  417. vvp = ('KCHA' $tdefp 'CHAM' vvp) ;
  418. 'SINON' ;
  419. 'ERREUR' 'Mauvaise option' ;
  420. 'FINSI' ;
  421. 'FINSI' ;
  422. 'SINON' ;
  423. 'SI' ('EGA' tvvp 'FACE ') ;
  424. 'ERREUR' 'Les CHPOINTs FACE ne sont pas traités...' ;
  425. 'SINON' ;
  426. 'SI' ('NON' ('EGA' tvvp 'SOMMET ')) ;
  427. 'MESSAGE' 'CHPOINT non créé par KCHT...' ;
  428. 'FINSI' ;
  429. 'ARGUMENT' mvvp*'MAILLAGE' ;
  430. tm = mvvp ;
  431. 'FINSI' ;
  432. 'FINSI' ;
  433. 'ARGUMENT' nomvp/'MOT ' tphp/'FLOTTANT' cmvvp/'MAILLAGE' ;
  434. 'ARGUMENT' nbisov/'ENTIER ' ;
  435. 'SI' ('EXISTE' nomvp) ;
  436. titvp = ('CHAINE' nomvp ' ; chpoint SCAL ' tvvp ) ;
  437. 'SINON' ;
  438. titvp = ('CHAINE' 'Chpoint SCAL ' tvvp) ;
  439. 'FINSI' ;
  440. 'SI' ('EXISTE' tphp) ;
  441. titvp = ('CHAINE' titvp ' à t=' tphp) ;
  442. 'FINSI' ;
  443. 'SI' ('NON' ('EXISTE' cmvvp)) ;
  444. cmvvp = 'CONTOUR' tm ;
  445. 'FINSI' ;
  446. maxvvp = ('MAXIMUM' vvp 'ABS') ;
  447. minvvp = ('MINIMUM' vvp 'ABS') ;
  448. 'SI' (maxvvp '&lt;EG' (minvvp 'ABS')) ;
  449. * 'ERREUR' 'Champ constant' ;
  450. 'MESSAGE' ('CHAINE' 'TRCH : Champ constant = ' maxvvp ) ;
  451. 'QUITTER' TRCH ;
  452. 'FINSI' ;
  453. 'SI' ('EXISTE' nbisov) ;
  454. 'TRACER' vvp mvvp cmvvp nbisov 'TITR' titvp ;
  455. 'SINON' ;
  456. 'TRACER' vvp mvvp cmvvp 'TITR' titvp ;
  457. 'FINSI' ;
  458. 'FINPROC' ;
  459.  
  460. *
  461. * Création de la cavité et de tous les sous-maillages
  462. * nécessaires.
  463. * Tout ce qui concerne la géométrie doit se trouver ici
  464. *
  465. 'DEBPROC' CREMAIL $cav*'TABLE ' ;
  466. 'ARGUMENT' l*'FLOTTANT' h*'FLOTTANT' ;
  467. 'ARGUMENT' nl*'ENTIER ' nh*'ENTIER ' ;
  468. 'ARGUMENT' egeom*'FLOTTANT' ;
  469. p00 = 0.D0 0.D0 ; pl0 = l 0.D0 ;
  470. p0h = 0.D0 h ; plh = l h ;
  471. dxg = 1.0D0 ; dxd = 1.0D0 ; dyb = 1.0D0 ; dyh = 1.0D0 ;
  472. 'REPETER' OPT ;
  473. 'ARGUMENT' cle/'MOT ' ;
  474. 'SI' ('NON' ('EXISTE' cle)) ;
  475. 'QUITTER' OPT ;
  476. 'FINSI' ;
  477. 'SI' ('EGA' cle 'DX') ;
  478. 'ARGUMENT' dgp*'FLOTTANT' ddp*'FLOTTANT' ;
  479. dxmoy = l '/' nl ;
  480. dxg = dgp '*' dxmoy ; dxd = ddp '*' dxmoy ;
  481. 'FINSI' ;
  482. 'SI' ('EGA' cle 'DY') ;
  483. 'ARGUMENT' dbp*'FLOTTANT' dhp*'FLOTTANT' ;
  484. dymoy = h '/' nh ;
  485. dyb = dbp '*' dymoy ; dyh = dhp '*' dymoy ;
  486. 'FINSI' ;
  487. 'FIN' OPT ;
  488. bas = pl0 'DROIT' (-1 '*' nl) p00 'DINI' dxd 'DFIN' dxg ;
  489. haut = p0h 'DROIT' (-1 '*' nl) plh 'DINI' dxg 'DFIN' dxd ;
  490. rwall = plh 'DROIT' (-1 '*' nh) pl0 'DINI' dyh 'DFIN' dyb ;
  491. lwall = p00 'DROIT' (-1 '*' nh) p0h 'DINI' dyb 'DFIN' dyh ;
  492. $cav . 'dxg' = dxg ; $cav . 'dxd' = dxd ;
  493. $cav . 'dyb' = dyb ; $cav . 'dyh' = dyh ;
  494. mt = 'DALLER' haut rwall bas lwall ;
  495. $mt = 'DOMA' mt 'IMPR' ;
  496. mt = ($mt . 'MAILLAGE') ; 'TASSER' mt ;
  497. cmt = ('CONTOUR' mt) ; lmt = chan ligne $mt.maillage ;
  498. *haut = 'CHANGER' haut SEG2 ; bas = 'CHANGER' bas SEG2 ;
  499. *lwall = 'CHANGER' lwall SEG2 ; rwall = 'CHANGER' rwall SEG2 ;
  500. $cmt = 'DOMA' cmt 'INCL' $mt egeom ;
  501. $lmt = 'DOMA' lmt 'INCL' $mt egeom ;
  502. $haut = 'DOMA' haut 'INCL' $mt egeom ;
  503. $bas = 'DOMA' bas 'INCL' $mt egeom ;
  504. $lwall = 'DOMA' lwall 'INCL' $mt egeom ;
  505. $rwall = 'DOMA' rwall 'INCL' $mt egeom ;
  506. 'ELIMINATION' (mt 'ET' lmt 'ET' bas 'ET' rwall 'ET' haut 'ET' lwall) egeom ;
  507. contini = 'COULEUR' cmt 'ROUG' ;
  508.  
  509. $cav . 'l' = l ; $cav . 'nl' = nl ;
  510. $cav . 'h' = h ; $cav . 'nh' = nh ;
  511. $cav . 'volini' = 'MESURE' mt ;
  512. $cav . '$mt' = $mt ;
  513. $cav . '$cmt' = $cmt ; $cav . '$lmt' = $lmt ;
  514. $cav . '$haut' = $haut ; $cav . '$bas' = $bas ;
  515. $cav . '$lwall' = $lwall ; $cav .'$rwall' = $rwall ;
  516. $cav . 'contini' = (contini 'PLUS' (egeom egeom)) ;
  517. $cav . 'cnfini' = FORM ;
  518. * Définition des conditions aux limites pour Navier-Stokes
  519. * VN nulle sur lwall, rwall et bas
  520. clr = 'MANUEL' 'CHPO' (lwall 'ET' rwall) 1 '1UN' 0.D0 'NATU' 'DISCRET';
  521. cb = 'MANUEL' 'CHPO' (bas) 1 '2UN' 0.D0 'NATU' 'DISCRET' ;
  522. $cav . 'CLIM' = (clr 'ET' cb) ;
  523. 'MESSAGE' 'Procédure CREMAIL : table MAILLAGE créée' ;
  524. 'FINPROC' $cav ;
  525.  
  526. *
  527. * Création des deltax pour la surface libre (ici $haut)
  528. * pour utilisation dans la procedure CVS2LF
  529. * (Différences Finies)
  530. *
  531. 'DEBPROC' CDXHAUT $h*'TABLE ' ;
  532. h = ($h . 'MAILLAGE') ;
  533. xc = 'KCHT' $h 'SCAL' 'SOMMET' ('COORDONNEES' 1 h) ;
  534. xh = 'PROG' ;
  535. 'REPETER' BBB ($h . 'NPTD') ;
  536. ppp = h 'POIN' (&BBB) ;
  537. xh = (xh 'ET' ('PROG' ('EXTRAIRE' xc 'SCAL' ppp))) ;
  538. 'FIN' BBB ;
  539. psg = 'LECT' 1 'PAS' 1 (($h . 'NPTD') '-' 1) ;
  540. psd = 'LECT' 2 'PAS' 1 ($h . 'NPTD') ;
  541. $h . 'psgg' = 'LECT' 1 'PAS' 1 (($h . 'NPTD') '-' 2) ;
  542. $h . 'psm' = 'LECT' 2 'PAS' 1 (($h . 'NPTD') '-' 1) ;
  543. $h . 'psdd' = 'LECT' 3 'PAS' 1 ($h . 'NPTD') ;
  544. $h . 'dxh' = ('EXTRAIRE' psd xh) '-' ('EXTRAIRE' psg xh) ;
  545. 'FINPROC' $h ;
  546.  
  547. *
  548. * Initialisation de la table des variables
  549. * Variables aux instants n+1/2 et n-1/2 (si nécessaire)
  550. *
  551. 'DEBPROC' INITVAR $v*'TABLE ' ;
  552. 'ARGUMENT' $c*'TABLE ' ;
  553. $mt = $c . '$mt' ;
  554. * Champoints
  555. $v . 'unm05' = 'KCHT' $mt 'VECT' 'SOMMET' (0.D0 0.D0) ;
  556. $v . 'wnm05' = 'KCHT' $mt 'VECT' 'SOMMET' (0.D0 0.D0) ;
  557. $v . 'wnp05i' = 'KCHT' $mt 'VECT' 'SOMMET' (0.D0 0.D0) ;
  558. $v . 'unp05i' = 'KCHT' $mt 'VECT' 'SOMMET' (0.D0 0.D0) ;
  559. $v . 'unp05im1' = 'KCHT' $mt 'VECT' 'SOMMET' (0.D0 0.D0) ;
  560. $v . 'anp05i' = 'KCHT' $mt 'VECT' 'SOMMET' (0.D0 0.D0) ;
  561. $v . 'pnp05i' = 'KCHT' $mt 'SCAL' 'CENTRE' 0.D0 ;
  562. $v . 'dnp05i' = 'KCHT' $mt 'SCAL' 'CENTRE' 0.D0 ;
  563. * Configuration
  564. $v . 'deltaxn' = 'KCHT' $mt 'VECT' 'SOMMET' (0.D0 0.D0) ;
  565. $v . 'cnfn' = 'FORME' ;
  566. $v . 'cnfnm05' = 'FORME' ;
  567. $v . 'cnfnp05i' = 'FORME' ;
  568. 'MESSAGE' 'Procédure INITVAR : table VARIABLE créée' ;
  569. 'FINPROC' $v ;
  570.  
  571. *
  572. * Initialisation de la table des pas de temps
  573. * Tout ce qui concerne le calcul du pas de temps
  574. *
  575. 'DEBPROC' INITPDT $t*'TABLE ' ;
  576. 'ARGUMENT' alfa*'FLOTTANT' gamma*'FLOTTANT' ;
  577. 'ARGUMENT' dtini*'FLOTTANT' poini*'ENTIER ' ;
  578. * Entiers
  579. $t . 'nupdt' = 0 ;
  580. $t . 'iter' = 0 ;
  581. * Réels
  582. $t . 'tphyn' = 0.D0 ; $t . 'tpscpu' = 0.D0 ;
  583. $t . 'alfa' = alfa ;
  584. $t . 'gamma' = gamma ; $t . 'poini' = poini ;
  585. $t . 'conv' = dtini ; $t . 'diff' = dtini ;
  586. $t . 'mail' = dtini ; $t . 'moy' = 0.D0 ;
  587. $t . 'min' = dtini ;
  588. 'MESSAGE' 'Procédure INITPDT : table PASDETPS créée' ;
  589. 'FINPROC' $t ;
  590.  
  591. *
  592. * Initialisation de la table des historiques
  593. * Toutes les listes de scalaires
  594. *
  595. 'DEBPROC' INITHIST $h*'TABLE ' ;
  596. * Listes
  597. $h . 'ltps' = 'PROG' ;
  598. $h . 'liter' = 'PROG' ;
  599. $h . 'lzq' = 'PROG' ; $h . 'lzr' = 'PROG' ;
  600. $h . 'ldv' = 'PROG' ; $h . 'lvol' = 'PROG' ;
  601. $h . 'lpdt' = 'TABLE' 'LPDT' ; hl = $h . 'lpdt' ;
  602. hl . 'conv' = 'PROG' ; hl . 'diff' = 'PROG' ;
  603. hl . 'mail' = 'PROG' ; hl . 'moy' = 'PROG' ;
  604. hl . 'min' = 'PROG' ;
  605. 'MESSAGE' 'Procédure INITHIST : table HIST créée' ;
  606. 'FINPROC' $h ;
  607.  
  608. *
  609. * Initialisation de la table des sauvegardes
  610. * Sauvegarde des champoints dans une table indicée
  611. * par un entier associé à un pas de temps
  612. *
  613. 'DEBPROC' INITSAUV $s*'TABLE ' ;
  614. * Entiers
  615. $s . 'ntrc' = 0 ;
  616. * Listes
  617. $s . 'lttrc' = 'PROG' ;
  618. * Tables
  619. $s . 'DELTAX' = 'TABLE' 'DELTAX' ;
  620. $s . 'VITESSE' = 'TABLE' 'VITESSE' ;
  621. *$s . 'PRESSION' = 'TABLE' 'PRESSION' ;
  622. *$s . 'DIVV' = 'TABLE' 'DIVV' ;
  623. 'MESSAGE' 'Procédure INITSAUV : table SAUV créée' ;
  624. 'FINPROC' $s ;
  625.  
  626. *
  627. * Mise à jour de la table des pas de temps
  628. * i.e calcul du nouveau
  629. *
  630. 'DEBPROC' MAJPDT $p*'TABLE ' ;
  631. dtcr = ($p . 'alfa') '*' ($p . 'conv') ;
  632. dtdr = ($p . 'alfa') '*' ($p . 'diff') ;
  633. dtmr = ($p . 'gamma') '*' ($p . 'mail') ;
  634. dti = ('MINIMUM' ('PROG' dtcr dtdr dtmr)) ;
  635. dtmoy = ($p . 'moy') ;
  636. npdt = ($p . 'nupdt') ; poi = ($p . 'poini') ;
  637. $p . 'moy' = (((npdt '+' poi) '*' dtmoy) '+' dti) / (npdt '+' poi '+' 1) ;
  638. $p.'min' = ('MINIMUM' ('PROG' dti ($p . 'moy'))) ;
  639. 'FINPROC' $p ;
  640.  
  641. *
  642. * Mise à jour des différents historiques
  643. *
  644. 'DEBPROC' MAJHIST $h*'TABLE ' $c*'TABLE ' ;
  645. 'ARGUMENT' $p*'TABLE ' $v*'TABLE ' ;
  646. $h . 'ltps' = (($h . 'ltps') 'ET' ('PROG' ($p . 'tphyn'))) ;
  647. $h . 'liter' = (($h . 'liter') 'ET' ('PROG' ($p . 'iter'))) ;
  648. r = (($c . '$haut' . 'MAILLAGE') 'POINT' 'INITIAL') ;
  649. q = (($c . '$haut' . 'MAILLAGE') 'POINT' 'FINAL') ;
  650. hini = ($c . 'h') ; volini = ($c . 'volini') ;
  651. $h . 'lzr' = (($h . 'lzr') 'ET' ('PROG' (('COORDONNEE' 2 r) '-' hini))) ;
  652. $h . 'lzq' = (($h . 'lzq') 'ET' ('PROG' (('COORDONNEE' 2 q) '-' hini))) ;
  653. $h . 'ldv' = (($h . 'ldv') 'ET' ('PROG' ('MAXIMUM' ($v . 'dnp05i') 'ABS'))) ;
  654. $h . 'lvol' = (($h . 'lvol') 'ET' ('PROG' ((('MESURE' ($c . '$mt' . 'MAILLAGE')) '-' volini) '/' volini))) ;
  655. $hl = ($h . 'lpdt') ;
  656. $hl . 'conv' = (($hl . 'conv') 'ET' ('PROG' ($p . 'conv'))) ;
  657. $hl . 'diff' = (($hl . 'diff') 'ET' ('PROG' ($p . 'diff'))) ;
  658. $hl . 'moy' = (($hl . 'moy') 'ET' ('PROG' ($p . 'moy'))) ;
  659. $hl . 'mail' = (($hl . 'mail') 'ET' ('PROG' ($p . 'mail'))) ;
  660. $hl . 'min' = (($hl . 'min') 'ET' ('PROG' ($p . 'min'))) ;
  661. 'FINPROC' $h ;
  662.  
  663. *
  664. * On sauvegarde les différents champoints dans une table
  665. *
  666. 'DEBPROC' MAJSAUV $s*'TABLE ' ;
  667. 'ARGUMENT' $v*'TABLE ' $p*'TABLE ' ;
  668. $s . 'ntrc' = (($s . 'ntrc') '+' 1) ;
  669. $s . 'lttrc' = (($s . 'lttrc') 'ET' ('PROG' ($p . 'tphyn'))) ;
  670. $s . 'DELTAX' . ($s . 'ntrc') = 'COPIE' ($v . 'deltaxn') ;
  671. $s . 'VITESSE' . ($s . 'ntrc') = 'COPIE' ($v . 'unp05i') ;
  672. *$s . 'PRESSION' . ($s . 'ntrc') = 'COPIE' ($v . 'pnp05i') ;
  673. *$s . 'DIVV' . ($s . 'ntrc') = 'COPIE' ($v . 'dnp05i') ;
  674. 'FINPROC' $s ;
  675.  
  676. *
  677. * Affiche un résumé des paramètres
  678. *
  679. 'DEBPROC' SUMMARY ;
  680. 'SAUTER' 'LIGNE' ;
  681. 'MESSAGE' ('CHAINE' 'Programme : ' prg) ;
  682. 'SAUTER' 'LIGNE' ;
  683. 'MESSAGE' ('CHAINE' '*** GEOMETRIE :') ;
  684. 'MESSAGE' ('CHAINE' 'Boite carrée : ' l ' x' h) ;
  685. 'MESSAGE' ('CHAINE' ' soient : ' nl 'x' nh '=' (nl '*' nh) ' éléments ' typelem) ;
  686. *'MESSAGE' ('CHAINE' ' soient : ' (nl '*' nh '*' 4)
  687. * ' éléments linéaires') ;
  688. 'SAUTER' 'LIGNE' ;
  689. 'MESSAGE' ('CHAINE' '*** PHYSIQUE :') ;
  690. 'MESSAGE' ('CHAINE' 'Gravité : ' ('COORDONNEES' 2 g) ' uz ; viscosité :' nu) ;
  691. 'MESSAGE' ('CHAINE' 'Intensité Dirac Pression : ' pt0) ;
  692. 'SAUTER' 'LIGNE' ;
  693. 'MESSAGE' ('CHAINE' '*** NUMERIQUE :') ;
  694. 'MESSAGE' ('CHAINE' 'Mode de déplacement du maillage : ' vmail ' ' optlapn) ;
  695. 'MESSAGE' ('CHAINE' 'Discrétisation ' discconv ' des termes de convection.');
  696. 'MESSAGE' ('CHAINE' ' Alfa = ' clfa) ;
  697. 'MESSAGE' ('CHAINE' ' Gamma = ' gamma) ;
  698. 'MESSAGE' ('CHAINE' ' Cvg (bcl iter) = ' cvg) ;
  699. 'MESSAGE' ('CHAINE' ' Poids (pdt1) = ' poini) ;
  700. 'SAUTER' 'LIGNE' ;
  701. 'MESSAGE' ('CHAINE' '*** TEMPS :') ;
  702. 'MESSAGE' ('CHAINE' 'Temps physique : ' ($pdt . 'tphyn')) ;
  703. 'MESSAGE' ('CHAINE' 'Temps CPU : ' ($pdt . 'tpscpu')) ;
  704. 'FINPROC' ;
  705.  
  706. *
  707. * Trace tous les champs
  708. *
  709. 'DEBPROC' TRTOUT ;
  710. $mt = ($cavite . '$mt') ; mtm = ($mt . 'MAILLAGE') ;
  711. cini = ($cavite . 'contini') ;
  712. TRMAIL (mtm 'ET' cini) ($pdt . 'tphyn') ;
  713. 'SI' ('NON' inta) ;
  714. TRVIT ($var . 'unm05') (('CONTOUR' mtm) 'ET' cini) 'AMPLIF' ampvit 'TEMPS' ($pdt . 'tphyn') ;
  715. 'SINON' ;
  716. TRVIT ($var . 'unm05') ($var . 'wnm05') (('CONTOUR' mtm) 'ET' cini) 'AMPLIF' ampvit 'TEMPS' ($pdt . 'tphyn') ;
  717. 'FINSI' ;
  718. TRCH ($var . 'pnp05i') $mt 'NORMAL' 'Pression' ($pdt . 'tphyn') ;
  719. 'FINPROC' ;
  720.  
  721. *
  722. * Affichage du message pour la boucle d'itérations
  723. *
  724. 'DEBPROC' MESI $v*'TABLE ' $p*'TABLE ' ;
  725. 'SI' ('EGA' ($p . 'iter') 1) ;
  726. 'MESSAGE' ('CHAINE' 'Iter'/1 'Dtconv'/7 'Dtdiff'/21 'Dtmaill'/35 'Dt'/49 'Erreur (log)'/61) ;
  727. 'FINSI' ;
  728. 'MESSAGE' ('CHAINE' ($p . 'iter')*3 ($p . 'conv')/5 ($p . 'diff')/19 ($p . 'mail')/33 ($p . 'min')/47 (LOG10 ($v . 'erri'))/61 ) ;
  729. 'FINPROC' ;
  730.  
  731. *
  732. * Affichage du message pour l'avance d'un pas de temps
  733. *
  734. 'DEBPROC' MEST $v*'TABLE ' $p*'TABLE ' ;
  735. 'MESSAGE' ('CHAINE' '----- Nupdt'/1 'Tphy'/15 'Dt'/29 'Max(div)'/43 'Min(pres)'/57) ;
  736. 'MESSAGE' ('CHAINE' ($p . 'nupdt')*9 ($p . 'tphyn')/13 ($p . 'min')/27 ('MAXIMUM' ($v . 'dnp05i') 'ABS')/41 ('MINIMUM' ($v . 'pnp05i') 'ABS')/55) ;
  737. 'FINPROC' ;
  738.  
  739. *
  740. * Calcul de la contrainte appliquée sur la surface au premier
  741. * pas de temps
  742. *
  743. 'DEBPROC' CALCON $h*'TABLE ' ac*'FLOTTANT' ;
  744. lini = 'ABS' ( ('COORDONNEE' 1 (($h . 'MAILLAGE') 'POINT' 'INITIAL')) '-' ('COORDONNEE' 1 (($h . 'MAILLAGE') 'POINT' 'FINAL'))) ;
  745. xhaut = 'COORDONNEE' 1 ($h . 'CENTRE') ;
  746. xts = 'NOMC' 'UX' ('KCHT' $h 'SCAL' 'CENTRE' 0.D0) 'NATU' 'DISCRET' ;
  747. yts = 'NOMC' 'UY' (ac '*' ('COS' ((180.D0 '/' lini) '*' xhaut))) 'NATU' 'DISCRET' ;
  748. 'FINPROC' ('KCHT' $h 'VECT' 'CENTRE' (xts 'ET' yts)) ;
  749.  
  750. *
  751. * Faire le premier pas de temps
  752. *
  753. 'DEBPROC' PREPAS $v*'TABLE ' $p*'TABLE ' ;
  754. 'ARGUMENT' $c*'TABLE ' ;
  755. 'ARGUMENT' tsu*'CHPOINT ' nu*'FLOTTANT' g*'POINT ' ;
  756. $mt = $c . '$mt' ; $haut = $c . '$haut' ;
  757. rv = 'EQEX' $mt 'OPTI' 'ALE' 'CENTREE' 'ZONE' $mt 'OPER' 'NS' nu g 'CN' 'INCO' 'UN' 'ZONE' $haut 'OPER' 'TOIM' 'PSURF' 'INCO' 'UN' ;
  758. rv . 'PRESSION' = 'EQPR' $mt 'ZONE' $mt 'OPER' 'PRESSION' 0.D0 ;
  759. rvp = rv . 'PRESSION' ;
  760. rv . 'INCO' = 'TABLE' 'INCO' ;
  761. rv . 'INCO' . 'UN' = 'COPIE' ($v . 'unm05') ;
  762. rv . 'INCO' . 'CN' = 'KCHT' $mt 'VECT' 'SOMMET' (0.D0 0.D0) ;
  763. rv . 'INCO' . 'PSURF' = 'KOPS' tsu '/' ($p . 'min') ;
  764. rv . 'CLIM' = 'COPIE' ($c . 'CLIM') ;
  765. ******
  766. * Calcul des matrices masse diagonales
  767. 'KDIA' rv ;
  768. rvp . 'CLIM' = rv . 'CLIM' ;
  769. rv . 'KIZD' . 'UN' = ('KOPS' (rv . 'KIZD' . 'UN') 'CLIM' (rv . 'CLIM') 1) ;
  770. rvp . 'DIAGV' = (rv . 'KIZD' . 'UN') ;
  771.  
  772. * Calcul des matrices de la divergence
  773. rvp . 'MATC' = 'KMAB' rvp ;
  774. rvp . 'PRESSION' = 'KCHT' (rvp . 'DOMAINE') 'SCAL' 'CENTRE' 0.0D0 ;
  775. * Calcul des termes source
  776. nbop = 'DIMENSION' (rv . 'LISTOPER') ;
  777. 'REPETER' BLOP nbop ;
  778. nomper = 'EXTRAIRE' &BLOP (rv . 'LISTOPER') ;
  779. notable = 'MOT' ('TEXTE' ('CHAINE' &BLOP nomper)) ;
  780. ('TEXTE' nomper) (rv . notable) ;
  781. 'FIN' BLOP ;
  782. 'OUBLIER' $mt 'MATESI' ; 'OUBLIER' $mt 'XXPSOML' ;
  783. 'OUBLIER' $mt 'XXDXDY' ; 'OUBLIER' $mt 'XXVOLUM' ;
  784. dt = ($p . 'min') ;
  785. rv . 'PASDETPS' . 'DELTAT' = dt ;
  786.  
  787. * Calcul de la pression
  788. rvp . 'DELTAT' = dt ;
  789. dm1f = 'KOPS' ('KOPS' (rv . 'KIZG' . 'UN') '/' (rv . 'KIZD' . 'UN')) '-' ('KOPS' (rv . 'INCO' . 'UN') '/' dt) ;
  790. P = 'KMF' (rvp . 'MATC') dm1f ;
  791. rvp . 'FORCE' = 'KCHT' (rvp . 'DOMAINE') 'SCAL' 'CENTRE' 0.D0 ;
  792. 'KRES' rvp P 'BETA' (rvp . 'KBETA') (rvp . 'BETA') 'PIMP' (rvp . 'KPIMP') (rvp . 'PIMP') ;
  793. rvp . 'PRESSION' = P ;
  794. rvp . 'GRADP' = 'KMTP' (rvp . 'MATC') (rvp . 'PRESSION') ;
  795. rv . 'KIZG' . 'UN' = ('KOPS' (rv . 'KIZG' . 'UN') '-' (rvp . 'GRADP')) ;
  796. * Avance en temps
  797. $v . 'unp05im1' = ('COPIE' ($v . 'unp05i')) ;
  798. $v . 'unp05i' = ('KOPS' (rv . 'INCO' . 'UN') '-' ('KOPS' ('KOPS' (rv . 'KIZG' . 'UN') '/' (rv . 'KIZD' . 'UN')) '*' dt)) ;
  799. $v . 'pnp05i' = rvp . 'PRESSION' ;
  800. $v . 'dnp05i' = ('KMF' (rvp . 'MATC') ($v . 'unp05i')) ;
  801. $p . 'conv' = rv . 'PASDETPS' . 'DTCONV' ;
  802. $p . 'diff' = rv . 'PASDETPS' . 'DTDIFU' ;
  803. $p . 'iter' = ($p . 'iter' '+' 1) ;
  804. FINPROC $v $p ;
  805.  
  806. *
  807. * Faire un pas de temps : termes sources en n-1/2
  808. * matrice-masse en n
  809. * divergence-pression en n+1/2
  810. *
  811. 'DEBPROC' CVIT $c*'TABLE ' $v*'TABLE ' $p*'TABLE ' ;
  812. 'ARGUMENT' nu*'FLOTTANT' g*'POINT ' dc*'MOT ' ;
  813. $mt = $c . '$mt' ;
  814. rv = 'EQEX' $mt 'OPTI' 'ALE' dc 'ZONE' $mt 'OPER' 'NS' nu g 'CN' 'INCO' 'UN' ;
  815. rv . 'PRESSION' = 'EQPR' $mt 'ZONE' $mt 'OPER' 'PRESSION' 0.D0 ;
  816. rvp = rv . 'PRESSION' ;
  817. rv . 'INCO' = 'TABLE' 'INCO' ;
  818. rv . 'INCO' . 'UN' = ('COPIE' ($v . 'unm05')) ;
  819. rv . 'INCO' . 'CN' = ('KOPS' (rv . 'INCO' . 'UN') '-' ($v . 'wnm05')) ;
  820. rv . 'PASDETPS' . 'PDTIMP' = ($p . 'min') ;
  821. rv . 'CLIM' = ($c . 'CLIM') ;
  822. *****
  823. * Calcul des matrices masse diagonales
  824. 'FORME' ($v . 'cnfn') ;
  825. 'KDIA' rv ;
  826. rvp . 'CLIM' = rv . 'CLIM' ;
  827. rv . 'KIZD' . 'UN' = ('KOPS' (rv . 'KIZD' . 'UN') 'CLIM' (rv . 'CLIM') 1) ;
  828. rvp . 'DIAGV' = (rv . 'KIZD' . 'UN') ;
  829.  
  830. * Calcul des matrices de la divergence
  831. 'FORME' ($v . 'cnfnp05i') ;
  832. rvp . 'MATC' = 'KMAB' rvp ;
  833. rvp . 'PRESSION' = 'KCHT' (rvp . 'DOMAINE') 'SCAL' 'CENTRE' 0.0D0 ;
  834. * Calcul des termes source
  835. 'FORME' ($v . 'cnfnm05') ;
  836. 'NS' (rv . '1NS') ;
  837. 'OUBLIER' $mt 'MATESI' ; 'OUBLIER' $mt 'XXPSOML' ;
  838. 'OUBLIER' $mt 'XXDXDY' ; 'OUBLIER' $mt 'XXVOLUM' ;
  839. dt = ($p . 'min') ;
  840. rv . 'PASDETPS' . 'DELTAT' = dt ;
  841.  
  842. * Calcul de la pression
  843. 'FORME' ($v . 'cnfnp05i') ;
  844. rvp . 'DELTAT' = dt ;
  845. dm1f = 'KOPS' ('KOPS' (rv . 'KIZG' . 'UN') '/' (rv . 'KIZD' . 'UN')) '-' ('KOPS' (rv . 'INCO' . 'UN') '/' dt) ;
  846. P = 'KMF' (rvp . 'MATC') dm1f ;
  847. rvp . 'FORCE' = 'KCHT' (rvp . 'DOMAINE') 'SCAL' 'CENTRE' 0.D0 ;
  848. 'KRES' rvp P 'BETA' (rvp . 'KBETA') (rvp . 'BETA') 'PIMP' (rvp . 'KPIMP') (rvp . 'PIMP') ;
  849. rvp . 'PRESSION' = P ;
  850. rvp . 'GRADP' = 'KMTP' (rvp . 'MATC') (rvp . 'PRESSION') ;
  851. rv . 'KIZG' . 'UN' = ('KOPS' (rv . 'KIZG' . 'UN') '-' (rvp . 'GRADP')) ;
  852. * Avance en temps
  853. $v . 'unp05im1' = ('COPIE' ($v . 'unp05i')) ;
  854. $v . 'unp05i' = ('KOPS' (rv . 'INCO' . 'UN') '-' ('KOPS' ('KOPS' (rv . 'KIZG' . 'UN') '/' (rv . 'KIZD' . 'UN')) '*' dt)) ;
  855. $v . 'pnp05i' = rvp . 'PRESSION' ;
  856. $v . 'dnp05i' = ('KMF' (rvp . 'MATC') ($v . 'unp05i')) ;
  857. $p . 'conv' = rv . 'PASDETPS' . 'DTCONV' ;
  858. $p . 'diff' = rv . 'PASDETPS' . 'DTDIFU' ;
  859. 'FINPROC' $v $p ;
  860.  
  861. *
  862. * vitesse du fluide (v) =>
  863. * vitesse du maillage (w) en Lagrangien
  864. *
  865. 'DEBPROC' LAGR veuler*'CHPOINT ' 'ARGUMENT' $c/'TABLE ' dumby1/'MOT ' dumby2/'CONFIGUR' ;
  866. 'FINPROC' ('COPIE' veuler) ;
  867.  
  868. *
  869. * on choisit w|surf = v|surf (Surface LAGrangienne)
  870. * on interpole ensuite w sur le reste du maillage par
  871. * une équation au laplacien
  872. *
  873. 'DEBPROC' SLAG veuler*'CHPOINT ' $c*'TABLE ' ;
  874. 'ARGUMENT' optlap*'MOT ' conflap*'CONFIGUR' ;
  875. $haut = ($c . '$haut') ; $bas = ($c . '$bas') ;
  876. $lwall = ($c . '$lwall') ; $rwall = ($c . '$rwall') ;
  877. $cmt = ($c . '$cmt') ;
  878. $mt = ($c . '$mt') ;
  879. haut = ($haut . 'MAILLAGE') ; bas = ($bas . 'MAILLAGE') ;
  880. lwall = ($lwall . 'MAILLAGE') ; rwall = ($rwall . 'MAILLAGE') ;
  881. sauvform = 'FORME' ;
  882. 'FORME' conflap ;
  883. 'SI' ('EGA' optlap 'INTBOR') ;
  884. vithx = 'KCHT' $haut 'SCAL' 'SOMMET' ('EXCO' 'UX' veuler) ;
  885. vithy = 'KCHT' $haut 'SCAL' 'SOMMET' ('EXCO' 'UY' veuler) ;
  886. vlwx vlwy = IVECT $lwall veuler ;
  887. vrwx vrwy = IVECT $rwall veuler ;
  888. vcx = 'KCHT' $cmt 'SCAL' 'SOMMET' 0.D0 vithx vlwx vrwx ;
  889. vmx = LAPC $mt vcx ;
  890. vcy = 'KCHT' $cmt 'SCAL' 'SOMMET' 0.D0 vithy vlwy vrwy ;
  891. vmy = LAPC $mt vcy ;
  892. 'SINON' ;
  893. 'SI' ('EGA' optlap 'BORLIB') ;
  894. vithx = 'KCHT' $haut 'SCAL' 'SOMMET' ('EXCO' 'UX' veuler) ;
  895. vithy = 'KCHT' $haut 'SCAL' 'SOMMET' ('EXCO' 'UY' veuler) ;
  896. vcx = 'KCHT' $cmt 'SCAL' 'SOMMET' 0.D0 vithx ;
  897. vmx = LAPC $mt vcx ;
  898. vcy = vithy 'ET' ('KCHT' $bas 'SCAL' 'SOMMET' 0.D0) ;
  899. vmy = LAPC $mt vcy ;
  900. 'SINON' ;
  901. 'SI' ('EGA' optlap 'TOTAL') ;
  902. vcx = 'KCHT' $cmt 'SCAL' 'SOMMET' ('EXCO' 'UX' veuler) ;
  903. vmx = LAPC $mt vcx ;
  904. vcy = 'KCHT' $cmt 'SCAL' 'SOMMET' ('EXCO' 'UY' veuler) ;
  905. vmy = LAPC $mt vcy ;
  906. 'SINON' ;
  907. 'ERREUR' 'Pas la bonne option pour le laplacien...' ;
  908. 'FINSI' ;
  909. 'FINSI' ;
  910. 'FINSI' ;
  911. vitx = 'NOMC' 'UX' vmx 'NATU' 'DISCRET' ;
  912. vity = 'NOMC' 'UY' vmy 'NATU' 'DISCRET' ;
  913. 'FORME' sauvform ;
  914. 'FINPROC' ('KCHT' $mt 'VECT' 'SOMMET' (vitx 'ET' vity)) ;
  915.  
  916. *
  917. * on calcule w|surf avec v|surf en imposant w|surf // Oy
  918. * => eqn convection sur la surface.
  919. * Elle est discrétisée en différences finies centrées
  920. * d'où le nom : ConVection Surface ordre 2 (schéma de
  921. * type Leap-Frog)
  922. * on interpole ensuite w sur le reste du maillage par
  923. * une équation au laplacien
  924. *
  925. 'DEBPROC' CVS2LF veuler*'CHPOINT ' $c*'TABLE ' ;
  926. 'ARGUMENT' optlap*'MOT ' conflap*'CONFIGUR' ;
  927. $haut = ($c . '$haut') ; $bas = ($c . '$bas') ;
  928. $lwall = ($c . '$lwall') ; $rwall = ($c . '$rwall') ;
  929. $cmt = ($c . '$cmt') ;
  930. $mt = ($c . '$mt') ;
  931. haut = ($haut . 'MAILLAGE') ; bas = ($bas . 'MAILLAGE') ;
  932. lwall = ($lwall . 'MAILLAGE') ; rwall = ($rwall . 'MAILLAGE') ;
  933. ** Calcul de withy, withx est nul
  934. * Calcul des paramètres pour le schéma aux différences finies
  935. nblh = ($haut . 'NELD') ; nbph = ($haut . 'NPTD') ;
  936. dxh = ($haut . 'dxh') ; psm = ($haut . 'psm') ;
  937. psg = ($haut . 'psgg') ; psd = ($haut . 'psdd') ;
  938. hc = 'KCHT' $haut 'SCAL' 'SOMMET' ('COORDONNEE' 2 haut) ;
  939. uc = 'KCHT' $haut 'SCAL' 'SOMMET' ('EXCO' 'UX' veuler) ;
  940. vc = 'KCHT' $haut 'SCAL' 'SOMMET' ('EXCO' 'UY' veuler) ;
  941. h = 'PROG' ; u = 'PROG' ; v = 'PROG' ; sdtl = 'PROG' ;
  942. 'REPETER' BBB nbph ;
  943. ppp = haut 'POINT' (&BBB) ;
  944. h = h 'ET' ('PROG' ('EXTRAIRE' hc 'SCAL' ppp)) ;
  945. u = u 'ET' ('PROG' ('EXTRAIRE' uc 'SCAL' ppp)) ;
  946. v = v 'ET' ('PROG' ('EXTRAIRE' vc 'SCAL' ppp)) ;
  947. 'FIN' BBB ;
  948. vi = 'EXTRAIRE' v psm ; ui = 'EXTRAIRE' u psm ;
  949. *vip1 = 'EXTRAIRE' v psd ; uip1 = 'EXTRAIRE' u psd ;
  950. *vim1 = 'EXTRAIRE' v psg ; uim1 = 'EXTRAIRE' u psg ;
  951. hi = 'EXTRAIRE' h psm ;
  952. hip1 = 'EXTRAIRE' h psd ;
  953. him1 = 'EXTRAIRE' h psg ;
  954. dxi = 'EXTRAIRE' dxh psm ; dxim1 = 'EXTRAIRE' dxh psg ;
  955. * points intermédaires
  956. dxi2 = dxi '*' dxi ; dxim12 = dxim1 '*' dxim1 ;
  957. dxp = dxi '+' dxim1 ; dxf = dxim1 '*' dxi ;
  958. dxm = dxi '-' dxim1 ;
  959. hxi = ((((dxim12 '*' hip1) '-' (dxi2 '*' him1) '/' dxp) '+' ( dxm '*' hi )) '/' dxf) ;
  960. lwithy = vi '-' (ui '*' hxi) ;
  961. * 1er point
  962. lwithy = 'INSE' lwithy 1 ('EXTRAIRE' v 1) ;
  963. * dernier point
  964. lwithy = (lwithy 'ET' ('PROG' ('EXTRAIRE' v nbph))) ;
  965. sdtl = (ui '/' dxim1) '+' (ui '/' dxi) ;
  966. dtmax = 1.D0 '/' ('MAXIMUM' sdtl) ;
  967. 'MESSAGE' 'Procédure CVS2LF : dtmax =' dtmax ;
  968. withyg = 'MANUEL' 'CHPO' ($haut . 'SOMMET') 1 'SCAL' lwithy ;
  969. withy = 'KCHT' $haut 'SCAL' 'SOMMET' withyg ;
  970.  
  971. * Interpolation de wity a partir de withy sur le reste du
  972. * maillage
  973. sauvform = 'FORME' ;
  974. 'FORME' conflap ;
  975. 'SI' ('EGA' optlap 'INTBOR') ;
  976. vlwx vlwy = IVECT $lwall veuler ;
  977. vrwx vrwy = IVECT $rwall veuler ;
  978. vcy = 'KCHT' $cmt 'SCAL' 'SOMMET' 0.D0 withy vlwy vrwy ;
  979. vmy = LAPC $mt vcy ;
  980. 'SINON' ;
  981. 'SI' ('EGA' optlap 'BORLIB') ;
  982. vcy = withy 'ET' ('KCHT' $bas 'SCAL' 'SOMMET' 0.D0) ;
  983. vmy = LAPC $mt vcy ;
  984. 'SINON' ;
  985. 'ERREUR' 'Pas la bonne option pour le laplacien...' ;
  986. 'FINSI' ;
  987. 'FINSI' ;
  988. witx = 'NOMC' 'UX' ('KCHT' $mt 'SCAL' 'SOMMET' 0.D0) 'NATU' 'DISCRET' ;
  989. wity = 'NOMC' 'UY' vmy 'NATU' 'DISCRET' ;
  990. 'FORME' sauvform ;
  991. 'FINPROC' ('KCHT' $mt 'VECT' 'SOMMET' (witx 'ET' wity)) ;
  992.  
  993. *
  994. * Interpolation d'un vecteur entre deux points sur
  995. * un segment. Un chpoint VECT => 2 chpos SCAL
  996. *
  997. 'DEBPROC' IVECT $dom*'TABLE ' chv*'CHPOINT' ;
  998. dom = ($dom . 'MAILLAGE') ; nbd = ($dom . 'NPTD') ;
  999. cyd = 'COORDONNEES' 2 dom ;
  1000. yd = 'PROG' ;
  1001. 'REPETER' BBB nbd ;
  1002. ppp = dom 'POINT' (&BBB) ;
  1003. yd = yd 'ET' ('PROG' ('EXTRAIRE' cyd 'SCAL' ppp )) ;
  1004. 'FIN' BBB ;
  1005. di = dom 'POINT' 'INITIAL' ; df = dom 'POINT' 'FINAL' ;
  1006. yi = 'EXTRAIRE' yd 1 ;
  1007. yf = 'EXTRAIRE' yd nbd ;
  1008. vdxi = 'EXTRAIRE' chv 'UX' di ;
  1009. vdxf = 'EXTRAIRE' chv 'UX' df ;
  1010. vdyi = 'EXTRAIRE' chv 'UY' di ;
  1011. vdyf = 'EXTRAIRE' chv 'UY' df ;
  1012. ax = (vdxf '-' vdxi) '/' (yf '-' yi) ;
  1013. bx = vdxi '-' (ax '*' yi) ;
  1014. lvdx = 'PROG' 'LINE' 'A' ax 'B' bx yd ;
  1015. ay = (vdyf '-' vdyi) '/' (yf '-' yi) ;
  1016. by = vdyi '-' (ay '*' yi) ;
  1017. lvdy = 'PROG' 'LINE' 'A' ay 'B' by yd ;
  1018. dom1 = chan 'POI1' dom ;
  1019. vdx = 'MANUEL' 'CHPO' dom1 1 'SCAL' lvdx 'NATURE' 'DISCRET' ;
  1020. vdy = 'MANUEL' 'CHPO' dom1 1 'SCAL' lvdy 'NATURE' 'DISCRET' ;
  1021. 'FINPROC' vdx vdy ;
  1022.  
  1023. *
  1024. * Résolution d'une équation scalaire en implicite ;
  1025. * Laplacien + conditions Dirichlet ou Neumann
  1026. *
  1027. 'DEBPROC' LAPC $dom*'TABLE ' condlim*'CHPOINT ' ;
  1028. rt = 'EQEX' $dom 'OPTI' 'EF' 'IMPL' 'ZONE' $dom 'OPER' 'LAPN' 1.D0 'INCO' 'SCAL' ;
  1029. rt . 'INCO' = 'TABLE' 'INCO' ;
  1030. rt . 'INCO' . 'SCAL' = 'KCHT' $mt 'SCAL' 'SOMMET' 0.D0 ;
  1031. rt . 'CLIM' = condlim ;
  1032. EXEC rt ;
  1033. * 'OUBLIER' $mt 'MATESI' ;
  1034. * 'OUBLIER' $mt 'XXDXDY' ; 'OUBLIER' $mt 'XXVOLUM' ;
  1035. * 'OUBLIER' $mt 'XXDIAME' ; 'OUBLIER' $mt 'XXDIEMIN' ;
  1036. 'FINPROC' (rt . 'INCO' . 'SCAL') ;
  1037.  
  1038. *
  1039. * Procédure qui étend un champoint VECT SOMMET a tous les
  1040. * points (FACE, CENTRE...) du maillage total
  1041. *
  1042. 'DEBPROC' ETENDRE $c*'TABLE ' depli*'CHPOINT ' ;
  1043. $mt = ($c . '$mt') ; $lmt = ($c . '$lmt') ;
  1044. deplic = 'NOEL' $mt depli ;
  1045. deplil = 'KCHT' $lmt 'VECT' 'SOMMET' depli ;
  1046. deplif = 'NOEL' $lmt deplil ;
  1047. deplif = 'KCHT' $mt 'VECT' 'FACE' deplif ;
  1048. deplic = 'KCHT' $mt 'VECT' 'CENTRE' deplic ;
  1049. 'FINPROC' (depli 'ET' deplic 'ET' deplif) ;
  1050.  
  1051. *
  1052. * Calcul du pas de temps dit "de maillage"
  1053. *
  1054. 'DEBPROC' CINVPDTM dvit*'CHPOINT ' $mt*'TABLE ' ;
  1055. gdvitx = ('EXCO' 'UX' ('KOPS' ('KCHT' $mt 'SCAL' 'SOMMET' ('EXCO' 'UX' dvit)) 'GRAD' $mt)) ;
  1056. gdvity = ('EXCO' 'UY' ('KOPS' ('KCHT' $mt 'SCAL' 'SOMMET' ('EXCO' 'UY' dvit)) 'GRAD' $mt)) ;
  1057. lmg = 'PROG' ('MINIMUM' gdvitx) ('MINIMUM' gdvity) ;
  1058. 'FINPROC' ('MINIMUM' lmg) ;
  1059.  
  1060. *
  1061. * Construit une somme de déformées pour faire un film
  1062. * avec les champs de vitesse sauvegardés
  1063. *
  1064. 'DEBPROC' FILMVIT $s*'TABLE ' $v*'TABLE ' ;
  1065. indmax = ($s . 'ntrc') ;
  1066. $s . 'anim' = 'TABLE' 'ANIM' ;
  1067. 'REPETER' BCL1 indmax ;
  1068. ind = &BCL1 ;
  1069. dx = ($s . 'DELTAX' . ind) ;
  1070. vv = 'VECTEUR' ($s . 'VITESSE' . ind) ampvit 'UX' 'UY' 'JAUNE' ;
  1071. $s . 'anim' . ind = ('DEFORME' ($cavite . '$mt' . 'MAILLAGE') dx 1.D0 vv) ;
  1072. 'FIN' BCL1 ;
  1073. 'FINPROC' (@STBL ($s . 'anim')) ;
  1074. *
  1075. * Tracé d'historiques
  1076. *
  1077. 'DEBPROC' TRHIST ;
  1078. ltps = ($hist . 'ltps') ;
  1079. liter = ($hist . 'liter') ; ldv = ($hist . 'ldv') ;
  1080. lvol = ($hist . 'lvol') ; ltps = ($hist . 'ltps') ;
  1081. lzr = ($hist . 'lzr') ; lzq = ($hist . 'lzq') ;
  1082. $hl = ($hist . 'lpdt') ;
  1083. lpdt = ($hl . 'min') ;
  1084. *evpdt = 'EVOL' 'MANU' 'TEMPS' ltps 'PDT' lpdt ;
  1085. *'DESSIN' evpdt 'MIMA' 'TITR' 'Pas de temps' ;
  1086.  
  1087. ltco = ('LOG' (($hl . 'conv') '*' ($pdt . 'alfa'))) '/' ('LOG' 10.) ;
  1088. ltdi = ('LOG' (($hl . 'diff') '*' ($pdt . 'alfa'))) '/' ('LOG' 10.) ;
  1089. ltma = ('LOG' (($hl . 'mail') '*' ($pdt . 'gamma'))) '/' ('LOG' 10.) ;
  1090. ltmo = ('LOG' ($hl . 'moy')) '/' ('LOG' 10.) ;
  1091. ltmi = ('LOG' ($hl . 'min')) '/' ('LOG' 10.) ;
  1092. evco = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltps 'dtconv' ltco) 'BLEU' ;
  1093. evdi = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltps 'dtdiff' ltdi) 'ROUG' ;
  1094. evma = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltps 'dtdiff' ltma) 'JAUN' ;
  1095. evmo = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltps 'dtdiff' ltmo) 'VERT' ;
  1096. evmi = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltps 'dtdiff' ltmi) 'BLAN' ;
  1097. tabt = 'TABLE' ; tabt . 'TITRE' = 'TABLE' ;
  1098. tabt . 1 = 'TIRL' ; tabt . 'TITRE' . 1 = 'Pdt diffusion' ;
  1099. tabt . 2 = 'TIRR' ; tabt . 'TITRE' . 2 = 'Pdt maillage' ;
  1100. tabt . 3 = 'TIRM' ; tabt . 'TITRE' . 3 = 'Pdt moyen' ;
  1101. tabt . 4 = 'NOLI' ; tabt . 'TITRE' . 4 = 'Pdt minimum' ;
  1102. tabt . 5 = 'TIRC' ; tabt . 'TITRE' . 5 = 'Pdt convection' ;
  1103.  
  1104. * On ne dessine pas le pdt de conv en lagrangien (infini)
  1105. 'SI' ('NON' ('EGA' vmail 'LAGR')) ;
  1106. evtot = (evdi 'ET' evma 'ET' evmo 'ET' evmi 'ET' evco) ;
  1107. 'SINON' ;
  1108. evtot = (evdi 'ET' evma 'ET' evmo 'ET' evmi) ;
  1109. 'FINSI' ;
  1110. 'DESSIN' evtot 'MIMA' 'TITR' 'Pas de temps' 'LEGE' tabt ;
  1111.  
  1112. maxy = (('ENTIER' ('MAXIMUM' liter)) '+' 1.) ;
  1113. tity = 'CHAINE' 'Nb Iter (Total = ' ('ENTIER' ('RESULT' liter)) ' ; Cpu = ' ($pdt . 'tpscpu') ')' ;
  1114. evit = 'EVOL' 'MANU' 'TEMPS' ltps 'NITER' liter ;
  1115. 'DESSIN' evit 'YBOR' 1. maxy 'MIMA' 'TITR' tity ;
  1116.  
  1117. ldv = (('LOG' ldv) '/' ('LOG' 10.)) ;
  1118. evdv = 'EVOL' 'MANU' 'TEMPS' ltps 'DIVV (log)' ldv ;
  1119. 'DESSIN' evdv 'MIMA' 'TITR' 'Div v' ;
  1120.  
  1121. 'FINPROC' ;
  1122.  
  1123. *
  1124. ** Fin de la définition des procédures
  1125. **************************************************************
  1126.  
  1127. **************************************************************
  1128. ** Début du 'main'
  1129. *
  1130. **** Définition des constantes
  1131. * l, h, nl, nh : données pour la boite carrée
  1132. * dh, db, dg, dd : densités (facultatives) pour la boite
  1133. * egeom : erreur géométrique pour 'ELIMINATION'
  1134. * cvg : critère de convergence pour la boucle d'itérations
  1135. * nitmax : nombre maximum d'itérations
  1136. * minnz : zéro pour ne pas avoir de pbs avec / , LOG ...
  1137. * nu, g, rho : paramètres pour l'eau
  1138. * minnu, ming : squizzage de certains termes dans NS
  1139. * alfa : paramètre pour NS
  1140. * gamma : coeff. gamma = 1 => le maillage dégénère
  1141. * psauv : fréquence de sauvegarde des chpoints
  1142. * tmax : temps d'arret
  1143. * pt0 : coeff intensité du cos de pression sur la surface
  1144. * dtini : 1er pas de temps
  1145. * poids du dt initial dans dtmoy
  1146. l = 4.8D0 ; nl = 14 ;
  1147. h = 4.0D0 ; nh = 22 ;
  1148. db = 3.0D0 ; dh = 0.3D0 ;
  1149. dg = 2.0D0 ; dd = 0.5D0 ;
  1150. egeom = 1.D-4 ;
  1151. cvg = 1.D-6 ;
  1152. npdtmax = -1 ;
  1153. nitmax = -1 ;
  1154. minnz = 1.D-13 ;
  1155. nu = 1.D-2 ; minnu = nu '*' minnz ;
  1156. g = (0.D0 -1.D0) ; ming = (0.D0 0.D0) ;
  1157. rho = 1.D3 ;
  1158. alfa = 0.8D0 ;
  1159. gamma = 0.01D0 ;
  1160. psauv = 1 ;
  1161. *pt0 = -1.D0 ; dtini = 0.25D0 ;
  1162. pt0 = -1.D0 ; dtini = 2.5D-6 ;
  1163. poini = 0 ;
  1164. 'SI' ('NON' court) ;
  1165. tmax = 4.0D0 ; ptrc = 1.0D0 ; ttrc = ptrc ;
  1166. * tmax = 60.0D0 ; ptrc = 10.0D0 ; ttrc = ptrc ;
  1167. * fsauv = 'CHAINE' 'nlt' ('ENTIER' tmax) vmail optlapn
  1168. * 'a' ('ENTIER' (alfa '*' 10))
  1169. * 'c' ('ENTIER' ((LOG10 cvg) '-' 0.5D0))
  1170. * 'g' ('ENTIER' ((LOG10 gamma) '-' 0.5D0)) 'po' poini '.sauv' ;
  1171. 'SINON' ;
  1172. tmax = 0.25D0 ; ptrc = 0.05D0 ; ttrc = ptrc ;
  1173. * tmax = 0.25D0 ; ptrc = 0.25D0 ; ttrc = ptrc ;
  1174. * fsauv = '/test4/gounand/ale/dumb' ;
  1175. 'FINSI' ;
  1176.  
  1177. **** Création des maillages
  1178. $cavite = 'TABLE' 'MAILLAGE' ;
  1179. $cavite = CREMAIL $cavite l h nl nh egeom ;
  1180. * 'DX' dg dd 'DY' db dh ;
  1181.  
  1182. 'SI' ('EGA' vmail 'CVS2LF') ;
  1183. CDXHAUT ($cavite . '$haut') ;
  1184. 'FINSI' ;
  1185.  
  1186. **** Initialisation des tables diverses
  1187. $var = 'TABLE' 'VARIABLE' ;
  1188. $pdt = 'TABLE' 'PASDETPS' ;
  1189. $hist = 'TABLE' 'HIST' ;
  1190. $sauv = 'TABLE' 'SAUV' ;
  1191. INITVAR $var $cavite ;
  1192. INITPDT $pdt alfa gamma dtini poini ;
  1193. INITHIST $hist ;
  1194. 'SI' (graph 'ET' inta) ;
  1195. INITSAUV $sauv ;
  1196. 'FINSI' ;
  1197. 'TEMPS' 'ZERO' ; SUMMARY ; 'TEMPS' 'ZERO' ;
  1198.  
  1199.  
  1200. **** Premier pas de temps
  1201. * Calcul de la contrainte à appliquer sur la surface
  1202. rits = CALCON ($cavite . '$haut') pt0 ;
  1203. * Calcul des champs à l'instant dtini
  1204. * Peu d'avance en temps => pas de diffusion
  1205. * Dirac => champ de pression du à g négligeable
  1206. $var $pdt = PREPAS $var $pdt $cavite rits minnu ming ;
  1207. * Pour ne pas avoir une estimation de pas de temps avec 0
  1208. $var . 'wnp05i' = ('TEXTE' vmail) ($var . 'unp05i') $cavite optlapn ($cavite . 'cnfini') ;
  1209. $var . 'erri' = CALCERR ($var . 'unp05i') ($var . 'unp05im1') 'MINMAX' ;
  1210. $pdt . 'nupdt' = (($pdt . 'nupdt') '+' 1) ;
  1211. $var . 'unm05' = ('COPIE' ($var . 'unp05i')) ;
  1212. $var . 'wnm05' = ('COPIE' ($var . 'wnp05i')) ;
  1213. ampvit = l '/' (10.D0 '*' ('MAXIMUM' ($var . 'unm05') 'ABS')) ;
  1214. MESI $var $pdt ; MEST $var $pdt ;
  1215. 'SI' graph ;
  1216. TRTOUT ;
  1217. 'SI' inta ;
  1218. MAJSAUV $sauv $var $pdt ;
  1219. 'FINSI' ;
  1220. 'FINSI' ;
  1221.  
  1222. ***** Boucle sur les pas de temps
  1223. 'REPETER' TITER npdtmax ;
  1224. **** Boucle d'itérations
  1225. * Initialisation
  1226. $pdt . 'iter' = 0 ;
  1227. $var . 'unp05i' = ('COPIER' ($var . 'unm05')) ;
  1228. $var . 'wnp05i' = ('COPIER' ($var . 'wnm05')) ;
  1229. 'FORME' ($var . 'cnfnm05') ;
  1230. $var . 'cnfnp05i' = 'FORME' ;
  1231. * Estimation du pas de temps pour le maillage
  1232. pm = CINVPDTM ($var . 'wnm05') ($cavite . '$mt') ;
  1233. $pdt . 'mail' = (-1.0D0 '/' pm) ;
  1234. MAJPDT $pdt ;
  1235. * Boucle
  1236. 'REPETER' BITER nitmax ;
  1237. * On bouge le maillage -> xn+1/2(i)
  1238. 'FORME' ($var . 'cnfnp05i') ;
  1239. $var . 'wnp05i' = ('TEXTE' vmail) ($var . 'unp05i') $cavite optlapn ($cavite . 'cnfini') ;
  1240. dxns2 = (ETENDRE $cavite ('KOPS' (0.5D0 '*' ($pdt . 'min')) '*' ($var . 'wnp05i'))) ;
  1241. 'FORME' ($var . 'cnfn') ;
  1242. $var . 'cnfnp05i' = 'FORME' dxns2 ;
  1243. * Calcul de un+1/2(i)
  1244. $var $pdt = CVIT $cavite $var $pdt nu g discconv ;
  1245. $var . 'erri' = (CALCERR ($var . 'unp05i') ($var . 'unp05im1') 'MINMAX') ;
  1246. $pdt . 'iter' = (($pdt . 'iter') '+' 1) ;
  1247. MESI $var $pdt ;
  1248. 'SI' (($var . 'erri') '<' cvg) ;
  1249. 'QUITTER' BITER ;
  1250. 'FINSI' ;
  1251. 'FIN' BITER ;
  1252. * On avance d'un pas de temps :
  1253. * estimation des maillages xn+1/2
  1254. * et xn+1 avec le dernier u calculé
  1255. 'FORME' ($var . 'cnfnp05i') ;
  1256. $var . 'wnp05i' = ('TEXTE' vmail) ($var . 'unp05i') $cavite optlapn ($cavite . 'cnfini') ;
  1257. dxns2 = (ETENDRE $cavite ('KOPS' (0.5D0 '*' ($pdt . 'min')) '*' ($var . 'wnp05i'))) ;
  1258. $var . 'deltaxn' = (($var . 'deltaxn') '+' (2.0D0 '*' dxns2)) ;
  1259. $pdt . 'nupdt' = (($pdt . 'nupdt') '+' 1) ;
  1260. $pdt . 'tphyn' = (($pdt . 'tphyn') '+' ($pdt . 'min')) ;
  1261. $var . 'unm05' = ('COPIE' ($var . 'unp05i')) ;
  1262. $var . 'wnm05' = ('COPIE' ($var . 'wnp05i')) ;
  1263. 'FORME' ($var . 'cnfn') ;
  1264. $var . 'cnfnm05' = 'FORME' dxns2 ;
  1265. * Sauvegarde éventuelle des champs à n-1/2
  1266. 'SI' (('MULT' ($pdt . 'nupdt') psauv) 'ET' graph 'ET' inta) ;
  1267. MAJSAUV $sauv $var $pdt ;
  1268. 'FINSI' ;
  1269. $var . 'cnfn' = 'FORME' dxns2 ;
  1270. * Sauvegarde du reste (volume, pos des points) à n
  1271. MAJHIST $hist $cavite $pdt $var ;
  1272. 'SI' ((($pdt . 'tphyn') '>EG' ttrc) 'ET' graph) ;
  1273. TRTOUT ; ttrc = ttrc '+' ptrc ;
  1274. 'FINSI' ;
  1275. MEST $var $pdt ;
  1276. 'SI' (($pdt . 'tphyn') '>' tmax) ;
  1277. 'QUITTER' TITER ;
  1278. 'FINSI' ;
  1279. 'MENAGE' ;
  1280. 'FIN' TITER ;
  1281.  
  1282. TABTPS = 'TEMPS' 'NOEC' ;
  1283. $pdt . 'tpscpu' = TABTPS.'TEMPS_CPU'.'INITIAL' ;
  1284.  
  1285. ** Sauvegarde
  1286. 'SI' ('EXISTE' ($cavite . '$mt') 'MATESI') ;
  1287. 'OUBLIER' ($cavite . '$mt') 'MATESI' ;
  1288. 'FINSI' ;
  1289. 'MENAGE' ;
  1290. *'OPTION' 'SAUV' fsauv ;
  1291. *'SAUVER' ;
  1292.  
  1293. *
  1294. ** Fin du 'main'
  1295. **************************************************************
  1296.  
  1297. **************************************************************
  1298. ** Début du post-traitement
  1299. *
  1300. 'SI' graph ;
  1301. 'SI' inta ;
  1302. 'FORME' ($cavite . 'cnfini') ;
  1303. fv = FILMVIT $sauv $var ;
  1304. 'TRACER' fv 'ANIME' ;
  1305. 'OUBLIER' fv ; MENAGE ;
  1306. 'FINSI' ;
  1307. TRHIST;
  1308. 'FINSI' ;
  1309.  
  1310. *** Les tests...
  1311. ltps = ($hist . 'ltps') ; lvol = ($hist . 'lvol') ;
  1312. lzr = ($hist . 'lzr') ; lzq = ($hist . 'lzq') ;
  1313. ** Ici, on teste la conservation du volume du domaine
  1314. critere1 = 'MAXIMUM' lvol 'ABS' ;
  1315. * Résultat obtenu le 29/12/97 :
  1316. * critere1 = .9806970050855623D-14
  1317. limite1 = 1.D-10 ;
  1318. 'SI' graph ;
  1319. evvol = 'EVOL' 'MANU' 'TEMPS' ltps 'VOLUME' lvol ;
  1320. 'DESSIN' evvol 'AXES' 'MIMA' 'TITR' 'Ecart au volume initial' ;
  1321. 'FINSI' ;
  1322.  
  1323. ltrram = ('PROG' 0.0 0.4 0.9 1.55 2.35 3.1 3.9 4.7 5.65 6.75 7.75 8.6 9.25 9.95 10.65 11.35 11.9 12.45) '*' (4. '/' 12.) ;
  1324. ltqram = ('PROG' 0.0 0.5 1. 1.6 2.25 2.9 3.7 4.4 5.1 6.1 7.1 7.9 8.6 9.2 9.9 10.5 11.1 11.6 12. 12.45) '*' (4. '/' 12.) ;
  1325. lzrram = ('PROG' 0.0 0.45 1.05 1.6 2.4 2.95 3.5 3.8 3.95 3.95 3.75 3.25 2.8 2.15 1.6 0.9 0.3 -0.25) '*' ((-2.) '/' 11.8) ;
  1326. lzqram = ('PROG' 0.0 0.75 1.35 2.3 3.25 4.15 5.15 5.8 6.3 6.5 6.4 5.85 5.25 4.5 3.8 3. 2.25 1.45 0.75 0.25) '*' (2. '/' 11.8) ;
  1327. * Comparaison des profils zQ(t) et zR(t) de Ramaswami aux notres
  1328. * on les remet sur ltps par interpolation linéaire
  1329. lzrint = 'IPOL' ltps ltrram lzrram ;
  1330. lzqint = 'IPOL' ltps ltqram lzqram ;
  1331. * échelles pour r et q
  1332. echr = 'MINIMUM' ('PROG' ('MAXIMUM' lzr 'ABS') ('MAXIMUM' lzrram 'ABS') ('MAXIMUM' lzrint 'ABS')) ;
  1333. echq = 'MINIMUM' ('PROG' ('MAXIMUM' lzq 'ABS') ('MAXIMUM' lzqram 'ABS') ('MAXIMUM' lzqint 'ABS')) ;
  1334. echrq = 'MINIMUM' ('PROG' echr echq) ;
  1335. critere2 = ('MAXIMUM' (lzrint '-' lzr) 'ABS') '/' echrq ;
  1336. critere3 = ('MAXIMUM' (lzqint '-' lzq) 'ABS') '/' echrq ;
  1337. * Résultats obtenus le 29/12/97 :
  1338. * critere2 = .4174969242483980D-01
  1339. * critere3 = .9776923547482334D-01
  1340. limite2 = 0.05D0 ;
  1341. limite3 = 0.12D0 ;
  1342.  
  1343. 'SI' graph ;
  1344. evzq = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltps 'zQ' lzq) 'ROSE' ;
  1345. evzr = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltps 'zR' lzr) 'TURQ' ;
  1346. evzqint = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltps 'zQint' lzqint) 'ROUG' ;
  1347. evzrint = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltps 'zRint' lzrint) 'BLEU' ;
  1348. evzqram = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltqram 'zQram' lzqram) 'JAUN' ;
  1349. evzrram = 'COULEUR' ('EVOL' 'MANU' 'TEMPS' ltrram 'zRram' lzrram) 'VERT' ;
  1350. tabevzqr = 'TABLE' ; tabevzqr . 'TITRE' = 'TABLE' ;
  1351. tabevzqr . 1 = 'NOLI' ;
  1352. tabevzqr . 'TITRE' . 1 = 'zQ (Castem 2000)' ;
  1353. tabevzqr . 2 = 'NOLI' ;
  1354. tabevzqr . 'TITRE' . 2 = 'zR (Castem 2000)' ;
  1355. tabevzqr . 3 = 'TIRR' ;
  1356. tabevzqr . 'TITRE' . 3 = 'zQ (Rama. interpolé)' ;
  1357. tabevzqr . 4 = 'TIRR' ;
  1358. tabevzqr . 'TITRE' . 4 = 'zR (Rama. interpolé)' ;
  1359. tabevzqr . 5 = 'NOLI MARQ CARR' ;
  1360. tabevzqr . 'TITRE' . 5 = 'zQ (Ramaswami)' ;
  1361. tabevzqr . 6 = 'NOLI MARQ CARR' ;
  1362. tabevzqr . 'TITRE' . 6 = 'zR (Ramaswami)' ;
  1363. 'DESSIN' (evzq 'ET' evzr 'ET' evzqint 'ET' evzrint 'ET' evzqram 'ET' evzrram) 'MIMA' 'TITR' 'Amplitude de Q et R' 'XBOR' 0. tmax 'LEGE' 'AXES' tabevzqr ;
  1364. 'FINSI' ;
  1365. *
  1366. ** Affichage des messages et des erreurs éventuelles
  1367. *
  1368. 'OPTION' 'ECHO' 0 ;
  1369. SUMMARY ;
  1370. 'SAUTER' 2 'LIGNE' ;
  1371. 'MESSAGE' 'Debriefing :' ;
  1372. 'MESSAGE' '------------' ;
  1373. 'MESSAGE' 'Conservation relative du volume' ;
  1374. 'MESSAGE' 'Valeur / Limite :' ;
  1375. 'MESSAGE' ('CHAINE' 'FORMAT' '(D24.16)' critere1 ' / ' limite1) ;
  1376. 'SAUTER' 'LIGNE' ;
  1377. 'MESSAGE' 'Comparaison d ordonnées (points extremes de la surface)' ;
  1378. 'MESSAGE' 'avec une autre simulation numérique (Ramaswamy)' ;
  1379. 'MESSAGE' 'zR(t) (Erreur / Limite) :' ;
  1380. 'MESSAGE' ('CHAINE' 'FORMAT' '(D24.16)' critere2 ' / ' limite2) ;
  1381. 'MESSAGE' 'zQ(t) (Erreur / Limite) :' ;
  1382. 'MESSAGE' ('CHAINE' 'FORMAT' '(D24.16)' critere3 ' / ' limite3) ;
  1383. 'SAUTER' 'LIGNE' ;
  1384. 'MESSAGE' ('CHAINE' 'Temps CPU / Temps CPU (29/12/97) (interactif) : ') ;
  1385. 'MESSAGE' ('CHAINE' ('ENTIER' (($pdt . 'tpscpu') '/' 100.0D0)) ' / ~28' ' secondes') ;
  1386. 'SI' ('OU' (critere1 '>' limite1) ('OU' (critere2 '>' limite2) (critere3 '>' limite3))) ;
  1387. 'ERREUR' 5 ;
  1388. 'FINSI' ;
  1389. 'MESSAGE' 'Tout s est bien passé' ;
  1390. 'OPTION' 'ECHO' 1 ;
  1391. 'SI' inta ; 'OPTION' 'DONN' 5 ; 'FINSI' ;
  1392. *
  1393. ** Fin du post-traitement
  1394. **************************************************************
  1395. 'FIN' ;
  1396.  
  1397.  
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.  

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