PKR Core
Technical Explanation 7 min read

Zero on every textbook case, and the only answer at 64³

Conductivity offers three methods. Run them against five structures with answers you can write down and two of the three are right. The reduced method returns 0 every time. Run them against a random particle packing and it inverts: above 24³ the reduced method is the only one that returns anything at all.

  • Analyze Properties
  • Reduce & Model Networks
Line chart of effective conductivity against box size for three conductivity methods, with the full-grid method stopping after 24 cubed and the closed-form method flat on zero.

What you can do

You can find out which conductivity method your structure is eligible for before you trust a number from it. It takes about ten calls and no local solver.

  • GET /api/v1/analysis-capabilities lists the methods per analysis and labels each one instant, reduced or high-fidelity.
  • POST /api/v1/conductivity takes params.method, so the same structure can be sent to every method in turn.
  • A structure with an answer you already know tells you whether a method is modelling what you think it is.
  • POST /api/v1/structural-graph reports the node and edge count of the reduction, which is what the reduced method actually solves on.
  • POST /api/v1/conductivity/stream reports solver progress, so a failed run tells you how far short it fell.

That is worth doing because the three methods are not three speeds of the same calculation. They are three models, and each one is blind to something.

Five structures with answers you can write down

Two methods matched the known answers and the third returned 0 on all five. These are 16³ voxel fixtures built by hand, not generated, so there is nothing random in them.

  • A uniform block of one material at 7 W/mK. The answer is the material value.
  • Two equal slabs of 1 and 100 W/mK, measured across the stack. The layers are in series, so the answer is the harmonic mean.
  • The same two slabs measured along the layers. Now they are in parallel, so the answer is the arithmetic mean.
  • Half solid at 30 W/mK and half pore, measured across the join. The pore blocks the path, so the answer is 0.
  • The same structure measured along the join. Half the cross section carries 30 and half carries nothing.
Fixture, 16³Known answersimplegraph-network3d
Uniform block, across z77.0007.00
Two slabs in series, across z1.9801.98001.980
Two slabs in parallel, along x50.550.5050.49
Solid over pore, across z0000
Solid over pore, along x1515015.00

The full-grid method landed within 0.02 % of every known answer. The closed-form method returned the exact values to every digit it printed.

The reduced method returned 0 on all five, which happens to be right for exactly one of them. Every call came back HTTP 200 with a scalar in the same field as the others.

That zero is not a measurement of the structure

The reduced method found nothing to solve on. Asking for the reduction directly shows why, because it reports how many nodes and edges it extracted.

StructurePhase asked forNodesEdges
Uniform block, 16³pore00
Uniform block, 16³solid00
Two slabs, 16³pore00
Two slabs, 16³solid00
Particle packing, 24³pore3617
Particle packing, 24³solid3914

A block and a stack of slabs have no distinguishable regions, so the reduction returns an empty graph. An empty graph has no path, and no path reports as 0 conductivity.

That is defensible behaviour and it is still a trap. The conductivity response carries no sign that the model did not apply, so a 0 reads exactly like an insulator.

On a real packing the ranking inverts

The method that failed the fixtures is the only one that answers at a useful box size. The same particle-packing recipe was built at five sizes and sent to all three methods.

Line chart of effective conductivity against box size for three methods. The graph-network line runs across the whole chart between about 16 and 20 W per metre kelvin. The 3d line sits far lower, at 2.4 at 16 cubed and 3.8 at 24 cubed, then stops. The simple line lies flat on zero. Below the axis a separate strip shows open markers for 3d at 32, 48 and 64 cubed, labelled 504 at 15 seconds.
One recipe, one seed, three methods. The strip below the axis is where the full-grid method returned no value at all, which is not the same as returning a low one.
Box sizeSolid fractionsimplegraph-network3d
16³47.6 %015.732.43
24³46.4 %0.1019.793.83
32³45.0 %017.99no value
48³45.1 %017.92no value
64³45.0 %019.52no value

The closed-form method now returns 0 at four of the five sizes. It is the one labelled instant, and on a random packing it has nothing useful to say.

At 24³, the one size where both of the other two answered, they are a factor of five apart. Nothing measured here settles which of the two is closer for this geometry.

The reduced method did stay self-consistent. The same day, on a randomly packed structure, it agreed with its own three-axis mean to within 4.2 % along x, y and z. That is what you would expect from a structure with no preferred direction.

The full-grid solve runs on a 15-second budget

Above 24³ the full-grid solve stops on a time limit, not on a request limit. The streaming endpoint keeps the connection open and still ends at the same 15 seconds.

What the stream adds is how far it got. The solver reports progress against a budget of 10,000 iterations, and the gap between the sizes is not close.

Line chart of solver iterations against elapsed seconds for four box sizes, with a dashed vertical line at 15 seconds. The 24 cubed line climbs to about 2,450 iterations and ends in a filled dot marked answered. The 32 cubed line reaches about 1,200 and ends in a cross at the dashed line. The 48 and 64 cubed lines barely leave the bottom of the chart at about 100 iterations before ending in crosses.
Progress reported by POST /api/v1/conductivity/stream. The 48³ and 64³ traces lie on top of each other at the bottom, because both stopped at 100 iterations.

At 48³ and 64³ the solve reached 100 iterations before the budget ran out. That is not a run that needed a little more time.

This matters more than it looks, because the full-grid solve is the default. Omit params.method and the response comes back with method "3d" in it.

Picking a method, and then staying on it

Choose the method once, on a structure that resembles what you will analyse, and keep every comparison inside it. The rules below all follow from the numbers above.

  • Validate on geometry like yours. Slabs and blocks validate the closed-form and full-grid methods and say nothing at all about the reduced one.
  • Never compare a number from one method against a number from another. On the same 24³ structure the two usable methods were a factor of five apart.
  • Treat a returned 0 as a question. Check the reduction node count, or re-run a case where you know the answer is not 0.
  • Set params.method explicitly in anything you automate, so the box size you scale up to does not silently change the outcome.
  • Above 24³ on a packed structure, the reduced method is the one that answers. It came back in 0.25 to 0.71 seconds at every size tested.

None of this makes the ranking of candidates wrong. A sweep run entirely on the reduced method still ranks structures against each other on a consistent basis.

What it does mean is that the absolute value is a property of the method as much as of the structure. Quote the method next to the number.

How this was measured

  • Every call went to the production API on 2 October 2026, against build 09a759c6.
  • The fixtures are 16³ voxel arrays sent inline: a uniform block, two stacked slabs, and a solid half over a pore half.
  • The packing is the particle-packing example recipe at 45 % target loading, with 15 % overlap and one fixed seed.
  • The solid phase was set to 30 W/mK, taken from the ceramic alumina preset the API serves.
  • Every conductivity call used direction z except the two fixtures measured along x.
  • Solid fraction drifts from 47.6 % to 45.0 % across the box sizes because a smaller box resolves the same recipe more coarsely.

The full-grid timeout above 24³ showed up three times in separate runs. The value at 24³ was identical through the plain and streaming endpoints.

Try it in PKR Core.

Open PKR Core