From 67238f064875c3e3a1ba019c84f8b4307ba93f8e Mon Sep 17 00:00:00 2001 From: austin Date: Thu, 19 Dec 2024 16:25:29 -0500 Subject: [PATCH] add tracking for pressurecell --- src/main/c/includes/fluid/env/environment.h | 2 ++ src/main/c/includes/fluid/queue/chunk.h | 10 ++++++ .../fluid/sim/pressurecell/solver_consts.h | 2 +- .../fluid/sim/pressurecell/tracking.h | 17 ++++++++++ src/main/c/src/fluid/queue/javainterface.c | 2 ++ src/main/c/src/fluid/queue/metadatacalc.c | 21 ++++++++++++ .../src/fluid/sim/pressurecell/pressurecell.c | 10 ++++++ .../c/src/fluid/sim/pressurecell/tracking.c | 33 +++++++++++++++++++ .../ui/menu/debug/ImGuiFluidMonitor.java | 5 +++ .../fluid/manager/ServerFluidChunk.java | 26 +++++++++++++++ 10 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/main/c/includes/fluid/sim/pressurecell/tracking.h create mode 100644 src/main/c/src/fluid/sim/pressurecell/tracking.c diff --git a/src/main/c/includes/fluid/env/environment.h b/src/main/c/includes/fluid/env/environment.h index 4228cb6c..ac7cf457 100644 --- a/src/main/c/includes/fluid/env/environment.h +++ b/src/main/c/includes/fluid/env/environment.h @@ -41,6 +41,8 @@ typedef struct { jfieldID homogenousId; jfieldID normalizationRatioId; jfieldID massCountId; + jfieldID pressureTotalId; + jfieldID velocityMagTotalId; } ServerFluidChunkLookupTable; /** diff --git a/src/main/c/includes/fluid/queue/chunk.h b/src/main/c/includes/fluid/queue/chunk.h index e2f11ce7..66df2ff7 100644 --- a/src/main/c/includes/fluid/queue/chunk.h +++ b/src/main/c/includes/fluid/queue/chunk.h @@ -75,6 +75,16 @@ typedef struct { */ double recaptureDensity; + /** + * The total pressure of the chunk + */ + double pressureTotal; + + /** + * Total velocity magnitude of the chunk + */ + double velocityMagTotal; + /** * The density outgoing to neighbors */ diff --git a/src/main/c/includes/fluid/sim/pressurecell/solver_consts.h b/src/main/c/includes/fluid/sim/pressurecell/solver_consts.h index c21caf06..62c290ab 100644 --- a/src/main/c/includes/fluid/sim/pressurecell/solver_consts.h +++ b/src/main/c/includes/fluid/sim/pressurecell/solver_consts.h @@ -50,7 +50,7 @@ /** * Set to 1 to clamp small density values to 0 */ -#define FLUID_PRESSURECELL_ENABLE_CLAMP_MIN_DENSITY 0 +#define FLUID_PRESSURECELL_ENABLE_CLAMP_MIN_DENSITY 1 /** * Cutoff after which density is clamped to zero while diffusing diff --git a/src/main/c/includes/fluid/sim/pressurecell/tracking.h b/src/main/c/includes/fluid/sim/pressurecell/tracking.h new file mode 100644 index 00000000..0ec31d81 --- /dev/null +++ b/src/main/c/includes/fluid/sim/pressurecell/tracking.h @@ -0,0 +1,17 @@ +#ifndef FLUID_PRESSURECELL_TRACKING_H +#define FLUID_PRESSURECELL_TRACKING_H + +#include "public.h" +#include "fluid/queue/chunk.h" +#include "fluid/queue/chunkmask.h" +#include "fluid/env/environment.h" +#include "fluid/env/utilities.h" + + +/** + * Updates the tracking data for this chunk + */ +LIBRARY_API void pressurecell_update_tracking(Environment * environment, Chunk * chunk); + + +#endif \ No newline at end of file diff --git a/src/main/c/src/fluid/queue/javainterface.c b/src/main/c/src/fluid/queue/javainterface.c index d564746d..12725d87 100644 --- a/src/main/c/src/fluid/queue/javainterface.c +++ b/src/main/c/src/fluid/queue/javainterface.c @@ -143,6 +143,8 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate environment->lookupTable.serverFluidChunkTable.homogenousId = (*env)->GetFieldID(env,fluidSimStorageClass,"isHomogenous","Z"); environment->lookupTable.serverFluidChunkTable.normalizationRatioId = (*env)->GetStaticFieldID(env,fluidSimStorageClass,"normalizationRatio","F"); environment->lookupTable.serverFluidChunkTable.massCountId = (*env)->GetStaticFieldID(env,fluidSimStorageClass,"massCount","F"); + environment->lookupTable.serverFluidChunkTable.pressureTotalId = (*env)->GetFieldID(env,fluidSimStorageClass,"totalPressure","F"); + environment->lookupTable.serverFluidChunkTable.velocityMagTotalId = (*env)->GetFieldID(env,fluidSimStorageClass,"totalVelocityMag","F"); } /** diff --git a/src/main/c/src/fluid/queue/metadatacalc.c b/src/main/c/src/fluid/queue/metadatacalc.c index 47245796..4d27dfae 100644 --- a/src/main/c/src/fluid/queue/metadatacalc.c +++ b/src/main/c/src/fluid/queue/metadatacalc.c @@ -106,6 +106,27 @@ LIBRARY_API void updateMetadata(JNIEnv * env, int numChunks, Chunk ** passedInCh massCount ); + //set non-static metadata in each chunk + for(int i = 0; i < numChunks; i++){ + Chunk * currentChunk = passedInChunks[i]; + //total pressure + float pressureTotal = (float)currentChunk->pressureCellData.pressureTotal; + (*env)->SetFloatField( + env, + currentChunk->chunkJRaw, + environment->lookupTable.serverFluidChunkTable.pressureTotalId, + pressureTotal + ); + //total velocity magnitude + float velocityMagTotal = (float)currentChunk->pressureCellData.velocityMagTotal; + (*env)->SetFloatField( + env, + currentChunk->chunkJRaw, + environment->lookupTable.serverFluidChunkTable.velocityMagTotalId, + velocityMagTotal + ); + } + //update frame state environment->state.frame = environment->state.frame + 1; diff --git a/src/main/c/src/fluid/sim/pressurecell/pressurecell.c b/src/main/c/src/fluid/sim/pressurecell/pressurecell.c index 1fafadef..05f9a52a 100644 --- a/src/main/c/src/fluid/sim/pressurecell/pressurecell.c +++ b/src/main/c/src/fluid/sim/pressurecell/pressurecell.c @@ -14,6 +14,7 @@ #include "fluid/sim/pressurecell/pressure.h" #include "fluid/sim/pressurecell/solver_consts.h" #include "fluid/sim/pressurecell/normalization.h" +#include "fluid/sim/pressurecell/tracking.h" #include "fluid/sim/pressurecell/velocity.h" @@ -156,6 +157,15 @@ LIBRARY_API void fluid_pressurecell_simulate( } + // + // Update tracking + // + for(int i = 0; i < numChunks; i++){ + Chunk * currentChunk = chunks[i]; + pressurecell_update_tracking(environment,currentChunk); + } + + // // Setup for next iteration // diff --git a/src/main/c/src/fluid/sim/pressurecell/tracking.c b/src/main/c/src/fluid/sim/pressurecell/tracking.c new file mode 100644 index 00000000..401ac95e --- /dev/null +++ b/src/main/c/src/fluid/sim/pressurecell/tracking.c @@ -0,0 +1,33 @@ +#include + +#include "fluid/sim/pressurecell/tracking.h" + + + + +/** + * Updates the tracking data for this chunk + */ +LIBRARY_API void pressurecell_update_tracking(Environment * environment, Chunk * chunk){ + int x, y, z; + double pressureSum = 0; + double velocitySum = 0; + float * u = chunk->u[CENTER_LOC]; + float * v = chunk->v[CENTER_LOC]; + float * w = chunk->w[CENTER_LOC]; + float * pressure = chunk->pressureCache[CENTER_LOC]; + for(x = 0; x < DIM; x++){ + for(y = 0; y < DIM; y++){ + for(z = 0; z < DIM; z++){ + float velocityMagnitude = sqrt(u[IX(x,y,z)] * u[IX(x,y,z)] + v[IX(x,y,z)] * v[IX(x,y,z)] + w[IX(x,y,z)] * w[IX(x,y,z)]); + velocitySum = velocitySum + velocityMagnitude; + pressureSum = pressureSum + pressure[IX(x,y,z)]; + } + } + } + chunk->pressureCellData.pressureTotal = pressureSum; + chunk->pressureCellData.velocityMagTotal = velocitySum; +} + + + diff --git a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiFluidMonitor.java b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiFluidMonitor.java index 3ec4c34a..d29040b3 100644 --- a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiFluidMonitor.java +++ b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiFluidMonitor.java @@ -45,6 +45,11 @@ public class ImGuiFluidMonitor { ImGui.text("Broadcast Size (This Frame): " + fluidManager.getBroadcastSize()); ImGui.text("Normalization Ratio: " + ServerFluidChunk.getNormalizationRatio()); ImGui.text("Mass: " + ServerFluidChunk.getMassCount()); + if(fluidManager.getChunk(0, 0, 0) != null){ + ServerFluidChunk chunk = fluidManager.getChunk(0, 0, 0); + ImGui.text("Pressure: " + chunk.getTotalPressure()); + ImGui.text("Velocity magnitude: " + chunk.getTotalVelocityMag()); + } } if(ImGui.collapsingHeader("Client Data")){ diff --git a/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java b/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java index 0b649413..947f8b70 100644 --- a/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java +++ b/src/main/java/electrosphere/server/fluid/manager/ServerFluidChunk.java @@ -196,6 +196,16 @@ public class ServerFluidChunk { */ public float totalDensity = 0; + /** + * Total pressure of this chunk + */ + public float totalPressure = 0; + + /** + * Total velocity magnitude of this chunk + */ + public float totalVelocityMag = 0; + /** * The normalization ratio used to smooth fluid simulation steps */ @@ -658,6 +668,22 @@ public class ServerFluidChunk { return massCount; } + /** + * Gets the total pressure of this chunk + * @return The total pressure of this chunk + */ + public float getTotalPressure(){ + return totalPressure; + } + + /** + * Gets the total velocity magnitude of this chunk + * @return The total velocity magnitude of this chunk + */ + public float getTotalVelocityMag(){ + return totalVelocityMag; + } + }