Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  OpenFOAM
  Boundary-Condition-Typ für Inlet gesucht: bewegtes Netz plus Polynomprofil

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Xometry ermöglicht JTW Astronomy die Herstellung hochwertiger Trident Teleskophalterungen, ein Anwenderbericht
Autor Thema:  Boundary-Condition-Typ für Inlet gesucht: bewegtes Netz plus Polynomprofil (662 / mal gelesen)

Ex-Mitglied

erstellt am: 16. Jan. 2023 22:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat


1.png


2.png

 
Hallo zusammen,

ich habe einen gekrümmten Rechenraum, der sich um einen fixen Punkt außerhalb des Raumes im Kreis dreht (via dynamicMesh). Bei diesem transienten Problem möchte ich am Inlet ein Polynomprofil einstellen. Das heißt die Geschwindigkeit steigt nach außen/zum Kurvenäußeren hin an. Unter 0/U habe ich das inlet folgendermaßen definiert:

    inlet
    {
type fixedProfile;
        profile        polynomial
(
    ((-1.9 0 -1) (1 0 1))  // y1 = -1.9*x1^1, y3 = -1*x3^1
);
direction (1 0 0);
origin 0;
    }

Zum Zeitpunkt 0 passt soweit alles, siehe dazu Bild 1 (1.png).

Das Problem: Das Polynom bestimmt die Größe der Einströmung und den Winkel (bzw. die Richtung der Pfeile) zwischen Strömung und Inlet-Oberfläche. Also bleibt der Winkel/die Richtung zu jedem Zeitpunkt gleich. Siehe dazu Bild 2 (2.png).

Ich bin jetzt auf der Suche nach einem BC-Typ, der Polynomprofile erlaubt und wo die Strömung zu jedem Zeitpunkt senkrecht auf das inlet steht. Ich habe es mal mit dem BC-Typ surfaceNormalUniformFixedValue (OF7, heißt bei anderen Versionen teilweise leicht anders) versucht. Hier sollte mit uniformValue polynomial das Polynomprofil möglich sein. Allerdings geht das dreidimensionale Profil gar nicht und im Zweidimensionalen werden weder Geraden noch Parabeln erstellt, lediglich y-Achsenabschnitte ( bspw. (-0.1  0)) ändern das Profil. Durch den Typ (surfaceNormalUniformFixedValue) funktioniert allerdings die senkrechte Ausrichtung der Strömung (zum inlet) zu jedem Zeitpunkt.

Idealerweise würde ich das Ganze ohne groovyBC oder codedFixedValue machen (absolutes Neuland), aber bin für jede noch so kleine Hilfe dankbar. Vielen Dank im Voraus.

VG
Patrick


Shor-ty
Moderator





Sehen Sie sich das Profil von Shor-ty an!   Senden Sie eine Private Message an Shor-ty  Schreiben Sie einen Gästebucheintrag für Shor-ty

Beiträge: 2466
Registriert: 27.08.2010

erstellt am: 16. Jan. 2023 22:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

das gibt es so nicht. Ich denke da musst Du über codedFixedValue oder exprFixedValue arbeiten (letzteres bin ich mir nicht sicher ob es geht). Mit dem ersten gehts. Das gleiche (beide oben genannten) kannst du mit der uniformFixedValue BC erreichen, wobei bei value dann entweder coded oder expression steht.

Die Rotation des Profils musst Du herleiten und dann eben draufgeben. Da gibts wohl viele Möglichkeiten. Man könnte sicher auch mittels der coded BC auf die Rotations-Klassen zurückgreifen. Hab ich aber noch nie gemacht.

Grüße Tobi

------------------
Glück Auf,
Tobi

OpenFOAM® Community - Knowledge Base

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 17. Jan. 2023 19:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Tobi,

schon mal danke für die schnelle Antwort. Das hatte ich befürchtet, dass das Ganze auf die coded BC rausläuft. Ich habe mir jetzt mal dein Video mit der Pfeife angeschaut. Meinst du in meinem Fall sollte auch mit nf bei fvpatch gearbeitet werden, um das Profil immer senkrecht auf dem Inlet zu haben? Oder können verschiedene Geradengleichungen von verschiedenen Zeitpunkten erstellt werden und dazwischen wird interpoliert? Hast du vielleicht eine grobe Struktur im Kopf mit der es funktionieren könnte?

VG
Patrick

Shor-ty
Moderator





Sehen Sie sich das Profil von Shor-ty an!   Senden Sie eine Private Message an Shor-ty  Schreiben Sie einen Gästebucheintrag für Shor-ty

Beiträge: 2466
Registriert: 27.08.2010

erstellt am: 17. Jan. 2023 23:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Also ich würde mit nf() arbeiten, das ist sehr sauber. Wenn das ein Lineares Profil ist (vom Zentrum = 0) dann ist das ja relativ einfach - zumindest in meinem Kopf 

Aktuell bin ich so platt von der ganzen Arbeit mit FOAM das ich da grad keinen passenden Einfall habe, sorry. Außer, wenn das ein lineares Profil (ausgehend vom Zentrum ist), dann würde ich das als Funktion in C++ reinbauen x() abhängig bspw, und dann den ganzen Käse mit den Rotation Functions um den Ursprung drehen. Aber da gibts sicherlich deutlich einfachere Sachen. Wenn du das Profil von x/y ableiten kannst, dann könnte mans auch direkt so reinbauen.

------------------
Glück Auf,
Tobi

OpenFOAM® Community - Knowledge Base

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 23. Jan. 2023 21:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Ich habe jetzt folgenden Code. Ohne der letzten Zeile (fett gedruckt) läuft er zumindest schon durch.

        code
        #{
          const fvPatch& boundaryPatch = patch();
          const vectorField& Cf = boundaryPatch.Cf();
          const vectorField& n = boundaryPatch.nf();
          vectorField& field = *this;


          const scalar vmin = 25.597;
          const scalar vmax = 35;
          const scalar dmin = 24.5;
          const scalar h = 9;

              forAll(Cf, faceI)
              {
                const scalar x = Cf[faceI].x();
                const scalar z = Cf[faceI].z()-33.5;
                const scalar distance = pow(x*x+z*z,0.5);
                const scalar faceVel = vmin + (distance - dmin) * (vmax - vmin)/h;

                field[faceI] = faceVel*n;

              }
        #};

Mit der letzten Zeile (Zeile 57) entstehen allerdings einige Fehler:

        - processor0/0/U/boundaryField/inlet: In Elementfunktion »virtual void Foam::myInletFixedValueFvPatchVectorField::updateCoeffs()«:
        - processor0/0/U/boundaryField/inlet:57:17: Fehler: no match for »operator=« (operand types are »Foam::Vector<double>« and    »Foam::tmp<Foam::Field<Foam::Vector<double> > >«)
        - processor0/0/U/boundaryField/inlet:57:17: Anmerkung: Kandidaten sind:
        In file included from /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/vector.H:39:0,
                      from /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/point.H:35,
                      from /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/pointField.H:35,
                      from /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/edge.H:40,
                      from /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/edgeList.H:32,
                      from /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/PrimitivePatch.H:56,
                      from /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/primitivePatch.H:35,
                      from /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/polyPatch.H:43,
                      from /opt/OpenFOAM/OpenFOAM-8/src/finiteVolume/lnInclude/fvPatch.H:39,
                      from /opt/OpenFOAM/OpenFOAM-8/src/finiteVolume/lnInclude/fvPatchField.H:47,
                      from /opt/OpenFOAM/OpenFOAM-8/src/finiteVolume/lnInclude/fixedValueFvPatchField.H:54,
                      from /opt/OpenFOAM/OpenFOAM-8/src/finiteVolume/lnInclude/fixedValueFvPatchFields.H:29,
                      from fixedValueFvPatchFieldTemplate.H:37,
                      from fixedValueFvPatchFieldTemplate.C:25:
                      /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/Vector.H:58:7: Anmerkung: Foam::Vector<double>& Foam::Vector<double>: perator=(const  Foam::Vector<double>&)
                      class Vector
      ^
                      /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/Vector.H:58:7: Anmerkung:  keine bekannte Umwandlung für Argument 1 von »Foam::tmp<Foam::Field<Foam::Vector<double> > >« nach »const Foam::Vector<double>&«
                      /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/Vector.H:58:7: Anmerkung: Foam::Vector<double>& Foam::Vector<double>: perator=(Foam::Vector<double>&&)
                      /opt/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/Vector.H:58:7: Anmerkung:  keine bekannte Umwandlung für Argument 1 von »Foam::tmp<Foam::Field<Foam::Vector<double> > >« nach »Foam::Vector<double>&&«
                      make: *** [Make/linux64GccDPInt64Opt/fixedValueFvPatchFieldTemplate.o] Fehler 1

Ich habe versucht bei field[faceI] einen Vektor anzugeben:

    const scalar nf_x = n.x();
    const scalar nf_z = n.z();
    field[faceI] = vector(FaceVel * nf_x, 0, FaceVel * nf_z);

Eine Aufspaltung der normal forces scheint aber nicht zu funktionieren.
Lässt sich das auf diese Art und Weise lösen? Bin für jeden Tipp dankbar.

VG
Patrick

Shor-ty
Moderator





Sehen Sie sich das Profil von Shor-ty an!   Senden Sie eine Private Message an Shor-ty  Schreiben Sie einen Gästebucheintrag für Shor-ty

Beiträge: 2466
Registriert: 27.08.2010

erstellt am: 24. Jan. 2023 23:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

[n] ist ein vectorField:

Code:

   field[faceI] = faceVel*n[faceI];


------------------
Glück Auf,
Tobi

OpenFOAM® Community - Knowledge Base

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 25. Jan. 2023 19:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Vielen vielen Dank, Tobi. Zusammen mit einem Minus vor dem n ist das dann auch schon meine gewünschte Gesamtlösung. Passt perfekt bei jedem Zeitschritt.

Ich lasse dann mal noch zwei Vorlagen/Beispiele da, die mir zum Thema codedFixedValue sehr weitergeholfen haben:
Normalenvektoren: https://www.youtube.com/watch?v=cvWaXBnEz1U
Vollentwickelte Rohrströmung: https://cfd-training.com/2018/05/07/non-uniform-inlet-profil-with-codedfixedvalue/

VG
Patrick

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2024 CAD.de | Impressum | Datenschutz