Debug: Database connection successful
You are not logged in.
To confirm we have a stable model, I started a new run from 7 seconds to 8. Because we are now heating, run time has increased significantly. What took 4 hours with 20 Kelvin hydrogen now is taking 20 hours. The solver is having to slice time into smaller and smaller intervals, as the complexity of dealing with heat in all cells increases. What I find reassuring is that the remaining teeny-tiny-training-wheel seems to be handling the stress. Here is a snapshot of progress:
ExecutionTime = 44940.86 s ClockTime = 44946 s << 12 hours of 20 estimated
volFieldValue heatBoxStats write:
sum(heaterCells) of e = 9.352828e+10volFieldValue p_avg write:
volAverage(heaterCells) of p = 218645.7 << pressure holding steadyvolFieldValue T_avg write:
volAverage(heaterCells) of T = 681.1487 << temperature holding steadyvolFieldValue rho_mass write:
volIntegrate(heaterCells) of rho = 2.031409 << mass up slightlyvolFieldValue T_min_global write:
min() of T = 22.46052 at location (-240.275 0.16 0) in cell 37871 << minimum steadyvolFieldValue T_max_global write:
max() of T = 1466.182 at location (-0.182823 -0.1878 3.407286e-18) in cell 3401 << Maximum steadyCourant Number mean: 0.03092569 max: 0.7
deltaT = 1.931606e-06
Time = 7.6186164s
The run just ended in just under 20 hours. That is the "new normal" for a heated flow for one second.
ExecutionTime = 70707.46 s ClockTime = 70748 s << 19 hours +
volFieldValue heatBoxStats write:
sum(heaterCells) of e = 1.026401e+11volFieldValue p_avg write:
volAverage(heaterCells) of p = 219808.7 << pressure holding steadyvolFieldValue T_avg write:
volAverage(heaterCells) of T = 718.4616 << temperature holding steadyvolFieldValue rho_mass write:
volIntegrate(heaterCells) of rho = 2.019911 << mass 2 kg per second through heatervolFieldValue T_min_global write:
min() of T = 22.45298 at location (-240.275 -0.16 0) in cell 37621 << intake is 20 KelvinvolFieldValue T_max_global write:
max() of T = 1527.314 at location (-0.182823 -0.1878 3.407286e-18) in cell 3401 << Temperature at throatEnd
I'll work on plots next .. I'm expecting a flat line with minor fluctuations
The trace from 6 to 7 showed adjustment of the system to addition of heating.
The trace from 7 to 8 shows that the system settled down at 7 seconds.
I think we can safely proceed to the next critical phase of the project, which is to reduce the throat diameter from 25 centimeters to 3.
We should definitely see changes. The pressure should build in the intake. Temperature should rise. Mass in the intake should increase. Thrust should increase.
If someone is seeing the chart above for the first time, here is a quick summary.
We've preloaded the model with hydrogen at 1 bar and 21 Kelvin. This is done to avoid equation crashes when we open the system to vacuum.
At the start of the run, we open the exit to vacuum, and we begin feeding hydrogen at 20 Kelvin. The intake ramps from 0 to 2 kg/s over 2 seconds.
The massive thrust we see in the plot occurs because the hydrogen exits rapidly. We see the arriving flow of hydrogen near second 2.
After 5 seconds, the flow of hydrogen stabilizes. At 6 seconds we introduce 40 MW of energy distributed evenly over 24,000 intake cells.
After 7 seconds, we reach a stable condition that prevails from then on to 8 seconds.
In the next run we will introduce the smaller throat, so we can expect the plot to reflect that change.
(th)
Offline
Like button can go here
This post is about planning for introduction of a reduced diameter throat for the extendedMerlin model.
Our strategy is to introduce a mathematical "washer" that will sit square in the center of the existing throat. I have not attempted something like this before, and while ChatGPT5 is brimming with confidence, I have learned to be cautiously optimistic. Things probably won't work as hoped in the first try. For one thing, since this is an artificial construct the mesh itself is unchanged, and the opening in the "washer" will probably be jagged. Below is a transcript of planning:
Hello Again! First, I'd like to thank you for your support (along with ChatgPT4o) over the past 8 months, in finding a CFD model of the Merlin engine, and then building up up to the point we have a stable run using 2 kg/s of hydrogen at 20 Kelvin heated by 40 MW of volume heating over 240 meters of a heat pipe that generates a solid thrust. I just completed a run from 7 seconds to 8 seconds, and the plot shows we are steady as a rock. All fluctuations have disappeared. We are ready to begin work on the washer style throat restriction at the center of the throat at Zero X. Some weeks ago we had a preliminary discussion about how to proceed. I held off until we could be sure our model is stable and that we understand what it is doing. We discussed a porous filter and a washer configuration, and the team selected the washer. Our long term goal is to revise the mesh, but that can wait. I'd like to proceed with the washer style modification. The desired throat diameter is 3 centimeters, down from the current 23 centimeters. As we enter the New Year we may not have time to finish the throat changes but we'll certainly be ready before next Sunday's project meeting. I understand you will need fresh copies of the case files, and I am standing by to provide them.
***
Thought for 4m 45s << that is ** really ** long thinking time!You’re in a great spot to do the washer-style throat restriction without remeshing by treating the washer as a thin “porous resistance” region at x ≈ 0, with a 3 cm diameter “hole” left unobstructed.
The cleanest way to do that in your now-working fvModels pipeline is:
Create a thin annulus cellZone at the throat (the “washer” solid)
Add a porosityForce fvModel that applies a huge momentum sink through that annulus
This is exactly what porosityForce is for: adding Darcy–Forchheimer resistance to selected cells via selectionMode cellZone.
OpenFOAM CPP1) Make a washer cellZone at x=0 (annulus: r=1.5 cm to r=11.5 cm)
A. Create system/topoSetDict.washerThis uses cylinderAnnulusToCell to grab only the annulus (so you don’t need set subtraction). Example syntax for cylinderAnnulusToCell with p1/p2 and innerRadius/outerRadius is standard in topoSetDict workflows.
foaming time
+1actions
(
// 1) CellSet for a thin annulus (washer “solid”) at the throat plane
{
name washerCells;
type cellSet;
action new;
source cylinderAnnulusToCell;
sourceInfo
{
// thickness of washer region along x:
// choose something like 1–3 cells thick in your mesh
p1 (-0.005 0 0);
p2 ( 0.005 0 0);// current throat radius ~ 0.115 m (23 cm dia)
outerRadius 0.115;// desired hole radius = 0.015 m (3 cm dia)
innerRadius 0.015;
}
}// 2) Convert that cellSet into a cellZone (fvModels likes zones)
{
name washerZone;
type cellZoneSet;
action new;
source setToCellZone;
sourceInfo
{
set washerCells;
}
}
);I note that the washer does NOT penetrate the existing mesh. It is sized to exactly match the opening!
About the thickness (p1/p2): start with ±5 mm (as above). If you later see the washer zone has “too few” cells (or is ragged), increase to ±1 cm. You just want a thin plate-like region, not a long plug.
B. Run topoSet
topoSet -dict system/topoSetDict.washerC. Confirm it exists
You should see a zone created (typically under constant/polyMesh/cellZones/), and in the next solver start you’ll be able to select it.
Quick visual check (optional but very helpful): open ParaView and color by Cell Zones and confirm the annulus is at x≈0 and the center “hole” region is not in the zone.
2) Add the washer resistance fvModel (porosityForce) in constant/fvModels
In the same constant/fvModels file where you already have uniformIntakeHeater, add a second model like this:
fvModels is the non-standard feature that provides volume heating of the 240 meter intake pipe. We had to modify the "fluid" solver in order to implement this feature. To accomplish this we created a special directory for the revised solver and then called ** that ** solver at run time
washerRestriction
{
type porosityForce;
active yes;porosityForceCoeffs
{
// IMPORTANT: porosityForce expects selectionMode (cellZone is typical)
selectionMode cellZone;
cellZone washerZone;type DarcyForchheimer;
DarcyForchheimerCoeffs
{
// Start “gentle”, then ramp up by decades until leakage is negligible.
// Strong resistance in x, minimal in y/z:
d (1e8 0 0);
f (0 0 0);// Align resistance with x-axis
coordinateSystem
{
type cartesian;
origin (0 0 0);
coordinateRotation
{
type axesRotation;
e1 (1 0 0);
e2 (0 1 0);
}
}
}
}
}This structure (including porosityForceCoeffs, selectionMode cellZone, and DarcyForchheimerCoeffs) is how porosityForce is defined/selected.
OpenFOAM CPPTuning rule (important)
That d value controls how “solid” the washer behaves. For a 23 cm → 3 cm restriction, you’ll probably end up going very large (e.g., 1e10, 1e12, …) to force essentially all the flow through the hole.
I strongly recommend doing it in steps:
Run with d = (1e8 0 0)
If too much “leakage” through the washer, change to 1e9, then 1e10, etc.
I have NO idea how to tell if leakage is occurring, so must learn how to do that
That avoids a nasty stiffness jump that can wreck convergence.
3) What you should see in the log when it’s working
On startup, you should get lines like:
Creating fvModels from "constant/fvModels"
Selecting finite volume model type porosityForce
Name: washerRestriction
then a selection message for your washerZone
If you don’t see that selection, the #1 culprit is the zone didn’t get created (or it has a different name than you think).
4) One practical warning about the 3 cm target
A 3 cm hole is tiny compared to your existing throat. With the current mesh, that hole may only be a couple of cells across (or worse). If that happens, the “hole” becomes numerically chunky and you’ll still learn a lot (pressure rise, shock behavior, thrust trend), but you won’t get a clean, engineering-grade Cd.
That’s fine for “phase 1”. Later, when you remesh, you’ll make it real.
If you want me to tailor this to your exact mesh in one pass
Paste just these two things (no huge files needed):
The output of:
foamToVTK -cellZones -noInternal
(or just confirm the washerZone exists and roughly how many cells it contains)
A quick screenshot from ParaView showing the washerZone at x≈0
And I can suggest a better p1/p2 thickness and a smarter starting d based on how many cells you’re actually hitting.
This series of steps is NOT something I will attempt without a large block of free time. However, they ** do ** all look familiar in style to what we've done many times before as we've adapted the model to this new concept.
(th)
Offline
Like button can go here
These are images generated by ParaView showing the status of the extendedMerlin model at 8 seconds, with 40 MW heating applied to 2 kg/s of hydrogen at 20 K
Pressure readings
Temperature readings
Velocity readings
and...
Pressure readings at intake
Velocity readings across the entire model
Temperature readings across the entire model
The latter two images show the entire heat pipe, and the increase of temperature and velocity over 240 meters.
Offline
Like button can go here
I feel like turbulent flow is the only way to reduce the gas velocity and build pressure so that the Hydrogen absorbs sufficient thermal energy to achieve 3,000K before it reaches the nozzle. Asymmetric sound suppressor baffles are what is needed, and that's exactly what the internals of that arc jet rocket engine I posted about actually look like in cross-section.
Offline
Like button can go here
This post is about implementing a simulated smaller throat in the existing extendedMerlin model. If I understand the process correctly, we are creating a washer shaped structure that is inserted into the throat. We created the washer and verified it has been mathematically added to the mesh. We looked at the washer using ParaView, and ChatGPT5 tells me the display is showing exactly what it wanted to achieve. All I see (at this point) are flat lines of varying length and thickness, depending upon the view (X, Y or Z). Here is the command file that created the new washer mesh add on:
actions
(
// 1) CellSet for a thin annulus (washer “solid”) at the throat plane
{
name washerCells;
type cellSet;
action new;
source cylinderAnnulusToCell;
sourceInfo
{
// thickness of washer region along x:
// choose something like 1–3 cells thick in your mesh
p1 (-0.005 0 0);
p2 ( 0.005 0 0);// current throat radius ~ 0.115 m (23 cm dia)
outerRadius 0.115;// desired hole radius = 0.015 m (3 cm dia)
innerRadius 0.015;
}
}// 2) Convert that cellSet into a cellZone (fvModels likes zones)
{
name washerZone;
type cellZoneSet;
action new;
source setToCellZone;
sourceInfo
{
set washerCells;
}
}
);
The code above was saved as topoSetDict.washer and fed into a program called "topoSet" that creates the new structure.
The next step is to integrate the new washer into the processing command files.
It appears that the integration will involve modification of fvModels, which was added to the system to implement volume heating.
And this is what the washer creation process looked like:
Create polyMesh for time = 8
Reading "system/topoSetDict.washer"
Time = 8s
mesh not changed.
Created cellSet washerCells
Applying source cylinderAnnulusToCell
Adding cells with centre within cylinder annulus, with point1 = (-0.005 0 0), point2 = (0.005 0 0) and outer radius = 0.115 and inner radius = 0.015
cellSet washerCells now size 22
Created cellZoneSet washerZone
Applying source setToCellZone
Adding all cells from cellSet washerCells ...
cellZoneSet washerZone now size 22
End
The planned gap at the center is 0.015 meters in radius, which yields the desired 3 centimeter diameter.
As a side note ... the porosity of the washer can be varied in setting up a run, from wide open to solid. ChatGPT5 seems to think we should build up to full solid in a series of test runs. I gather that the idea is to try to avoid breaking the model on the first run.
Side note #2: This washer structure appears to have been created in time directory 8 instead of 0. I had worried this might mean we have to re-install the washer in time folder zero but ChatGPT5 reassured me that would not be necessary, because the components of the new washer were installed outside of the time folder.
(th)
Offline
Like button can go here
This next step is to modify fvModels to recognize and use the new washer.
Please note that the porosity of the washer can be adjusted at the start of a run. The initial run will be done with 1e8 which (I gather) is ** leaky **
washerRestriction
{
type porosityForce;
active yes;porosityForceCoeffs
{
// IMPORTANT: porosityForce expects selectionMode (cellZone is typical)
selectionMode cellZone;
cellZone washerZone;type DarcyForchheimer;
DarcyForchheimerCoeffs
{
// Start “gentle”, then ramp up by decades until leakage is negligible.
// Strong resistance in x, minimal in y/z:
d (1e8 0 0);
f (0 0 0);// Align resistance with x-axis
coordinateSystem
{
type cartesian;
origin (0 0 0);
coordinateRotation
{
type axesRotation;
e1 (1 0 0);
e2 (0 1 0);
}
}
}
}
}
(th)
Offline
Like button can go here
The run from 8 seconds to 9 seconds is under way.
The new washer appears to have been recognized by the solver:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create timeCreate mesh for time = 8
Selecting solver fluid
Selecting thermodynamics package
{
type hePsiThermo;
mixture pureMixture;
transport const;
thermo eConst;
equationOfState perfectGas;
specie specie;
energy sensibleInternalEnergy;
}Selecting turbulence model type laminar
Selecting laminar stress model Stokes
No MRF models presentCourant Number mean: 0.0302119 max: 0.7
Creating fvModels from "constant/fvModels"Selecting finite volume model type semiImplicitSource
Name: uniformIntakeHeater
- selecting cells using cellSet heaterCells
- selected 24000 cell(s) with volume 12.10301
Selecting finite volume model type porosityForce
Name: washerRestriction
Porosity region washerRestriction:
selecting model: DarcyForchheimer
creating porous zone: washerZoneSelecting thermophysical transport type laminar
Selecting default laminar thermophysical transport model unityLewisFourier
fluid(user): accessing fvModels
Creating fvConstraints from "system/fvConstraints"
This run will take at least 20 hours and quite possibly much more, because of the new restriction at the throat.
(th)
Offline
Like button can go here
This post is about a test run of extencedMerlin with a mathematical "washer" inserted in the throat.
We stated this run with the washer set to almost transparent. ChatGPT5 seems to "think" that a jump to full solidity would break the equations, and I have plenty of time so am willing to go along with the gentle increase idea. Even the small resistance we imposed in this run caused a modest response from the model. I'll be posting the thrust graph shortly. Here is the text report at the end of the run to 9 seconds:
ExecutionTime = 70863.49 s ClockTime = 71045 s << just under 20 hours as hoped
volFieldValue heatBoxStats write:
sum(heaterCells) of e = 1.080716e+11volFieldValue p_avg write:
volAverage(heaterCells) of p = 238986.8 << Slight increase of pressurevolFieldValue T_avg write:
volAverage(heaterCells) of T = 740.7038 << Slight increase of average temperaturevolFieldValue rho_mass write:
volIntegrate(heaterCells) of rho = 2.160116 << Mass in transit is up slightlyvolFieldValue T_min_global write:
min() of T = 22.45889 at location (-240.275 -0.16 0) in cell 37621 << No change of intake temperaturevolFieldValue T_max_global write:
max() of T = 1619.239 at location (-0.182823 -0.1878 3.407286e-18) in cell 3401 << Slight increase of exit temperatureEnd
The thrust plot should show a slight upward slant ... we'll see.
The thrust did not change. We can see slight changes in the measurements, but the net effect is not much.
I've asked ChatGPT5 to "think" about what to do next. I don't see much point in staying with this level of porosity, but ChatGPT5 seems to "think" the slight changes in measurements indicate something is happening. I am willing to run another second if the data would be useful. Otherwise, I'm interested in increasing the porosity.
Update... after discussion, we are going for the safe jump of x10 ... resistance of the washer will be set to 10x what it is now.
(th)
Offline
Like button can go here