Cet outil peut être utilisé pour déterminer les coefficients Cp,net d'une structure. {{ :prog:openfoam:openfoam-v2006.tgz |Source v2006}} ====Installation==== Installer [[prog:wsl|Gentoo sous Windows]] via WSL. La [[https://develop.openfoam.com/Development/openfoam/blob/develop/doc/Build.md|procédure d'installation]] est accessible en ligne. {{ :prog:openfoam:doc_build.md_develop_development_openfoam_gitlab_2020-07-30_10_44_44_.html |Archive du 28/07/2020 le 30/07/2020}} Le lieur doit être ''ld.bfd'' et non pas ''ld.gold''. La librairie nécessaire est ''cgal''. Il est possible d'avoir en plus ''metis'', ''scotch'' (sinon des messages d'erreur apparaîtront dans les log). Il est possible que des messages de type ''%%==>%% skip scotch (no header)'' apparaissent malgré son installation. C'est le même message ''scotch'' que ce soit la librarie qui soit manquante ou seulement la partie MPI. Décompresser les sources dans un dossier de la partition Linux. Ne pas décompresser dans un disque dur Windows (''/mnt/*''). Il y a des noms de fichiers qui ne diffèrent que de la casse. Désactiver MPI dans ''etc/bashrc'' : export WM_MPLIB= Faire un ''source etc/bashrc'' Et lancer la compilation : ./Allwmake -s -l -j ====Modélisation==== ===Programmes=== ''blockMesh'' : générateur de maillage. ''icoFoam'' : solveur pour des fluides laminaires, isothermes et incompressibles. ''pisoFoam'' : solveur pour des fluides turbulents, isothermes et incompressibles. ===Configuration du maillage=== Il faut remplir le fichier ''system/blockMeshDict'' // Entête FoamFile { version 2.0; format ascii; class dictionary; object blockMeshDict; } // Coefficient réducteur de la position des sommets. scale 0.1; // Les sommets de la forme où le fluide circulera. vertices ( (0 0 0) // Sommet 0 (1 0 0) (1 1 0) (0 1 0) (0 0 0.1) // Une épaisseur égale à scale indique une modélisation 2D. (1 0 0.1) (1 1 0.1) (0 1 0.1) // Sommet 7 ); // Définition du bloc à mailler blocks ( // Cube à mailler. // Nombre de discrétisation du maillage en x, y, z. // En mettant z à 1, on modélise en 2D. // uniform expansions en x, y et z // https://www.openfoam.com/documentation/user-guide/blockMesh.php hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1) ); // Si on souhaite des bords ne soient pas forcément droit. edges ( ); // On définit les 8 faces. Un type par condition initiale. boundary ( // L'entrée du fluide. movingWall { type wall; faces ( (3 7 6 2) ); } // Les 3 faces qui ferment le rectangle. fixedWalls { type wall; faces ( (0 4 7 3) (2 6 5 1) (1 5 4 0) ); } // Les deux faces qui font le devant et derrière // Mais comme on modélise en 2D, elles sont vides. frontAndBack { type empty; faces ( (0 3 2 1) (4 5 6 7) ); } ); // Pour connecter deux blocs. mergePatchPairs ( ); Après création de ce fichier, on exécute le programme ''blockMesh''. Cela va créer le dossier constant/polyMesh avec les fichiers ''boundary'', ''faces'', ''neighbour'', ''owner'' et ''points''. ===Définition d'un fluide incompressible, isotherme et laminaire=== Il faut se baser sur les exemples fournis dans les tutoriels et les adapter. Ici : ''incompressible/icoFoam/cavity/cavity''. * Conditions initiales On définit les conditions initiales dans le dossier ''0''. Dans ce dossier, on définit la pression via le fichier ''p'' et la vélocité via le fichier ''U''. Sous Linux, bien respecter la casse. FoamFile { version 2.0; format ascii; class volScalarField; object p; } // L'unité SI [kg m s K mol A cd]. Ici la pression cinétique m^2/s^2 dimensions [0 2 -2 0 0 0 0]; // Le champ de pression est uniforme. Le type étant incompressible, la valeur n'a pas d'importance. internalField uniform 0; // On définit le type de condition initiale boundaryField { // Le mur bougeant est celui d'où le vent circule. movingWall { type zeroGradient; } // Les murs fixes sont ceux qui ferment la boite. fixedWalls { type zeroGradient; } // Pas de condition pour les deux faces 3D puisqu'on veut travailler en 2D. frontAndBack { type empty; } } FoamFile { version 2.0; format ascii; class volVectorField; object U; } // Unité : m/s dimensions [0 1 -1 0 0 0 0]; // Champ uniforme. internalField uniform (0 0 0); // https://www.openfoam.com/documentation/user-guide/standard-boundaryconditions.php boundaryField { // On fait circuler du vent horizontalement au plafond. movingWall { type fixedValue; // 1 m/s value uniform (1 0 0); } // Les murs n'autorisent pas le glissement (vélocité à 0) fixedWalls { type noSlip; } // le devant et derrière n'existent pas. frontAndBack { type empty; } } La propriété physique est dans le fichier ''constant/transportProperties''. FoamFile { version 2.0; format ascii; class dictionary; location "constant"; object transportProperties; } // nu est la viscosité cinématique. // Le nombre de Reynolds vaut d*abs(U)/nu d est la longueur (0.1) et U la viscosité du fluide (1 ici). nu 0.01; Il y a le contrôle dans le dossier ''system/controlDict''. FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; } application icoFoam; startFrom startTime; startTime 0; stopAt endTime; endTime 0.5; // Co*d/n/U = (constante)1*0.1(scale)/20(discrétisation)/1 deltaT 0.005; writeControl timeStep; // On enregistre les résultats tous les deltaT*20 soit 0.1s. // Les résultats intermédiaires seront enregistrés dans un dossier "0.1", "0.2", ... writeInterval 20; purgeWrite 0; writeFormat ascii; writePrecision 6; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable true; // On laisse les valeurs par défaut. FoamFile { version 2.0; format ascii; class dictionary; location "system"; object fvSchemes; } ddtSchemes { default Euler; } gradSchemes { default Gauss linear; grad(p) Gauss linear; } divSchemes { default none; div(phi,U) Gauss linear; } laplacianSchemes { default Gauss linear orthogonal; } interpolationSchemes { default linear; } snGradSchemes { default orthogonal; } FoamFile { version 2.0; format ascii; class dictionary; location "system"; object fvSolution; } solvers { p { solver PCG; preconditioner DIC; tolerance 1e-06; relTol 0.05; } pFinal { $p; relTol 0; } U { solver smoothSolver; smoother symGaussSeidel; tolerance 1e-05; relTol 0; } } PISO { nCorrectors 2; nNonOrthogonalCorrectors 0; // Le fluide étant incompressible, les deux valeurs n'ont pas d'importance. pRefCell 0; pRefValue 0; }