SPH implementieren



  • Hallo

    ich versuche mich grade daran, SPH mithilfe von C++ zu implementieren.
    zu nächst noch in 2D. dummerweise sind die Formeln alles andere als einfach
    zu verstehen...

    ich habe verstanden, dass ich einen kreisformigen bereich mit dem radius
    "h" abtasten muss, und die partikel dadrin mithilfe einer kernelfunktion
    zusammenzuaddieren. als kernel nehme ich die sigmoid-funktion (s(0)=1, s(h)=0).
    das ergebnis sieht schon in maßen aus wie eine flüssigkeit, aber nur, wenn
    ich alle gewichte (s(r)) zusammenaddiere und am ende durch das gesamtgewicht
    teile. ist das richtig so?

    weiterhin fällt mir auf, das meine "flüssigkeit" eine zu große viskosität hat,
    das zeug will nicht fließen. je kleiner ich "h" wähle, desto geringer wird
    die viskosität, jedoch wird die simulation irgentwann instabil.

    zusätzlich fangen meine teilchen hin und wieder an, sich zusammenzukleben 😞

    float ax = 0.f; // beschleunigung x
    float ay = 0.f; // beschleunigung y
    float sw = 0.f; // summe der gewichte
    
    foreach(particles)
    {
    	Particle *p = particles[i];
    
    	float diffx = x - p->x; // entfernung x-achse
    	float diffy = y - p->y; // entfernung y-achse
    
    	float rsq = diffx * diffx + diffy * diffy; // r²
    
    	if (rsq <= h * h) // innerhalb des kernels
    	{
    		float w = W(sqrtf(rsq)); // sigmoid funktion, W(0)=1, W(h)=0
    		sw += w; // gewicht aufzummieren
    		ax += w * p->vx;
    		ay += w * p->vy; // partikel gewichten
    
    //////////////////// HIER
    		if (rsq > 0.00001f)
    		{
    			ax += diffx * w * 3.f;
    			ay += diffy * w * 3.f;
    		}
    //////////////////// HIER
    
    	}
    }
    
    vx = ax / sw; // neue geschwindigkeit
    vy = ay / sw;
    

    wenn ich den markeirten bereich auskommentiere, pappen die parikel zusammen,
    wenn ich ihn drinhabe, klappt es scheinbar. ich versuche damit nur, ein
    partikel wegzustoßen, wenn es zu nah kommt.

    und:

    wie bekomme ich die viskosität kleiner? es ist eher ein zähflüssiges
    verschieben als ein fließen...

    MfG sph-mensch

    danke euch allen im voraus und eine gute nacht 🙂



  • 😞

    kann mir den einer einen hinweis, eine erklärung oder ein beispielcode zu
    SPH geben? (bitte kein optimierter code, das bringt nichts).

    auch wäre es gut zu wissen, ob wenigstens der ansatz richtig ist



  • Hi,

    ich weiß nicht welches Paper du als Grundlage verwendest, aber ich kann dir sehr dieses hier ans Herzen legen! Wieviel Partikel benutzt du momentan? Bei mir war das Problem, dass unter 5000 alles recht instabil war (in 3D).

    mfG KaPtainCugel


Anmelden zum Antworten