AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified Apache-2.0 Self-run

Neqsim Fem Coupling

skill-equinor-neqsim-community-skills-fem-coupling · by equinor

Link a NeqSim process simulation and engineering documents to a finite-element model of the solid: heat conduction through a layered wall, transient cooldown, species diffusion in porous rock, and the thermal and pressure stress that follow. Merges P&ID, STID, datasheet, insulation-specification and inspection inputs into a traceable design basis, converts a flashed NeqSim fluid into a film coeff…

No reviews yet
0 installs
26 views
0.0% view→install

Install

$ agentstack add skill-equinor-neqsim-community-skills-fem-coupling

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-equinor-neqsim-community-skills-fem-coupling)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
1mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Neqsim Fem Coupling? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

FEM Coupling

NeqSim solves the fluid. It reports a bulk temperature, a pressure and a set of transport properties, and a one-dimensional model turns those into a single U-value per pipe section. That works until the geometry stops being one-dimensional: a section of insulation floods, a clamp bridges the coating, a line is buried under a sloping seabed, a nozzle interrupts a shell. The heat then spreads in a direction the one-dimensional model does not have, and the U-value it was given is wrong by an amount nobody can estimate by hand.

This skill closes that gap. It takes whatever is known about the component (P&ID, STID tag register, datasheets, insulation specification, inspection report), takes the fluid side from a NeqSim flash, builds and solves the finite-element model of the solid, and converts the field back into the number the one-dimensional model needed - an effective U-value, a multiplier on it, a hot-spot factor, a no-touch time, a wall stress. When a thermal or stress finite-element study already exists, it qualifies that study instead of running a new one.

It is the solid-side companion to neqsim-cfd-coupling: same design-basis discipline, same quality gate before any number is quoted, same handoff back into a one-dimensional model. CFD resolves the fluid; FEM resolves the solid.

Every layer works on its own. NeqSim, Gmsh, scikit-fem and FEniCSx are all optional: without NeqSim the fluid state is stated directly, and without a mesher or a solver the geometry and the case are still written, with the commands needed to run them elsewhere.

When to Use

  • A one-dimensional U-value is being assumed where the geometry is not

one-dimensional: a local insulation defect or flooded section, a support or clamp, a buried line, a valve or flange with no insulation.

  • A cooldown or no-touch time is needed and the wall's thermal inertia matters,

not just the fluid's.

  • A metal temperature is needed for a thermal-stress, MDMT or material-selection

question, and the process-to-ambient difference is not the metal gradient.

  • Species diffusion through a porous medium is being modelled and the molecular

diffusivity has to come from the actual mixture.

  • A thermal or thermo-mechanical finite-element report is attached to an equipment

tag and its numbers are about to be used.

  • A new finite-element run is being specified and needs film coefficients, a

penetration depth, an element size and a time step.

When Not to Use

  • As a substitute for a qualified stress or thermal analyst on a design decision.

This is a screening and coupling toolkit, not a code-compliance calculation.

  • For fatigue life, fracture mechanics, creep, plasticity, buckling or contact.

The stress layer produces elastic thermal and pressure stresses with a category attached; it does not perform a code assessment.

  • For the flow field. Velocity, wall shear and flow maldistribution belong to

neqsim-cfd-coupling; this skill consumes a film coefficient, it does not resolve the boundary layer that produces it.

  • To extract a number from a study that fails the quality gate.

Inputs

| Stage | Input | Meaning | |---|---|---| | build_design_basis | tag, model_kind, sources | Equipment or line identifier, the model class (insulated_pipe, pipe_wall, buried_pipeline, vessel_wall, plate, nozzle, wellbore, porous_block), and one entry per source with source, reference and values | | material / custom_material | material key, or a base plus overrides | Conductivity, heat capacity, modulus, expansion, allowable - with the basis recorded in source | | fluid_state_from_neqsim | flashed NeqSim system, phase, optional velocity_m_per_s, diffusing_components | Density, viscosity, thermal conductivity, heat capacity and molecular diffusivities of the chosen phase | | film_coefficient | FemFluidState, hydraulic_diameter_m, velocity | Optional correlation (auto, gnielinski, dittus-boelter, laminar) | | derive_thermal_conditions | wall thickness, solid conductivity and diffusivity, both film coefficients and bulk temperatures | Optional transient_duration_s to obtain a penetration depth, element size and time step | | RadialConductionModel | ConductionLayer stack, inner_radius_m, geometry | cylindrical or planar; each layer carries its material, thickness and element count | | solve_transient | initial profile, duration, time step, both boundaries | Optional inner_fluid_capacity (rho cp A_bore) to make it a cooldown rather than a thermal-shock model | | FemMeshSpec | kind, layers, segments, inner_radius_m, element_order | A structured layered grid; a MeshSegment override assigns a different material over part of the length | | FemMeshSpec (three-dimensional) | revolve_deg or extrude_m, circumferential_cells | Sweeps the same section into a solid: a revolved pipe or vessel wall, or an extruded plate or block | | recommend_backend | dimension, physics, coupled, nonlinear, structural_frame, estimated_dof | Which finite-element package is defensible, and why | | ConductionProblem / FemCase | mesh, MaterialAssignment list, BoundaryCondition list, optional TransientSettings | Boundary kinds are robin, dirichlet, flux, adiabatic | | assess_quality | element order, elements across the controlling layer, mesh levels, energy balance, far-field ratio | Applies to a generated case or an existing report | | evaluate_thermal_handoff | finite-element heat flow, reference area, bulk temperatures, one-dimensional heat flow | Produces the U-value and the multiplier a NeqSim pipeline model carries | | evaluate_wall_stress | material, inner and outer metal temperatures, radii, pressure | Not the process and ambient temperatures - the metal surface temperatures the model produced |

Outputs

| Output | Contents | |---|---| | FemDesignBasis | Accepted values, per-field source and confidence, conflicts, missing fields, ready_for_meshing | | FilmCoefficient | Film coefficient, Reynolds, Prandtl, Nusselt, the correlation used, warnings | | FemThermalConditions | Biot, lumped-capacitance verdict, thermal penetration depth, maximum element size, recommended time step, Fourier number, warnings | | SteadyConductionResult | Node temperatures, per-layer interface temperatures, inner heat flux, heat flow per unit length, overall U, thermal resistance, and the deviation from the closed-form composite resistance | | TransientConductionResult | Temperature history through the wall, bore-fluid history, and time_to_reach for a no-touch or cooldown time | | FemMeshSpec.geo_script / generate | A structured Gmsh geometry and mesh, two-dimensional or swept into three, with a physical group per material and per face and explicit deterministic tags | | FemMeshSpec.mesh_warnings | Layers with too few elements, excessive aspect ratio, elements coarser than the penetration depth | | render_mesh / render_field | Off-screen PyVista PNGs: the mesh before it is solved, and the solved field as a surface, a cut plane and a clipped view | | BackendRecommendation | The defensible backend with its rationale, the alternatives, and whether this skill can generate the case | | FemCase.write / run | A self-contained case: inputs.json, case.py, the mesh, a README; run outcome or the command to run it elsewhere | | FemResults | Degrees of freedom, element count, temperature range, per-boundary heat flow and mean temperature, transient history, energy-balance error | | FemQualityResult | usable, usable_with_caution or not_usable with explicit findings | | FemThermalHandoff | Overall U-value, U-multiplier against the one-dimensional model, hot-spot factor | | ThermalStressResult | Thermal stress with its category, Lame pressure stresses, combined von Mises, utilisation against the right allowable, verdict |

Engineering Method

Design basis by precedence. Sources are ranked measurement > mechanical_datasheet > material_certificate > insulation_specification > process_datasheet > vendor > stid > inspection_report > plant_data > pid > estimate > assumption. A lower-ranked source never overwrites a higher-ranked one; if it disagrees by more than 2 % it raises a conflict, and any disagreement about a non-numeric field such as a material grade is always a conflict. The model kind determines which fields are required, so an under-specified model is reported rather than meshed.

Fluid to boundary condition. A finite-element model consumes a film coefficient, not a fluid. Properties come from the NeqSim phase after initProperties(), because thermal conductivity and viscosity are otherwise zero. The default correlation is Gnielinski with the Petukhov friction factor,

$$f = (0.79 \ln \mathrm{Re} - 1.64)^{-2}, \qquad \mathrm{Nu} = \frac{(f/8)(\mathrm{Re} - 1000)\,\mathrm{Pr}} {1 + 12.7\sqrt{f/8}\,\left(\mathrm{Pr}^{2/3} - 1\right)}$$

valid over a far wider Prandtl range than Dittus-Boelter, which matters because a dense-phase gas and a glycol are on opposite sides of that range. Below Re = 2300 the fully developed laminar value Nu = 3.66 is used and said so.

Do I even need a mesh? The Biot number over the whole conduction path, $\mathrm{Bi} = h L / k$ with $h$ the smaller of the two surface coefficients, decides it. Below 0.1 the solid is nearly isothermal and a lumped model answers the question. The skill says so rather than meshing anyway.

Discretisation from the physics. For a transient, the thermal penetration depth $\delta = \sqrt{\alpha t}$ is how far the front has moved after the time of interest; elements coarser than $\delta/4$ cannot represent it. The time step targets a mesh Fourier number $\alpha \Delta t / \Delta x^2$ of about 0.5 - an implicit scheme is stable at any step, so the step is chosen to resolve the front, not to keep the solve from diverging.

One dimension, verified. Layered walls are assembled as linear P1 elements on a one-dimensional mesh with every layer interface on a node, in cylindrical or planar coordinates, with Robin conditions on both surfaces. Temperature-dependent conductivity is handled by Picard sweeps on the layer mean temperature. The steady result is checked against the closed-form composite resistance

$$R' = \frac{1}{hi 2\pi ri}

  • \sumj \frac{\ln(r{j+1}/rj)}{2\pi kj}
  • \frac{1}{ho 2\pi ro}$$

and the deviation is reported. That check is the reason to start in one dimension: a two-dimensional field cannot be verified this way, so if the one-dimensional answer is not understood first, nothing downstream is.

Cooldown. Holding the bore fluid at a fixed bulk temperature models a thermal shock, not a cooldown - a shut-in line has no source keeping it warm. Supplying inner_fluid_capacity = $\rho cp A\text{bore}$ adds the inventory as one lumped node coupled to the wall through the inner film, and the system stays tridiagonal. NeqSim supplies the density and heat capacity of the shut-in fluid and the hydrate or wax temperature the cooldown is measured against.

Mesh. Layered geometry wants a structured tensor grid, one block per (axial segment, through-thickness layer), because an unstructured mesh dropped over a 12 mm wall next to 50 mm of insulation puts one element across the wall - and the wall gradient is what sets the thermal stress. Interfaces sit on element boundaries, physical groups carry the material assignment and the faces, and the group ids are written explicitly so a name-based reader (meshio, scikit-fem) and a tag-based reader (dolfinx) see the same partition. A local defect is represented by overriding a segment's material - water-flooded insulation conducts like seawater, which is what actually happens.

Backend screening. Python has no single dominant finite-element package, so the choice is stated rather than defaulted:

| Verdict | When | Generated | |---|---|---| | built-in RadialConductionModel | One-dimensional layered conduction or diffusion | Yes - and it is the only one that can be checked against a closed form | | scikit-fem | Two-dimensional linear scalar problems; pure NumPy and SciPy, installs anywhere including Colab | Yes | | fenicsx | Coupled, nonlinear or thermo-mechanical; three-dimensional continuum | Yes | | sfepy | General multiphysics with built-in terms | No - set up by hand | | mfem | Very large or high-order solves, parallel and GPU | No - set up by hand | | openseespy | Nonlinear or dynamic structural frames | No - set up by hand | | pynite | Linear beams, frames and plates | No - set up by hand |

Case as data. inputs.json holds the mesh reference, the per-material properties and the boundary conditions; case.py is a fixed script that reads it. The same inputs.json drives the scikit-fem and the FEniCSx script, so a model is promoted from the light backend to the heavy one without being rebuilt.

Three dimensions, and when not to use them. revolve_deg sweeps the r-z section about the axis into a pipe or vessel wall; extrude_m sweeps a plane section or a block out of plane. Gmsh returns a sweep in a fixed order - end surface, volume, then one lateral face per curve of the loop - and the loop is written as (inner, east, outer, west), so the volumes and the six faces are tagged without any geometric search and the same physical names carry through. A partial revolve adds symmetry_start and symmetry_end, which are cut planes and take an adiabatic condition. ConductionProblem.from_mesh_spec switches the axisymmetric weighting off for a swept mesh, because a revolved model already contains the circumference and weighting it again counts it twice.

Do not revolve by default. An axisymmetric problem on a revolved mesh costs an order of magnitude more and returns the same answer as the r-z section. The reasons to go to three dimensions are a genuinely circumferential feature - a support, a nozzle, a weld that does not run all the way round, a partial-thickness defect - and presentation.

Rendering. render_field reads whatever field file the case recorded (field.vtu from scikit-fem, field.xdmf from FEniCSx) and produces off-screen PNGs. A two-dimensional mesh gets one surface view; a three-dimensional mesh gets the surface, a cut plane and a clipped view, because the outside of a solid says almost nothing about the gradient inside it. The camera defaults to the plane of the two largest extents - an isometric view of a 3.5 mm wall on a 1 m tube wastes the frame - and scale stretches the thin direction so the layers are legible. Both are presentation devices and are labelled as such in the returned message. A picture is not evidence: render after the quality gate, not instead of it.

Quality gate. Four things decide whether a finite-element number means anything.

| Check | Requirement | |---|---| | Discretisation | At least three linear (or two quadratic) elements across the layer that controls the answer, and an aspect ratio below about 20 | | Mesh independence | At least two mesh levels, with the quantity of interest moving less than about 2 % on refinement. Refinement is cheap for conduction | | Energy balance | Boundary heat flows must sum to a small fraction of a percent. A larger residual usually means a missing boundary condition or an unassigned material group | | Boundary placement | A far-field boundary must sit at least three penetration depths away, or it becomes an input to the answer |

For a transient, the mesh Fourier number and the number of time steps are checked too: an implicit scheme stays stable while smearing the front, which flatters a cooldown time and understates a thermal shock.

Handoff. The field is reduced to what a one-dimensional model consumes. The overall U-value follows from the boundary heat flow and the reference area, and the U-multiplier - the ratio of the fi

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.