[LINUX] Comment créer un maillage de flux autour d'un cylindre avec SnappyHexMesh

introduction

Cet article explique comment créer un maillage pour OpenFOAM à l'aide de l'utilitaire snappyHexMesh. snappyHexMesh est un utilitaire pour créer un maillage hexagonal à partir d'un fichier STL. Il est possible de créer un fichier STL de votre forme préférée avec la CAO, etc. et de créer un maillage de cette forme. Pour des raisons d'explication, définissons le nom du répertoire de travail sur * cylindre * et créons un maillage qui circule autour du cylindre.

Je l'explique également dans la vidéo. https://www.youtube.com/watch?v=bas-5wbHOoY

C'est une image complète. screenshot.105.jpg Les dimensions du bloc sont Lx = 0,28 m, Ly = 0,12 m, Lz = 0,1 m, et l'origine est l'intersection de l'axe central du cylindre et du plan xy.

Détails de la surface cylindrique. Coupez également la couche limite. screenshot.106.jpg

Aperçu de snappyHexMesh

L'utilitaire snappyHexMesh se compose de trois étapes: castllatedMesh, snap et addLayers, et le traitement du contenu revient à supprimer l'extérieur de la zone, à améliorer la précision de la surface frontière et à générer un maillage pour la couche limite. Image comme ci-dessous.

screenshot.113.jpg

Pour l'exécuter, vous devez préparer deux fichiers de géométrie, tels qu'un maillage d'arrière-plan hexaédrique et un format stl cohérent avec cela. Un exemple de situation conflictuelle est que le fichier de géométrie est plus volumineux que le maillage d'arrière-plan. Le maillage d'arrière-plan peut être créé avec blockMesh et le fichier de géométrie peut être créé avec CAD. Cet article est créé avec FreeCAD.

Cet article n'explique pas tout de snappyHexMesh, donc si vous souhaitez connaître les spécifications détaillées, veuillez vous référer à ce qui suit. https://cfd.direct/openfoam/user-guide/v7-snappyhexmesh/#x27-1970005.4

procédure

  1. Créez un maillage d'arrière-plan avec blockMesh
  2. Créez un fichier CAO en colonnes
  3. Créez un maillage avec snappyHexMesh

** Structure du répertoire au début des travaux **

Préparez les répertoires et les fichiers comme suit. Avec OpenFOAM v7 /opt/openfoam7/tutorials/mesh/snappyHexMesh Si vous en sélectionnez un dans les exemples de répertoires et que vous le copiez et collez, vous n'avez pas à modifier controlDict, fvSchemes, fvSolution, meshQualityDict, c'est donc facile.

cylinder/
├── constant/
│   └── triSurface/
└── system/
     ├── blockMeshDict
     ├── controlDict
     ├── fvSchemes
     ├── fvSolution
     ├── meshQualityDict
     └── snappyHexMeshDict

1. Créez un maillage d'arrière-plan avec blockMesh

Modifiez * cylindre / système / blocMeshDict * comme suit.

/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  7
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

convertToMeters 1;

vertices
(
    (-0.08 -0.06 0)
    ( 0.2 -0.06 0)
    ( 0.2  0.06 0)
    (-0.08  0.06 0)
    (-0.08 -0.06 0.1)
    ( 0.2 -0.06 0.1)
    ( 0.2  0.06 0.1)
    (-0.08  0.06 0.1)
);

blocks
(
    hex (0 1 2 3 4 5 6 7) (100 80 10) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
    z_min 
    {
        type            patch;
        faces           ((0 3 2 1));
    }
    z_max
    {
        type            patch;
        faces           ((4 5 6 7));
    }
    y_min
    {
        type            patch;
        faces           ((0 1 5 4));
    }
    y_max
    {
        type            patch;
        faces           ((2 3 7 6));
    }
    x_min
    {
        type            patch;
        faces           ((0 4 7 3));
    }
    x_max
    {
        type            patch;
        faces           ((1 2 6 5));
    }
);

mergePatchPairs
(
);

// ************************************************************************* //

Il n'y a aucune restriction particulière sur le nom du patch ou le nombre de divisions de maillage. Après avoir édité * blockMeshDict *, exécutez blockMesh.

cylinder$ blockMesh

Vous venez de créer un maillage d'arrière-plan. Le corps principal est situé dans * cylindre / constante / polymesh *.

2. Créez un fichier CAO en colonnes

Ensuite, créez un cylindre avec FreeCAD. Je le crée sous Windows.

Le diamètre est de 0,04 m. La hauteur ne doit pas dépasser Lz, elle doit donc être de 0,1 m. Cependant, si vous exportez depuis FreeCAD au format stl, la taille augmentera 1000 fois selon les spécifications, vous devez donc la créer sur FreeCAD avec un diamètre de 0,04 mm et une hauteur de 0,1 mm. snappyHexMesh a une spécification que le système de coordonnées du maillage d'arrière-plan et le système de coordonnées du fichier CAO correspondent. Si vous souhaitez contrôler la position du cylindre, vous devez faire attention au système de coordonnées.

Exemple de création 6_完成.jpg

Sortez-le avec le nom cylindre.stl et placez-le dans * cylindre / constante / triSurface *.

3. Créez un maillage avec snappyHexMesh

Réglez * cylindre / système / snapyHexMeshDict * comme suit.

/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  7
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      snappyHexMeshDict;
}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

castellatedMesh true;
snap            true;
addLayers       true;

geometry
{
    cylinder
    {
        type triSurfaceMesh;
        file "cylinder.stl";
    }
};

castellatedMeshControls
{
    maxLocalCells 100000;
    maxGlobalCells 2000000;
    minRefinementCells 2;
    nCellsBetweenLevels 4;
    resolveFeatureAngle 30;
    locationInMesh (0.18 0.05 0.09); // Inside point
    allowFreeStandingZoneFaces true;
	
    features
    (
    );

    refinementSurfaces
    {
        cylinder
        {
            level (2 2);
        }
    }

    refinementRegions
    {
    }

}

snapControls
{
    nSmoothPatch 3;
    tolerance 1.0;
    nSolveIter 300;
    nRelaxIter 5;
    nFeatureSnapIter 10;
    implicitFeatureSnap false;
    explicitFeatureSnap true;
    multiRegionFeatureSnap true;
}

addLayersControls
{
    relativeSizes true;
    
	layers
    {
        "cylinder*"
        {
            nSurfaceLayers 5;
        }
    }

    expansionRatio 1.2;
    finalLayerThickness 0.3;
    minThickness 0.25;
    nGrow 0;
    featureAngle 30;
    nRelaxIter 5;
    nSmoothSurfaceNormals 1;
    nSmoothNormals 3;
    nSmoothThickness 10;
    maxFaceThicknessRatio 0.5;
    maxThicknessToMedialRatio 0.3;
    minMedianAxisAngle 90;
    nBufferCellsNoExtrude 0;
    nLayerIter 50;
    nRelaxedIter 20;
}

meshQualityControls
{
    #include "meshQualityDict"

    relaxed
    {
        maxNonOrtho 75;
    }
}



writeFlags
(
    scalarLevels    // write volScalarField with cellLevel for postprocessing
    layerSets       // write cellSets, faceSets of faces in layer
    layerFields     // write volScalarField for layer coverage
);

mergeTolerance 1E-6;

// ************************************************************************* //

Expliquer tous les paramètres serait compliqué, je vais donc expliquer brièvement les paramètres que j'ai sentis importants dans mon expérience (ou plutôt, il y a pas mal de paramètres que je n'ai jamais touchés).

CastellatedMesh, snap et addLayers immédiatement après FoamFile sont des paramètres qui déterminent s'il faut exécuter chaque processus. Si vous ne coupez pas le maillage de la couche limite, définissez addLayers sur false. Cette fois, le maillage de la couche limite est également coupé, donc tous sont définis sur true.

Dans le dictionnaire de géométrie, spécifiez le fichier CAO à lire. cylindre est le nom de la limite (patch) du fichier stl, et vous pouvez le nommer comme vous le souhaitez. Dans ce cas, le patch est la surface du cylindre. Le nom donné ici sera utilisé en bas. Le type est triSurfaceMesh et le fichier est Cylindre.stl placé dans triSurface.

castellatedMeshControls est un dictionnaire de paramètres pour le traitement de suppression en dehors de la zone de calcul. Plus le nombre de nCellsBetweenLevels est élevé, plus la résolution autour de la surface est élevée. Je l'ai réglé sur 3 ~ 4. locationInMesh définit les coordonnées d'une partie de la zone où vous souhaitez créer un maillage. En d'autres termes, quelque part à l'intérieur du maillage d'arrière-plan et à l'extérieur du cylindre. Si vous spécifiez l'intérieur du cylindre, le maillage à l'intérieur du cylindre sera créé et l'extérieur sera supprimé. refinementSurfaces est un paramètre à définir pour chaque patch. Spécifiez les résolutions minimale et maximale (min max) pour chaque patch. J'ai mis les deux à environ 2.

snapControls est un dictionnaire de paramètres pour le traitement des snap, mais je n'y ai jamais touché.

addLayersControl est un dictionnaire de paramètres pour le traitement des addLayers. Si relativeSizes est vrai, la largeur du treillis à l'intérieur de la couche limite sera calculée en fonction du treillis à l'extérieur de la couche limite. Dans le dictionnaire des couches, spécifiez le nombre de couches pour chaque patch. Le nom du patch est joker comme "cylindre *" car il ne sera pas traité correctement à moins qu'il ne soit "[nom du patch spécifié dans le dictionnaire de géométrie] *". C'était une partie difficile pour un débutant OpenFOAM comme moi. expansionRatio est le rapport de largeur de réseau entre les couches.

Après l'édition, exécutez snappyHexMesh.

cylinder$ snappyHexMesh

Une fois terminé, trois nouveaux répertoires avec des noms numériques seront créés. Le répertoire polyMesh, qui est le corps principal du maillage créé, est contenu dans le répertoire avec le plus grand nombre. Veuillez copier et coller ce répertoire dans le répertoire * constant * du travail pour l'analyse des fluides.

la fin.

Recommended Posts

Comment créer un maillage de flux autour d'un cylindre avec SnappyHexMesh
Procédure de création d'application multi-plateforme avec kivy
Comment créer un sous-menu avec le plug-in [Blender]
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Comment créer un package Conda
Comment créer un pont virtuel
Comment créer un Dockerfile (basique)
Comment créer un fichier de configuration
Comment créer une étiquette (masque) pour la segmentation avec labelme (masque de segmentation sémantique)
Comment écrire une docstring pour créer un document tuple nommé avec sphinx
Comment créer une API de machine learning sans serveur avec AWS Lambda
Comment créer un dossier git clone
Comment ajouter un package avec PyCharm
Comment créer un référentiel à partir d'un média
3. Traitement du langage naturel avec Python 1-2. Comment créer un corpus: Aozora Bunko
Comment créer des exemples de données CSV avec hypothèse
Comment lire un fichier CSV avec Python 2/3
Comment envoyer un message à LINE avec curl
Comment dessiner un graphique à 2 axes avec pyplot
Comment créer un objet fonction à partir d'une chaîne
Comment développer une application de panier avec Django
Comment créer un fichier JSON en Python
Comment créer un dictionnaire avec une structure hiérarchique.
Étapes pour créer un bot Twitter avec Python
[Note] Comment créer un environnement de développement Ruby
Comment créer une boîte de saisie Kivy 1 ligne
Comment créer une API Rest dans Django
Créer un cylindre avec une sortie de fichier open3d + STL
[Note] Comment créer un environnement de développement Mac
Comment créer des nombres aléatoires avec le module aléatoire de NumPy
[Python] Comment créer un environnement de serveur Web local avec SimpleHTTPServer et CGIHTTPServer
Lire la source Python-Markdown: Comment créer un analyseur
Comment convertir / restaurer une chaîne avec [] en python
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Essayez de créer un Checkbutton dynamiquement avec Tkinter en Python
Comment obtenir un utilisateur connecté avec les forms.py de Django
Comment convertir un objet de classe en dictionnaire avec SQLAlchemy
[Go] Comment créer une erreur personnalisée pour Sentry
Comment créer un référentiel local pour le système d'exploitation Linux
Je souhaite créer manuellement une légende avec matplotlib
Comment créer un simple script serveur / client TCP
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
Comment créer rapidement un environnement d'apprentissage automatique à l'aide de Jupyter Notebook avec UbuntuServer 16.04 LTS
Comment créer un BOT Cisco Webex Teams à l'aide de Flask
Comment mettre un lien hypertexte vers "file: // hogehoge" avec sphinx-> pdf
Comment installer NPI + envoyer un message à la ligne avec python
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
Comment convertir un tableau en dictionnaire avec Python [Application]
Comment sortir un document au format pdf avec Sphinx
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
Comment appeler une fonction
Probablement le moyen le plus simple de créer un pdf avec Python 3
Créer une page d'accueil avec django
Comment imprimer des caractères sous forme de tableau avec la fonction d'impression de Python
Comment mettre à jour avec SQLAlchemy?