[LINUX] So erstellen Sie mit snappyHexMesh ein Flussnetz um einen Zylinder

Einführung

In diesem Artikel wird erläutert, wie Sie mit dem Dienstprogramm snappyHexMesh ein Netz für OpenFOAM erstellen. snappyHexMesh ist ein Dienstprogramm zum Erstellen eines hexagonalen Netzes aus einer STL-Datei. Es ist möglich, eine STL-Datei Ihrer Lieblingsform mit CAD usw. zu erstellen und ein Netz dieser Form zu erstellen. Zur Erklärung setzen wir den Arbeitsverzeichnisnamen auf * Zylinder * und erstellen ein Netz, das um den Zylinder fließt.

Ich erkläre es auch im Video. https://www.youtube.com/watch?v=bas-5wbHOoY

Es ist ein fertiges Bild. screenshot.105.jpg Die Blockabmessungen sind Lx = 0,28 m, Ly = 0,12 m, Lz = 0,1 m, und der Ursprung ist der Schnittpunkt der Mittelachse des Zylinders und der xy-Ebene.

Details der zylindrischen Oberfläche. Schneiden Sie auch die Grenzschicht. screenshot.106.jpg

Übersicht über snappyHexMesh

Das Dienstprogramm snappyHexMesh besteht aus drei Schritten: castllatedMesh, snap und addLayers. Der Verarbeitungsinhalt entspricht dem Entfernen außerhalb des Bereichs, dem Verbessern der Genauigkeit der Grenzfläche und dem Generieren eines Netzes für die Grenzschicht. Bild wie unten.

screenshot.113.jpg

Um es auszuführen, müssen Sie zwei Geometriedateien vorbereiten, z. B. ein hexaedrisches Hintergrundnetz und ein STL-Format, das damit übereinstimmt. Ein Beispiel für eine Konfliktsituation ist, dass die Geometriedatei größer als das Hintergrundnetz ist. Das Hintergrundnetz kann mit blockMesh erstellt werden, und die Geometriedatei kann mit CAD erstellt werden. Dieser Artikel wurde mit FreeCAD erstellt.

In diesem Artikel werden nicht alle snappyHexMesh erläutert. Wenn Sie also die detaillierten Spezifikationen kennen möchten, lesen Sie bitte die folgenden Informationen. https://cfd.direct/openfoam/user-guide/v7-snappyhexmesh/#x27-1970005.4

Verfahren

  1. Erstellen Sie mit blockMesh ein Hintergrundnetz
  2. Erstellen Sie eine spaltenweise CAD-Datei
  3. Erstellen Sie ein Netz mit snappyHexMesh

** Verzeichnisstruktur zu Beginn der Arbeit **

Bereiten Sie Verzeichnisse und Dateien wie folgt vor. Mit OpenFOAM v7 /opt/openfoam7/tutorials/mesh/snappyHexMesh Wenn Sie eines aus den Beispielverzeichnissen auswählen und kopieren, müssen Sie controlDict, fvSchemes, fvSolution, meshQualityDict nicht bearbeiten, damit es einfach ist.

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

1. Erstellen Sie mit blockMesh ein Hintergrundnetz

Bearbeiten Sie * Zylinder / System / BlockMeshDict * wie folgt.

/*--------------------------------*- 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
(
);

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

Es gibt keine besonderen Einschränkungen hinsichtlich des Patchnamens oder der Anzahl der Netzunterteilungen. Führen Sie nach dem Bearbeiten von * blockMeshDict * blockMesh aus.

cylinder$ blockMesh

Sie haben jetzt ein Hintergrundnetz erstellt. Der Hauptkörper befindet sich in * Zylinder / Konstante / Polymesh *.

2. Erstellen Sie eine spaltenweise CAD-Datei

Erstellen Sie als Nächstes einen Zylinder mit FreeCAD. Ich erstelle es unter Windows.

Der Durchmesser beträgt 0,04 m. Die Höhe sollte Lz nicht überschreiten, daher sollte sie 0,1 m betragen. Wenn Sie jedoch aus FreeCAD im STL-Format exportieren, erhöht sich die Größe gemäß den Spezifikationen um das 1000-fache. Sie müssen sie daher in FreeCAD mit einem Durchmesser von 0,04 mm und einer Höhe von 0,1 mm erstellen. snappyHexMesh hat eine Spezifikation, die dem Koordinatensystem des Hintergrundnetzes und dem Koordinatensystem der CAD-Datei entspricht. Wenn Sie die Position des Zylinders steuern möchten, müssen Sie auf das Koordinatensystem achten.

Erstellungsbeispiel 6_完成.jpg

Geben Sie es mit dem Namen Zylinder.stl aus und platzieren Sie es in * Zylinder / Konstante / TriSurface *.

3. Erstellen Sie ein Netz mit snappyHexMesh

Stellen Sie * Zylinder / System / snapyHexMeshDict * wie folgt ein.

/*--------------------------------*- 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;

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

Das Erklären aller Parameter wäre kompliziert, daher werde ich kurz die Parameter erläutern, die mir in meiner Erfahrung wichtig waren (oder besser gesagt, es gibt einige Parameter, die ich nie berührt habe).

CastellatedMesh, snap und addLayers unmittelbar nach FoamFile sind Parameter, die bestimmen, ob jeder Prozess ausgeführt werden soll. Wenn Sie das Grenzschichtnetz nicht ausschneiden, setzen Sie addLayers auf false. Dieses Mal wird auch das Grenzschichtnetz geschnitten, sodass alle auf true gesetzt sind.

Geben Sie im Geometriewörterbuch die zu lesende CAD-Datei an. Zylinder ist der Name der Grenze (Patch) der STL-Datei, und Sie können sie beliebig benennen. In diesem Fall ist das Pflaster die Oberfläche des Zylinders. Der hier angegebene Name wird unten verwendet. Der Typ ist triSurfaceMesh und die Datei istylinder.stl in triSurface.

castellatedMeshControls ist ein Einstellungswörterbuch für die Entfernungsverarbeitung außerhalb des Berechnungsbereichs. Je größer die Anzahl der nCellsBetweenLevels ist, desto höher ist die Auflösung um die Oberfläche. Ich habe es auf 3 ~ 4 gesetzt. locationInMesh legt die Koordinaten eines Teils des Bereichs fest, in dem Sie ein Netz erstellen möchten. Mit anderen Worten, irgendwo innerhalb des Hintergrundnetzes und außerhalb des Zylinders. Wenn Sie die Innenseite des Zylinders angeben, wird das Netz innerhalb des Zylinders erstellt und die Außenseite entfernt. refinementSurfaces ist ein Parameter, der für jeden Patch festgelegt wird. Geben Sie die minimale und maximale (min max) Auflösung für jeden Patch an. Ich habe beide auf ungefähr 2 gesetzt.

snapControls ist ein Einstellungswörterbuch für die Snap-Verarbeitung, das ich jedoch nie berührt habe.

addLayersControl ist ein Einstellungswörterbuch für die Verarbeitung von addLayers. Wenn relativeSizes wahr ist, wird die Gitterbreite innerhalb der Grenzschicht gemäß dem Gitter außerhalb der Grenzschicht berechnet. Geben Sie im Ebenenwörterbuch die Anzahl der Ebenen für jeden Patch an. Der Grund, warum der Patch-Name ein Platzhalter "Zylinder *" ist, ist, dass er nur dann ordnungsgemäß verarbeitet wird, wenn er "[im Geometriewörterbuch angegebener Patch-Name] *" ist. Für einen OpenFOAM-Anfänger wie mich war es ein schwieriger Teil. expansionRatio ist das Gitterbreitenverhältnis zwischen Schichten.

Führen Sie nach der Bearbeitung snappyHexMesh aus.

cylinder$ snappyHexMesh

Wenn Sie fertig sind, werden drei neue Verzeichnisse mit numerischen Namen erstellt. Das PolyMesh-Verzeichnis, das den Hauptteil des erstellten Netzes darstellt, ist in dem Verzeichnis mit der größten Nummer enthalten. Bitte kopieren Sie dieses Verzeichnis und fügen Sie es für die Flüssigkeitsanalyse in das Verzeichnis * constant * des Jobs ein.

das Ende.

Recommended Posts

So erstellen Sie mit snappyHexMesh ein Flussnetz um einen Zylinder
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
So erstellen Sie ein Conda-Paket
So erstellen Sie eine virtuelle Brücke
Wie erstelle ich eine Docker-Datei?
So erstellen Sie eine Konfigurationsdatei
So erstellen Sie eine Bezeichnung (Maske) für die Segmentierung mit labelme (semantische Segmentierungsmaske)
So schreiben Sie eine Dokumentzeichenfolge, um ein benanntes Tupeldokument mit Sphinx zu erstellen
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
So erstellen Sie einen Git-Klonordner
So fügen Sie ein Paket mit PyCharm hinzu
So erstellen Sie ein Repository aus Medien
3. Verarbeitung natürlicher Sprache mit Python 1-2. So erstellen Sie einen Korpus: Aozora Bunko
Erstellen von CSV-Beispieldaten mit Hypothese
Lesen einer CSV-Datei mit Python 2/3
So senden Sie eine Nachricht mit Curl an LINE
So zeichnen Sie ein 2-Achsen-Diagramm mit Pyplot
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
So entwickeln Sie eine Cart-App mit Django
So erstellen Sie eine JSON-Datei in Python
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
Schritte zum Erstellen eines Twitter-Bots mit Python
[Hinweis] So erstellen Sie eine Ruby-Entwicklungsumgebung
So erstellen Sie ein 1-zeiliges Kivy-Eingabefeld
So erstellen Sie eine Rest-API in Django
Machen Sie einen Zylinder mit open3d + STL-Dateiausgabe
[Hinweis] So erstellen Sie eine Mac-Entwicklungsumgebung
Wie man Zufallszahlen mit dem Zufallsmodul von NumPy macht
[Python] So erstellen Sie eine lokale Webserverumgebung mit SimpleHTTPServer und CGIHTTPServer
Lesen Sie die Python-Markdown-Quelle: So erstellen Sie einen Parser
So konvertieren / wiederherstellen Sie einen String mit [] in Python
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Versuchen Sie, mit Tkinter in Python dynamisch einen Checkbutton zu erstellen
So erhalten Sie einen angemeldeten Benutzer mit Djangos forms.py
So konvertieren Sie ein Klassenobjekt mit SQLAlchemy in ein Wörterbuch
[Go] So erstellen Sie einen benutzerdefinierten Fehler für Sentry
So erstellen Sie ein lokales Repository für Linux
Ich möchte manuell eine Legende mit matplotlib erstellen
So erstellen Sie ein einfaches TCP-Server / Client-Skript
[Python] Wie zeichnet man mit Matplotlib ein Streudiagramm?
So erstellen Sie schnell eine maschinelle Lernumgebung mit Jupyter Notebook mit UbuntuServer 16.04 LTS
So erstellen Sie mit Flask einen BOT für Cisco Webex-Teams
So setzen Sie einen Hyperlink zu "file: // hogehoge" mit sphinx-> pdf
So installieren Sie NPI + Senden Sie eine Nachricht an Python
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
So konvertieren Sie mit Python [Anwendung] von einem Array in ein Wörterbuch
So geben Sie ein Dokument im PDF-Format mit Sphinx aus
Erstellen Sie einen Mastodon-Bot mit einer Funktion, die automatisch mit Python antwortet
So rufen Sie eine Funktion auf
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Erstellen Sie eine Homepage mit Django
So drucken Sie Zeichen als Tabelle mit der Druckfunktion von Python
Wie aktualisiere ich mit SQLAlchemy?