Télécharger SPAL.procedur

Retour à la liste

Numérotation des lignes :

  1. * SPAL PROCEDUR JC220346 18/05/28 21:15:01 9753
  2. ************************************************************************
  3. * NOM : SPAL
  4. * DESCRIPTION : Calcule la viscosité turbulente grâce au modèle de
  5. * Spalart-Allmaras
  6. ************************************************************************
  7. * HISTORIQUE : 6/10/2010 : JCARDO : création de la procédure
  8. * HISTORIQUE : 28/02/2011 : JCARDO : - ajout de 'DUMP' et 'METHINV'
  9. * - branchement sur le nouveau PRODT
  10. * - gestion du cas où DFDT est absent
  11. * - légère amélioration du Newton
  12. * - correction de quelques MESS
  13. * HISTORIQUE :
  14. * HISTORIQUE :
  15. ************************************************************************
  16. * Prière de PRENDRE LE TEMPS DE COMPLÉTER LES COMMENTAIRES
  17. * en cas de modification de ce sous-programme afin de faciliter
  18. * la maintenance !
  19. ************************************************************************
  20. * SYNTAXE (cf. opérateur EQEX)
  21. *
  22. * 'ZONE' $MD 'OPER' 'SPAL' 'RHO' 'UN' 'MU' ('DT')
  23. * ('PERIODIC' GEOM1 GEOM2)
  24. * 'INCO' 'NU0'
  25. *
  26. ************************************************************************
  27.  
  28.  
  29. DEBP SPAL ;
  30. ARGU RX*'TABLE' ;
  31.  
  32. RV = RX . 'EQEX' ;
  33. DG = DOMA $MD 'XXDIAGSI' ;
  34.  
  35. NDIM = VALE 'DIME' ;
  36.  
  37. * Recherche-t-on directement un régime permanent (pas de DFDT) ?
  38. SI (NON (EXIS RX 'RINSTAT')) ;
  39. RX . 'RINSTAT' = FAUX ;
  40. REPE BLOCO (DIME (RV . 'LISTOPER')) ;
  41. MOPER = EXTR &BLOCO (RV . 'LISTOPER') ;
  42. SI (EGA MOPER 'DFDT ') ;
  43. RX . 'RINSTAT' = VRAI ;
  44. FINS ;
  45. FIN BLOCO ;
  46. FINS ;
  47.  
  48. * Impression écran ?
  49. KIMPR = (RV.'IMPR' > 0) ;
  50.  
  51.  
  52.  
  53. * +====================================================================+
  54. * | |
  55. * | L E C T U R E D E S A R G U M E N T S |
  56. * | |
  57. * +====================================================================+
  58.  
  59.  
  60. IARG = RX . 'IARG' ;
  61.  
  62. SI (RX . 'RINSTAT') ;
  63. IREQ = 4 ;
  64. SINON ;
  65. IREQ = 3 ;
  66. FINS ;
  67.  
  68. SI (IARG < IREQ) ;
  69. MESS '******************************************************' ;
  70. MESS '/!\ ERREUR dans SPAL :' ;
  71. MESS (CHAI ' La procédure SPAL requiert au moins '
  72. IREQ ' arguments') ;
  73. MESS '******************************************************' ;
  74. QUIT SPAL ;
  75. FINS ;
  76.  
  77.  
  78.  
  79. * +=================+
  80. * | MASSE VOLUMIQUE |
  81. * +=================+
  82.  
  83. RHO = RX . 'ARG1' ;
  84. TRHO = TYPE RHO ;
  85.  
  86. SI (EGA TRHO 'MOT') ;
  87. RHO = RV . 'INCO' . RHO ;
  88. TRHO = TYPE RHO ;
  89. FINS ;
  90.  
  91. SI ((NEG TRHO 'FLOTTANT') ET (NEG TRHO 'CHPOINT')) ;
  92. MESS '******************************************************' ;
  93. MESS '/!\ ERREUR dans SPAL :' ;
  94. MESS ' INCO."RHO" renvoie à un objet de type incorrect' ;
  95. MESS '******************************************************' ;
  96. QUIT SPAL ;
  97. FINS ;
  98.  
  99. SI (EGA TRHO 'FLOTTANT') ;
  100. USRHO = 1. / RHO ;
  101. SINON ;
  102. USRHO = INVE RHO ;
  103. FINS ;
  104.  
  105.  
  106.  
  107. * +=====================+
  108. * | VITESSE D'ADVECTION |
  109. * +=====================+
  110.  
  111. UN = RX . 'ARG2' ;
  112. TUN = TYPE UN ;
  113.  
  114. SI (EGA TUN 'MOT') ;
  115. UN = RV . 'INCO' . UN ;
  116. TUN = TYPE UN ;
  117. FINS ;
  118.  
  119. SI (NEG TUN 'CHPOINT') ;
  120. MESS '******************************************************' ;
  121. MESS '/!\ ERREUR dans SPAL :' ;
  122. MESS ' INCO."UN" doit renvoyer à un objet de type CHPOINT' ;
  123. MESS '******************************************************' ;
  124. QUIT SPAL ;
  125. FINS ;
  126.  
  127. LCO = EXTR UN 'COMP' ;
  128. NCO = DIME LCO ;
  129.  
  130.  
  131.  
  132.  
  133. * +=================================+
  134. * | VISCOSITÉ DYNAMIQUE MOLÉCULAIRE |
  135. * +=================================+
  136.  
  137. MU = RX . 'ARG3' ;
  138. TMU = TYPE MU ;
  139.  
  140. SI (EGA TMU 'MOT') ;
  141. MU = RV . 'INCO' . MU ;
  142. TMU = TYPE MU ;
  143. FINS ;
  144.  
  145. SI ((NEG TMU 'FLOTTANT') ET (NEG TMU 'CHPOINT')) ;
  146. MESS '******************************************************' ;
  147. MESS '/!\ ERREUR dans SPAL :' ;
  148. MESS ' INCO."MU" renvoie à un objet de type incorrect' ;
  149. MESS '******************************************************' ;
  150. QUIT SPAL ;
  151. FINS ;
  152.  
  153. * Viscosité cinématique moléculaire
  154. NU = MU * USRHO ;
  155.  
  156. SI (EGA TMU 'FLOTTANT') ;
  157. USNU = 1. / NU ;
  158. SINON ;
  159. USNU = INVE NU ;
  160. FINS ;
  161.  
  162.  
  163.  
  164.  
  165. * +===============================+
  166. * | DURÉE DU PAS DE TEMPS COURANT |
  167. * +===============================+
  168.  
  169. SI (RX . 'RINSTAT') ;
  170. DT = RX . 'ARG4' ;
  171. TDT = TYPE DT ;
  172.  
  173. SI (EGA TDT 'MOT') ;
  174. DT = RV . 'INCO' . DT ;
  175. TDT = TYPE DT ;
  176. FINS ;
  177.  
  178. SI (NEG TDT 'FLOTTANT') ;
  179. MESS '******************************************************' ;
  180. MESS '/!\ ERREUR dans SPAL :' ;
  181. MESS ' INCO."DT" renvoie à un objet de type incorrect' ;
  182. MESS '******************************************************' ;
  183. QUIT SPAL ;
  184. FINS ;
  185. FINS ;
  186.  
  187.  
  188.  
  189.  
  190. * +===========================+
  191. * | CONDITIONS DE PERIODICITÉ |
  192. * +===========================+
  193.  
  194. B_CYCL = FAUX ;
  195. SI (IARG > IREQ) ;
  196. MCLE = RX . (CHAI 'ARG' (IREQ+1)) ;
  197.  
  198. SI (EGA MCLE 'PERIODIC') ;
  199. B_CYCL = VRAI ;
  200.  
  201. GEOM1 = RX . (CHAI 'ARG' (IREQ+2)) ;
  202. GEOM2 = RX . (CHAI 'ARG' (IREQ+3)) ;
  203.  
  204. TG1 = TYPE GEOM1 ;
  205. TG2 = TYPE GEOM2 ;
  206.  
  207. SI ((NEG TG1 'MAILLAGE') OU (NEG TG2 'MAILLAGE')) ;
  208. MESS '******************************************************' ;
  209. MESS '/!\ ERREUR dans SPAL :' ;
  210. MESS ' On attendait 2 objets de type MAILLAGE' ;
  211. MESS '******************************************************' ;
  212. QUIT SPAL ;
  213. FINS ;
  214. SINON ;
  215. MESS '******************************************************' ;
  216. MESS '/!\ ERREUR dans SPAL :' ;
  217. MESS ' On attendait le mot-clé "PERIODIC"' ;
  218. MESS '******************************************************' ;
  219. QUIT SPAL ;
  220. FINS ;
  221. FINS ;
  222.  
  223.  
  224.  
  225.  
  226. * +=========================================+
  227. * | NOM DE L'INCONNUE DE VISCOSITÉ MODIFIÉE |
  228. * +=========================================+
  229.  
  230. B_INCO = FAUX ;
  231. SI (EXIS RX 'LISTINCO') ;
  232. SI (EGA (DIME (RX . 'LISTINCO')) 1) ;
  233. B_INCO = VRAI ;
  234. FINS ;
  235. FINS ;
  236.  
  237. SI (NON B_INCO) ;
  238. MESS '******************************************************' ;
  239. MESS '/!\ ERREUR dans SPAL :' ;
  240. MESS ' On attendait le nom donné à la seule inconnue du' ;
  241. MESS ' modèle (la viscosité modifiée)' ;
  242. MESS '******************************************************' ;
  243. QUIT SPAL ;
  244. FINS ;
  245.  
  246. _NU0 = EXTR (RX . 'LISTINCO') 1 ;
  247.  
  248. * Valeurs minimales admises pour NU0 et S0 (si B_POSI est VRAI)
  249. NU0_MIN = NU*1.E-5 ;
  250. SI (EGA TMU 'CHPOINT') ;
  251. NU0_MIN = MINI NU0_MIN ;
  252. FINS ;
  253. S0_MIN = 1.E-10 ;
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261. * +====================================================================+
  262. * | |
  263. * | I N I T I A L I S A T I O N D U M O D È L E |
  264. * | |
  265. * +====================================================================+
  266. *
  267. * Ces opérations sont effectuées uniquement lors du premier appel à
  268. * l'opérateur SPAL (ou après que RX.'INITOK' a été détruit) :
  269. *
  270. * - Création/mise à jour de la table RV.'SPALART_ALLMARAS' contenant
  271. * les options de calcul personnalisables du modèle
  272. *
  273. * - Création des tables requises par les opérateurs TSCA et DFDT
  274. *
  275. * - Création des matrices pour les conditions de périodicité
  276. *
  277. * - Initialisation éventuelle de la variable interne du modèle
  278. * (viscosité modifiée NU0)
  279. *
  280. * - Création d'une sous-table dans 'INCO' qui contient les variables
  281. * intermédiaires du modèle si 'DUMP'=VRAI
  282. *
  283.  
  284.  
  285. SI (NON (EXIS RX 'INITOK')) ;
  286.  
  287.  
  288. * +===================================================================+
  289. * | VALEURS PAR DÉFAUT DES PARAMÈTRES AVANCÉS PERSONNALISABLES |
  290. * +===================================================================+
  291.  
  292. * Version du modèle à utiliser
  293. * ----------------------------
  294. KVERS = 'ORIG' ;
  295.  
  296.  
  297. * Nom de l'inconnue contenant la viscosité totale
  298. * -----------------------------------------------
  299. _MUF = 'MUFN' ;
  300.  
  301.  
  302. * Constantes du modèle de Spalart-Allmaras
  303. * ----------------------------------------
  304. KCONST = TABL ;
  305. KCONST . 'SIGMA' = 2./3. ;
  306. KCONST . 'CB1' = 0.1355 ;
  307. KCONST . 'CB2' = 0.622 ;
  308. KCONST . 'KAPPA' = 0.41 ;
  309. KCONST . 'CW1' = ((KCONST.'CB1')/((KCONST.'KAPPA')**2))
  310. + ((1.+(KCONST.'CB2'))/(KCONST.'SIGMA')) ;
  311. KCONST . 'CW2' = 0.3 ;
  312. KCONST . 'CW3' = 2. ;
  313. KCONST . 'CV1' = 7.1 ;
  314.  
  315.  
  316. * Mesure scalaire du tenseur gradient des vitesses
  317. * ------------------------------------------------
  318. KTGRAD = 'TOROT' ;
  319.  
  320.  
  321. * Instant auquel est renvoyé le résultat dans MUFN
  322. * ------------------------------------------------
  323. KMUFN = 'APRES' ;
  324.  
  325.  
  326. * Algorithme de traitement des termes sources
  327. * -------------------------------------------
  328. KSRC = 'ALGO1' ;
  329.  
  330.  
  331. * Configuration de l'algorithme de Newton
  332. * ---------------------------------------
  333. NEWTON = TABL ;
  334. NEWTON . 'CRIT' = 1.E-10 ;
  335. NEWTON . 'IMAX' = 10 ;
  336. NEWTON . 'OMEGA' = 1. ;
  337.  
  338.  
  339. * Options de la méthode d'inversion
  340. * ---------------------------------
  341. METINV = COPI (RV . 'METHINV') ;
  342.  
  343.  
  344. * Options de la discrétisation temporelle DFDT
  345. * --------------------------------------------
  346. KOPT2 = COPI (RX . 'KOPT') ;
  347. KOPT2 . 'IDCEN' = 1 ;
  348.  
  349.  
  350. * Etat des différents verrous numériques
  351. * --------------------------------------
  352. VERROU = TABL ;
  353. VERROU . 'POSITIF' = VRAI ;
  354. VERROU . 'DURBIN' = FAUX ;
  355.  
  356.  
  357. * Sauvegarder les variables internes?
  358. * -----------------------------------
  359. KDUMP = FAUX ;
  360.  
  361.  
  362.  
  363. * +===================================================================+
  364. * | SURCHARGEMENT DES VALEURS PAR DÉFAUT PAR LES VALEURS UTILISATEUR |
  365. * +===================================================================+
  366. *
  367. * Les valeurs par défaut définies ci-dessus sont placées dans une table
  368. * temporaire TABSA. Ensuite, la table RV.'SPALART_ALLMARAS' créée par
  369. * l'utilisateur est parcourue (si elle existe) et toutes ses valeurs
  370. * viennent surcharger celles de TABSA. Enfin, on met à jour la table
  371. * RV.'SPALART_ALLMARAS' en la remplaçant par la table TABSA.
  372. *
  373.  
  374. TABSA = TABL ;
  375. TABSA . 'KVERS' = KVERS ;
  376. TABSA . 'NOMMUF' = _MUF ;
  377. TABSA . 'KCONST' = KCONST ;
  378. TABSA . 'KTGRAD' = KTGRAD ;
  379. TABSA . 'KMUFN' = KMUFN ;
  380. TABSA . 'KSRC' = KSRC ;
  381. TABSA . 'NEWTON' = NEWTON ;
  382. TABSA . 'METHINV' = METINV ;
  383. TABSA . 'KOPT2' = KOPT2 ;
  384. TABSA . 'VERROU' = VERROU ;
  385. TABSA . 'DUMP' = KDUMP ;
  386.  
  387. SI (EXIS RV 'SPALART_ALLMARAS') ;
  388. RVSA = RV . 'SPALART_ALLMARAS' ;
  389.  
  390. SI ((DIME RVSA) > 0) ;
  391. TIDX0 = INDE RVSA ;
  392. REPE BLOC1 (DIME TIDX0) ;
  393. MIDX1 = CHAI TIDX0 . &BLOC1 ;
  394. OBJ1 = RVSA . MIDX1 ;
  395. SI (EGA (TYPE OBJ1) 'TABLE') ;
  396. SI ((DIME OBJ1) > 0) ;
  397. TIDX1 = INDE OBJ1 ;
  398. REPE BLOC2 (DIME TIDX1) ;
  399. MIDX2 = CHAI TIDX1 . &BLOC2 ;
  400. TABSA . MIDX1 . MIDX2 = OBJ1 . MIDX2 ;
  401. FIN BLOC2 ;
  402. FINS ;
  403. SINON ;
  404. TABSA . MIDX1 = OBJ1 ;
  405. FINS ;
  406. FIN BLOC1 ;
  407. FINS ;
  408.  
  409. FINS ;
  410.  
  411. RV . 'SPALART_ALLMARAS' = TABSA ;
  412.  
  413.  
  414.  
  415.  
  416.  
  417. * +===================================================================+
  418. * | CRÉATION DES TABLES DE L'ÉQUATION DE TRANSPORT |
  419. * +===================================================================+
  420. *
  421. * Création des tables de type 'KIZX' qui sont fournies à chaque pas de
  422. * temps aux opérateurs TSCA et DFDT.
  423.  
  424.  
  425. * Partie commune aux tables de TSCA et de DFDT
  426. RX0 = TABL 'KIZX' ;
  427. RX0 . 'EQEX' = RV ;
  428. RX0 . 'NOMZONE' = ' ' ;
  429. RX0 . 'DOMZ' = $MD ;
  430. RX0 . 'TDOMZ' = 0 ;
  431. RX0 . 'LISTINCO' = MOTS _NU0 ;
  432.  
  433.  
  434. * Table de l'opérateur TSCA
  435. RX1 = COPI RX0 ;
  436. RX1 . 'NOMOPER' = MOT 'TSCA_N' ;
  437. RX1 . 'KOPT' = (RX . 'KOPT') ;
  438. RX1 . 'IARG' = 3 ;
  439. RX1 . 'ARG1' = 'RHO' ;
  440. RX1 . 'ARG2' = 'UN' ;
  441. RX1 . 'ARG3' = 'SADIFF' ;
  442.  
  443. RX . 'RX1' = RX1 ;
  444.  
  445.  
  446. * Table de l'opérateur DFDT (si résolution instationnaire)
  447. SI (RX . 'RINSTAT') ;
  448. RX2 = COPI RX0 ;
  449. RX2 . 'NOMOPER' = MOT 'DFDT_N' ;
  450. RX2 . 'KOPT' = (RV . 'SPALART_ALLMARAS' . 'KOPT2') ;
  451. RX2 . 'IARG' = 3 ;
  452. RX2 . 'ARG1' = 'RHO' ;
  453. RX2 . 'ARG2' = _NU0 ;
  454. RX2 . 'ARG3' = 'DT' ;
  455.  
  456. * Gestion du décentrement pour DFDT (par défaut on l'a désactivé)
  457. IDCEN = (RX2 . 'KOPT' . 'IDCEN') ;
  458. SI ((EGA IDCEN 2) OU (EGA IDCEN 3)) ;
  459. RX2 . 'IARG' = 5 ;
  460. RX2 . 'ARG4' = 'UN' ;
  461. RX2 . 'ARG5' = _MUF ;
  462. FINS ;
  463.  
  464. RX . 'RX2' = RX2 ;
  465. FINS ;
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473. * +===================================================================+
  474. * | CRÉATION DES MATRICES POUR LES CONDITIONS PÉRIODIQUES |
  475. * +===================================================================+
  476.  
  477. SI (B_CYCL) ;
  478. MATC = RELA 'UX' GEOM1 - 'UX' GEOM2 ;
  479. STC = DEPI MATC 0. ;
  480. MATC = KOPS 'RIMA' MATC ;
  481.  
  482. MATC = KOPS 'CHANINCO' MATC
  483. (MOTS 'LX' 'UX') (MOTS 'LX' _NU0)
  484. (MOTS 'FLX' 'FX') (MOTS 'LX' _NU0) ;
  485. STC = EXCO STC 'FLX' 'LX' ;
  486.  
  487. RX . 'MATC' = MATC ;
  488. RX . 'STC' = STC ;
  489. FINS ;
  490.  
  491.  
  492.  
  493.  
  494. * +===================================================================+
  495. * | CRÉATION DE L'INCONNUE INTERNE (VISCOSITÉ MODIFIÉE) |
  496. * +===================================================================+
  497.  
  498. SI (NON (EXIS (RV . 'INCO') _NU0)) ;
  499. NU0 = KCHT $MD 'SCAL' 'SOMMET' NU0_MIN ;
  500. RV . 'INCO' . _NU0 = NU0 ;
  501. FINS ;
  502.  
  503.  
  504.  
  505.  
  506.  
  507. * +===================================================================+
  508. * | CRÉATION DE LA TABLE CONTENANT LES VARIABLES INTERNES |
  509. * +===================================================================+
  510. * Cette table ne sera utilisée que si 'DUMP'=VRAI
  511.  
  512. SI (NON (EXIS (RV . 'INCO') 'SPAL')) ;
  513. RV . 'INCO' . 'SPAL' = TABL ;
  514. FINS ;
  515.  
  516.  
  517.  
  518.  
  519. * INITIALISATION TERMINÉE!
  520. RX . 'INITOK' = 1 ;
  521. FINS ;
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531. * +====================================================================+
  532. * | |
  533. * | P R É P A R A T I O N D E S C A L C U L S |
  534. * | |
  535. * +====================================================================+
  536. *
  537.  
  538.  
  539. * +===================================================================+
  540. * | RÉCUPÉRATION DES PARAMÈTRES PERSONNALISABLES |
  541. * +===================================================================+
  542.  
  543. RVSA = RV . 'SPALART_ALLMARAS' ;
  544.  
  545.  
  546. * Version du modèle à utiliser
  547. * ----------------------------
  548. KVERS = RVSA . 'KVERS' ;
  549.  
  550.  
  551. * Nom de l'inconnue contenant la viscosité totale
  552. * -----------------------------------------------
  553. _MUF = RVSA . 'NOMMUF' ;
  554.  
  555.  
  556. * Constantes du modèle de Spalart-Allmaras
  557. * ----------------------------------------
  558. SIGMA = RVSA . 'KCONST' . 'SIGMA' ;
  559. CB1 = RVSA . 'KCONST' . 'CB1' ;
  560. CB2 = RVSA . 'KCONST' . 'CB2' ;
  561. KAPPA = RVSA . 'KCONST' . 'KAPPA' ;
  562. CW1 = RVSA . 'KCONST' . 'CW1' ;
  563. CW2 = RVSA . 'KCONST' . 'CW2' ;
  564. CW3 = RVSA . 'KCONST' . 'CW3' ;
  565. CV1 = RVSA . 'KCONST' . 'CV1' ;
  566.  
  567.  
  568. * Mesure scalaire du tenseur gradient des vitesses
  569. * ------------------------------------------------
  570. KTGRAD = RVSA . 'KTGRAD' ;
  571.  
  572.  
  573. * Instant auquel est renvoyé le résultat dans MUFN
  574. * ------------------------------------------------
  575. KMUFN = RVSA . 'KMUFN' ;
  576.  
  577. * Incompatibilité, car les conditions périodiques ne sont vérifiées
  578. * qu'après l'équation de transport, soit KMUFN='AVANT' ou KMUFN='APRES'
  579. SI (B_CYCL ET (EGA KMUFN 'DEMI')) ;
  580. MESS '******************************************************' ;
  581. MESS '/!\ ERREUR dans SPAL :' ;
  582. MESS ' options KMUFN="DEMI" et "PERIODIC" incompatibles' ;
  583. MESS '******************************************************' ;
  584. QUIT SPAL ;
  585. FINS ;
  586.  
  587.  
  588. * Algorithme de traitement des termes sources
  589. * -------------------------------------------
  590. KSRC = RVSA . 'KSRC' ;
  591.  
  592. * Incompatibilité, car l'algorithme 1 est nécessairement instationnaire
  593. SI ((EGA KSRC 'ALGO1') ET (NON (RX . 'RINSTAT'))) ;
  594. MESS '******************************************************' ;
  595. MESS '/!\ ERREUR dans SPAL :' ;
  596. MESS ' KSRC="ALGO1" requiert la présence de DFDT' ;
  597. MESS '******************************************************' ;
  598. QUIT SPAL ;
  599. FINS ;
  600.  
  601. * Incompatibilité, car il n'y a pas de demi pas de temps avec 'ALGO2'
  602. SI ((EGA KSRC 'ALGO2') ET (EGA KMUFN 'DEMI')) ;
  603. MESS '******************************************************' ;
  604. MESS '/!\ ERREUR dans SPAL :' ;
  605. MESS ' options KSRC="ALGO2" et KMUFN="DEMI" incompatibles' ;
  606. MESS '******************************************************' ;
  607. QUIT SPAL ;
  608. FINS ;
  609.  
  610.  
  611. * Configuration de l'algorithme de Newton
  612. * ---------------------------------------
  613. EPS1 = RVSA . 'NEWTON' . 'CRIT' ;
  614. IMAX = RVSA . 'NEWTON' . 'IMAX' ;
  615. OMEGA = RVSA . 'NEWTON' . 'OMEGA' ;
  616.  
  617.  
  618. * Options de la méthode d'inversion
  619. * ---------------------------------
  620. METINV = RVSA . 'METHINV' ;
  621.  
  622.  
  623. * Etat des différents verrous numériques
  624. * --------------------------------------
  625. B_POSI = RVSA . 'VERROU' . 'POSITIF' ;
  626. *B_DURB = RVSA . 'VERROU' . 'DURBIN' ;
  627.  
  628.  
  629. * Sauvegarder les variables internes?
  630. * -----------------------------------
  631. KDUMP = RVSA . 'DUMP' ;
  632.  
  633.  
  634.  
  635.  
  636. * +===================================================================+
  637. * | RÉCUPÉRATION DES VARIABLES AU PAS DE TEMPS COURANT |
  638. * +===================================================================+
  639.  
  640. * Viscosité modifiée au début du pas de temps
  641. NU0 = RV . 'INCO' . _NU0 ;
  642.  
  643.  
  644.  
  645. * Mesure scalaire du tenseur gradient des vitesses
  646. S = (PRODT $MD KTGRAD UN) ** 0.5 ;
  647.  
  648.  
  649.  
  650. * Distance à la paroi (peut changer à chaque pas de temps)
  651. DPAROI = NOMC (RV . 'PAROIS' . 'DIST') 'SCAL' ;
  652. KPAR = DPAROI MASQ 'INFE' (5.*(VALE 'PREC')) ;
  653.  
  654. * /!\ La distance à la paroi intervient uniquement au dénominateur, et
  655. * doit donc être strictement positive :
  656. DPAROI = DPAROI + (KPAR * 1.E-10) ;
  657.  
  658. * /!\ USLM2, inverse du carré de DPAROI, est donc singulier à la paroi.
  659. * Or ce terme apparait toujours multiplié par NU0, qui vaut 0 à la
  660. * paroi (condition limite recommandée!).
  661. * => C'est ainsi le produit (USLM2*NU0) vaut bien 0 à la paroi.
  662. *
  663. * Mais dans la pratique:
  664. * - un limiteur peut empêcher les valeurs strict. nulles dans NU0
  665. * - la condition limite à la paroi peut être définie non nulle
  666. * Pour éviter que le produit (USLM2*NU0) ne fasse apparaître de
  667. * très grandes valeurs, on force donc USLM2=0 sur les parois.
  668. USLM2 = (1. - KPAR) * (INVE ((KAPPA*DPAROI)**2)) ;
  669.  
  670.  
  671.  
  672.  
  673.  
  674. * +===================================================================+
  675. * | RÉCUPÉRATION DES CONDITIONS AUX LIMITES |
  676. * +===================================================================+
  677.  
  678. * /!\ Les conditions aux limites portent sur la viscosité modifiée !
  679. * ******************
  680. SI (EXIS (RV . 'CLIM') _NU0) ;
  681. CLVAL = EXCO (RV . 'CLIM') _NU0 ;
  682. RV . 'SPALART_ALLMARAS' . 'CLIM' = COPI CLVAL ;
  683. RV . 'CLIM' = ENLE (RV . 'CLIM') _NU0 ;
  684. SINON ;
  685. SI (EXIS (RV . 'SPALART_ALLMARAS') 'CLIM') ;
  686. CLVAL = RV . 'SPALART_ALLMARAS' . 'CLIM' ;
  687. SINON ;
  688. SI (NON B_CYCL) ;
  689. MESS '******************************************************' ;
  690. MESS '/!\ ERREUR dans SPAL :' ;
  691. MESS ' Il faut définir les conditions limites pour ' _NU0 ;
  692. MESS '******************************************************' ;
  693. QUIT SPAL ;
  694. FINS ;
  695. FINS ;
  696. FINS ;
  697. CLSPG = EXTR CLVAL 'MAILLAGE' ;
  698.  
  699. * Méthode de pénalisation pour imposer les conditions limites
  700. SI (EGA KSRC 'ALGO1') ;
  701. PENAVAL = 1.E30 ;
  702. PENAMAT = DG + (REDU (PENAVAL - DG) CLSPG) ;
  703. PENAST = (CLVAL * PENAVAL) ;
  704. FINS ;
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715. * +====================================================================+
  716. * | |
  717. * | T R A I T E M E N T D E S T E R M E S S O U R C E S |
  718. * | |
  719. * +====================================================================+
  720. *
  721. * Si 'KSRC'='ALGO1', on procède à l'ensemble des itérations internes
  722. * Si 'KSRC'='ALGO2', on quitte le bloc avant la fin du premier passage
  723. *
  724.  
  725. * Initialisation de la variable interne NUD1
  726. * ==========================================
  727.  
  728. NUD1 = NU0 ;
  729. * -------------------- /!\ VERROU NUMÉRIQUE /!\ --------------------
  730. SI (B_POSI) ;
  731. NUD1 = KOPS NUD1 '|<' NU0_MIN ;
  732. FINS ;
  733.  
  734. SI (EGA KMUFN 'AVANT') ;
  735. NU1 = NUD1 ;
  736. FINS ;
  737.  
  738.  
  739.  
  740. * Itérations internes pour résoudre F1(NUD1)=0
  741. * ============================================
  742.  
  743. * Dénominateur de la norme infinie utilisée pour le critère de sortie
  744. DENERR = (MAXI NU0 'ABS') + 1.E-30 ;
  745.  
  746. REPE BLOC0 IMAX ;
  747.  
  748. * Calcul du terme source complet pour l'itération interne courante
  749. * ----------------------------------------------------------------
  750.  
  751. KSI = NUD1 * USNU ;
  752. FV1 = (KSI**3) * ( INVE ((KSI**3) + (CV1**3)) ) ;
  753. DENFV2 = INVE (1. + (FV1*KSI)) ;
  754. FV2 = 1. - (KSI*DENFV2) ;
  755. FV3 = 1. ;
  756. S0 = (S*FV3) + (FV2*NUD1*USLM2) ;
  757. * ------------------- /!\ VERROU NUMÉRIQUE /!\ -------------------
  758. SI (B_POSI) ;
  759. S0 = KOPS S0 '|<' S0_MIN ;
  760. FINS ;
  761. USS0 = INVE S0 ;
  762.  
  763. R = NUD1 * USS0 * USLM2 ;
  764. * ------------------- /!\ VERROU NUMÉRIQUE /!\ -------------------
  765. R = KOPS R '>|' 10. ;
  766. G = R + (CW2 * ((R**6) - R)) ;
  767. DENFW6 = INVE ((G**6) + (CW3**6)) ;
  768. GLIM = ((1.+(CW3**6))*DENFW6) ** (1./6.) ;
  769. FW = G * GLIM ;
  770.  
  771. * (B contient la somme des 3 termes non linéaires du second membre)
  772. GDNUD1 = KOPS NU0 'GRADS' $MD ;
  773. * GDNUD1 = KOPS NUD1 'GRADS' $MD ;
  774. LCO1 = EXTR GDNUD1 'COMP' ;
  775. B1 = (CB2 / SIGMA) * (PSCA GDNUD1 GDNUD1 LCO1 LCO1) ;
  776. B2 = CB1 * S0 * NUD1 ;
  777. B3 = CW1 * FW * (NUD1*NUD1) * USLM2*(KAPPA*KAPPA) ;
  778. B = B1 + B2 - B3 ;
  779.  
  780.  
  781.  
  782. * ALGO2
  783. ***********************************************************************
  784. ***********************************************************************
  785. * On n'a pas besoin d'aller plus loin pour 'ALGO2': on sépare juste
  786. * les parties positive et négative de B avant de sortir
  787. SI (EGA KSRC 'ALGO2') ;
  788.  
  789. * REMARQUE: Pour le modèle de base, si B_POSI=VRAI et si CW2<1, alors
  790. * PROD est du signe de CB1(>0) et DEST de celui de CW1(>0)
  791. * => plus besoin de séparer S+ et S-, c'est déjà fait!
  792. *
  793. SI ((EGA KVERS 'ORIG') ET B_POSI ET (CW2 < 1)) ;
  794. BPLUS = B1 + B2 ;
  795. BMOINS = B3 ;
  796. SINON ;
  797. BPLUS = KOPS (B1 + B2) '|<' 0. ;
  798. BMOINS = KOPS B3 '|<' 0. ;
  799. FINS ;
  800.  
  801. * /!\ SEMBLE TRÈS INSTABLE => NON RECOMMANDÉ
  802. * MASK1 = B MASQ 'SUPERIEUR' 0. ;
  803. * BPLUS = B * MASK1 ;
  804. * BMOINS = B * (1. - MASK1) ;
  805.  
  806. QUIT BLOC0 ;
  807.  
  808. FINS ;
  809. ***********************************************************************
  810. ***********************************************************************
  811.  
  812.  
  813.  
  814. * Calcul des dérivées exactes des variables précédentes
  815. * -----------------------------------------------------
  816.  
  817. FV2PRIME = ((3.*KSI*FV1*(1.-FV1)) - 1.) * (DENFV2*DENFV2) ;
  818. S0PRIME = (FV2 + (KSI*FV2PRIME)) * USLM2 ;
  819. RPRIME = (S0 - (NUD1*S0PRIME)) * (USS0*USS0) * USLM2 ;
  820. GPRIME = RPRIME * (1. + (CW2 * ((6.*(R**5)) - 1.))) ;
  821. FWPRIME = GPRIME * GLIM * (CW3**6) * DENFW6 ;
  822.  
  823. B2PRIME = CB1 * (S0 + (NUD1*S0PRIME)) ;
  824. B3PRIME = CW1 * NUD1 * USLM2*(KAPPA*KAPPA)
  825. * ((2.*FW) + (NUD1*FWPRIME)) ;
  826. BPRIME = B2PRIME - B3PRIME ;
  827.  
  828.  
  829.  
  830.  
  831. * Calcul de la nouvelle valeur de NUD1
  832. * ------------------------------------
  833. * (F1 est la fonction de NUD1 à annuler: elle prend en compte la
  834. * discrétisation temporelle et les conditions limites)
  835.  
  836. F1 = (PENAMAT*NUD1) - PENAST - (DG * (NU0 + (DT*B))) ;
  837. F1PRIME = PENAMAT - (DG * DT * BPRIME) ;
  838. * ------------------- /!\ VERROU NUMÉRIQUE /!\ -------------------
  839. F1PRIME = F1PRIME + ((F1PRIME MASQ 'EGAL' 0.) * 1.E-30) ;
  840.  
  841. NUD2 = NUD1 - (F1 * (INVE F1PRIME)) ;
  842. * -------------------- /!\ VERROU NUMÉRIQUE /!\ ------------------
  843. SI (B_POSI) ;
  844. NUD2 = KOPS NUD2 '|<' NU0_MIN ;
  845. FINS ;
  846.  
  847.  
  848.  
  849.  
  850. * Critère d'arrêt: fin des itérations internes
  851. * --------------------------------------------
  852. XERR = (MAXI (NUD2-NUD1) 'ABS') / DENERR ;
  853.  
  854. * Mise à jour de la variable interne (avec relaxation éventuelle)
  855. NUD1 = (OMEGA * NUD2) + ((1.-OMEGA) * NUD1) ;
  856.  
  857.  
  858. SI ((XERR < EPS1) OU (EGA &BLOC0 IMAX)) ;
  859. SI KIMPR ;
  860. MESS (CHAI 'SPAL [sources]: iter ' &BLOC0 ' / ' IMAX
  861. ' :: norm inf = ' XERR) ;
  862. FINS ;
  863. QUIT BLOC0 ;
  864. FINS ;
  865.  
  866.  
  867. FIN BLOC0 ;
  868.  
  869.  
  870. * Mise à jour de la table 'INCO' pour l'étape suivante
  871. * ====================================================
  872.  
  873. RV . 'INCO' . 'SADIFF' = ((NU + NUD1) * (1./SIGMA)) ;
  874. RV . 'INCO' . _NU0 = NUD1 ;
  875. SI (EGA KMUFN 'DEMI') ;
  876. NU1 = NUD1 ;
  877. FINS ;
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884. * +====================================================================+
  885. * | |
  886. * | É Q U A T I O N D E T R A N S P O R T |
  887. * | |
  888. * +====================================================================+
  889. *
  890.  
  891. * Calcul des matrices de l'équation de transport
  892. * ==============================================
  893. * /!\ Tout changement dans les options de discrétisation 'KOPT' ne sera
  894. * effectif qu'après destruction de l'indice RX.'INITOK'
  895.  
  896. ST1 MAT1 = TSCA (RX . 'RX1') ;
  897. SI (RX . 'RINSTAT') ;
  898. ST2 MAT2 = DFDT (RX . 'RX2') ;
  899. MAT1 = MAT1 ET MAT2 ;
  900. ST1 = ST1 ET ST2 ;
  901. FINS ;
  902.  
  903. * ALGO2
  904. ***********************************************************************
  905. ***********************************************************************
  906. SI (EGA KSRC 'ALGO2') ;
  907. ST2 = NOMC (BPLUS*DG) _NU0 'NATURE' 'DISCRET' ;
  908. BDIA = BMOINS * DG * (INVE NUD1) ;
  909. MAT2 = KOPS 'MATDIAGO' (NOMC _NU0 BDIA) 'MATRIK' ;
  910.  
  911. MAT1 = MAT1 ET MAT2 ;
  912. ST1 = ST1 ET ST2 ;
  913. FINS ;
  914. ***********************************************************************
  915. ***********************************************************************
  916.  
  917.  
  918.  
  919. * Récupération des matrices de périodicité
  920. * ========================================
  921. SI (B_CYCL) ;
  922. MAT1 = MAT1 ET (RX . 'MATC') ;
  923. ST1 = ST1 ET (RX . 'STC') ;
  924. FINS ;
  925.  
  926.  
  927.  
  928. * Initialisation de l'algorithme d'inversion
  929. * ==========================================
  930. METINV . 'MATASS' = MAT1 ;
  931. METINV . 'MAPREC' = MAT1 ;
  932. METINV . 'XINIT' = NOMC NUD1 _NU0 ;
  933. METINV . 'IMPINV' = 0 ;
  934.  
  935.  
  936.  
  937. * Résolution de l'équation de transport
  938. * =====================================
  939. NUD3 = KRES MAT1 'SMBR' ST1
  940. 'CLIM' (NOMC CLVAL _NU0)
  941. 'TYPI' METINV
  942. 'IMPR' 0 ;
  943.  
  944. SI (EXIS METINV 'CONVINV') ;
  945. LCONV1 = METINV . 'CONVINV' ;
  946. NCONV1 = DIME LCONV1 ;
  947. SI KIMPR ;
  948. MESS (CHAI 'SPAL [transport]: iter ' (NCONV1 / 2) ' / '
  949. ((METINV.'NITMAX') / 2)
  950. ' :: norm inf = ' (EXTR LCONV1 NCONV1)) ;
  951. FINS ;
  952. FINS ;
  953.  
  954. NUD3 = EXCO NUD3 _NU0 ;
  955. * -------------------- /!\ VERROU NUMÉRIQUE /!\ ------------------
  956. SI (B_POSI) ;
  957. NUD3 = KOPS NUD3 '|<' NU0_MIN ;
  958. FINS ;
  959.  
  960.  
  961.  
  962. * Mise à jour de la table 'INCO'
  963. * ==============================
  964. RV . 'INCO' . _NU0 = NUD3 ;
  965. SI (EGA KMUFN 'APRES') ;
  966. NU1 = NUD3 ;
  967. FINS ;
  968.  
  969. * Sauvegarde des variables internes
  970. SI (KDUMP) ;
  971. RV . 'INCO' . 'SPAL' . 'KSI' = KSI ;
  972. RV . 'INCO' . 'SPAL' . 'FV1' = FV1 ;
  973. RV . 'INCO' . 'SPAL' . 'FV2' = FV2 ;
  974. RV . 'INCO' . 'SPAL' . 'FV3' = FV3 ;
  975. RV . 'INCO' . 'SPAL' . 'S' = S ;
  976. RV . 'INCO' . 'SPAL' . 'S0' = S0 ;
  977. RV . 'INCO' . 'SPAL' . 'R' = R ;
  978. RV . 'INCO' . 'SPAL' . 'G' = G ;
  979. RV . 'INCO' . 'SPAL' . 'FW' = FW ;
  980. RV . 'INCO' . 'SPAL' . 'B1' = B1 ;
  981. RV . 'INCO' . 'SPAL' . 'B2' = B2 ;
  982. RV . 'INCO' . 'SPAL' . 'B3' = B3 ;
  983. SI (EGA KSRC 'ALGO1') ;
  984. RV . 'INCO' . 'SPAL' . 'FV2PRIME' = FV2PRIME ;
  985. RV . 'INCO' . 'SPAL' . 'S0PRIME' = S0PRIME ;
  986. RV . 'INCO' . 'SPAL' . 'RPRIME' = RPRIME ;
  987. RV . 'INCO' . 'SPAL' . 'GPRIME' = GPRIME ;
  988. RV . 'INCO' . 'SPAL' . 'FWPRIME' = FWPRIME ;
  989. RV . 'INCO' . 'SPAL' . 'B2PRIME' = B2PRIME ;
  990. RV . 'INCO' . 'SPAL' . 'B3PRIME' = B3PRIME ;
  991. RV . 'INCO' . 'SPAL' . 'F1' = F1 ;
  992. RV . 'INCO' . 'SPAL' . 'F1PRIME' = F1PRIME ;
  993. FINS ;
  994. FINS ;
  995.  
  996. * Calcul de la viscosité turbulente effective à l'instant défini par
  997. * le paramètre KMUFN puis mise à jour de l'indice défini par le
  998. * paramètre NOMMUF.
  999. KSI = NU1 * USNU ;
  1000. FV1 = (KSI**3) * ( INVE ((KSI**3) + (CV1**3)) ) ;
  1001. MUF = RHO * (NU + (FV1*NU1)) ;
  1002. MUF = KCHT $MD 'SCAL' 'SOMMET' MUF ;
  1003. RV . 'INCO' . _MUF = MUF ;
  1004.  
  1005.  
  1006.  
  1007.  
  1008. * Fin de la procédure
  1009. ST0 MAT0 = KOPS 'MATRIK' ;
  1010. FINP ST0 MAT0 ;
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  

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