Skip to content

THINC/MTHINC: int_comp incompatible with viscosity and surface tension (reconstruction split silently disables compression) #1396

Description

@sbryngelson

Summary

When int_comp > 0 is combined with viscous = T or surface_tension = T, interface compression is silently disabled — no error, no warning, no sharpening.

Root cause

In m_rhs.fpp, the reconstruction path splits into multiple s_reconstruct_cell_boundary_values calls with disjoint variable index ranges when viscosity or surface tension is enabled:

# Viscous case (Re_size > 0):
call s_reconstruct(vf(1 : cont%end), ...)       ! partial densities only
call s_reconstruct(vf(E   : sys_size), ...)      ! energy + adv (volume fractions)

# Surface tension case:
call s_reconstruct(vf(1   : E-1), ...)           ! cont + mom
call s_reconstruct_first_order(vf(E), ...)       ! energy
call s_reconstruct(vf(E+1 : sys_size), ...)      ! adv (volume fractions)

Inside s_weno and s_muscl, compression is guarded by:

if (int_comp > 0 .and. v_size >= eqn_idx%adv%end) then
    call s_thinc_compression(...)
end if

v_size = ubound(v_vf, 1) for the current slice. In the split paths, no single slice contains both cont (needed for density ratios) and adv (volume fractions), so v_size >= eqn_idx%adv%end is never true and compression never fires.

Current mitigation (merged in PR #1303)

check_interface_compression in toolchain/mfc/case_validator.py now prohibits these combinations explicitly:

self.prohibit(int_comp != 0 and viscous,
    "int_comp > 0 is not supported with viscosity (reconstruction is split; compression would be silently skipped)")
self.prohibit(int_comp != 0 and surface_tension,
    "int_comp > 0 is not supported with surface tension (reconstruction is split; compression would be silently skipped)")

This turns a silent wrong result into a clear error at validation time.

What full support would require

To actually support int_comp with viscosity or surface tension, the reconstruction in m_rhs would need to be restructured so that cont and adv variables are always reconstructed together in a single WENO/MUSCL call when int_comp > 0, allowing s_thinc_compression to access both sets of variables at once. This is non-trivial and warrants its own PR.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working or doesn't seem right

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions