#!/usr/bin/env python
"""Data class for card 05::unused but correlated variables."""
from typing import List
from pydantic import BaseModel, Field, model_validator
from pleiades.utils.helper import safe_parse
from pleiades.utils.logger import loguru_logger
# Format definitions for fixed-width fields
# Name line has 8 possible 5-character fields separated by 5 spaces
FORMAT_NAMES = {f"name{i}": slice(i * 10, i * 10 + 5) for i in range(8)}
# Value line has 8 possible 10-character fields
FORMAT_VALUES = {f"value{i}": slice(i * 10, (i + 1) * 10) for i in range(8)}
CARD_5_HEADER = "UNUSEd but correlated variables come next"
[docs]
class UnusedVariable(BaseModel):
"""Container for a single unused but correlated variable.
Contains:
- name: 5-character name of the variable
- value: Numerical value of the variable
"""
name: str = Field(description="Name of the unused variable (5 chars)")
value: float = Field(description="Value of the unused variable")
[docs]
@model_validator(mode="after")
def validate_name_length(self) -> "UnusedVariable":
"""Validate that name is exactly 5 characters."""
if len(self.name) != 5:
self.name = f"{self.name:<5}" # Pad with spaces if needed
return self
if __name__ == "__main__":
# Enable logging for debugging
from pleiades.utils.logger import configure_logger
configure_logger(console_level="DEBUG")
logger = loguru_logger.bind(name=__name__)
# Test example with two groups of variables
logger.debug("**Testing variable parsing**")
test_lines = [
(" " * 5).join([f"NVAR{i}" for i in range(1, 4)]),
"1.2304E+002.9800E+021.5000E-01",
(" " * 5).join([f"NVAR{i}" for i in range(4, 6)]),
"2.5000E-021.0000E+00",
]
try:
params = UnusedCorrelatedParameters.from_lines(test_lines)
logger.debug("Successfully parsed parameters:")
for var in params.variables:
logger.debug(f"{var.name}: {var.value}")
logger.debug("\nOutput lines:")
for line in params.to_lines():
logger.debug(f"'{line}'")
logger.debug("")
except ValueError as e:
logger.error(f"Failed to parse parameters: {e}")
# Test complete card set
logger.debug("**Testing complete card set**")
card_lines = [
"UNUSEd but correlated variables come next",
(" " * 5).join([f"NVAR{i}" for i in range(1, 4)]),
"1.2340E+002.9800E+021.5000E-01 ",
(" " * 5).join([f"NVAR{i}" for i in range(4, 6)]),
"2.5000E-021.0000E+00",
"",
]
try:
card = UnusedCorrelatedCard.from_lines(card_lines)
logger.debug("Successfully parsed complete card set")
logger.debug("Output lines:")
for line in card.to_lines():
logger.debug(f"'{line}'")
except ValueError as e:
logger.error(f"Failed to parse complete card set: {e}")
# Test error handling
logger.debug("\n**Testing Error Handling**")
# Test invalid header
try:
bad_lines = ["WRONG header line", "NVAR1", "1.2340E+00", ""]
logger.debug("Testing invalid header:")
UnusedCorrelatedCard.from_lines(bad_lines)
except ValueError as e:
logger.debug(f"Caught expected error for invalid header: {e}")
# Test mismatched name/value lines
try:
bad_lines = ["NVAR1 NVAR2", "1.2340E+00"] # Missing value
UnusedCorrelatedParameters.from_lines(bad_lines)
except ValueError as e:
logger.debug(f"Caught expected error for mismatched lines: {e}")