#! /usr/bin/env python
"""Rectangle compression workflow: Abaqus solve

Requires the following ``SConscript(..., exports=[])``

* ``env`` - The SCons construction environment with the following required keys

  * ``abaqus_source_abspath`` - String absolute path to the EABM's Abaqus journal files
  * ``unconditional_build`` - Boolean flag to force building of conditionally ignored targets
  * ``abaqus`` - String path for the Abaqus executable
  * ``cubit`` - String path for the Cubit executable
"""

import pathlib

import waves

# Inherit the parent construction environment
Import('env')

# Set project-wide paths with os-agnostic path separators
abaqus_source_abspath = pathlib.Path(env["abaqus_source_abspath"])

# Simulation variables
build_directory = pathlib.Path(Dir('.').abspath)
workflow_name = build_directory.name
model = "rectangle"

# Collect the target nodes to build a concise alias for all targets
workflow = []
datacheck = []
mesh_files = []

element_type = "QUAD"
solver = "abaqus"
workflow, mesh_files = SConscript("cubit", exports=["env", "element_type", "solver"], duplicate=False)

# Modify mesh target(s) element type.
# Linux style sed command options must be modified for macOS. Command must be modified if on Windows.
env.AddPostAction(mesh_files[0], "sed -i 's/CPE4/CPS4/g' ${TARGET.abspath}")

# SolverPrep
abaqus_source_list = [
    abaqus_source_abspath / f"{model}_compression.inp",
    abaqus_source_abspath / "assembly.inp",
    abaqus_source_abspath / "boundary.inp",
    abaqus_source_abspath / "field_output.inp",
    abaqus_source_abspath / "materials.inp",
    abaqus_source_abspath / "parts.inp",
    abaqus_source_abspath / "history_output.inp"
]
abaqus_source_list = [pathlib.Path(source_file) for source_file in abaqus_source_list]
workflow.extend(waves.scons_extensions.copy_substitute(abaqus_source_list))

# Abaqus Solve
solve_source_list = [source_file.name for source_file in abaqus_source_list]
solve_source_list.append(mesh_files[0])
job_name = pathlib.Path(solve_source_list[0]).stem
datacheck_name = f"{job_name}_DATACHECK"
datacheck_suffixes = ('023', 'mdl', 'sim', 'stt')
abaqus_options='-double both'
datacheck.extend(env.AbaqusSolver(
    target=[f"{datacheck_name}.{suffix}" for suffix in datacheck_suffixes],
    source=solve_source_list,
    job_name=datacheck_name,
    abaqus_options=f'{abaqus_options} -datacheck'))

workflow.extend(env.AbaqusSolver(
    target=[f"{job_name}.sta"],
    source=solve_source_list,
    job_name=job_name,
    abaqus_options=abaqus_options))

# Collector alias based on parent directory name
env.Alias(workflow_name, workflow)
env.Alias(f"{workflow_name}_datacheck", datacheck)

if not env['unconditional_build'] and not env['abaqus']:
    print(f"Program 'abaqus' was not found in construction environment. Ignoring '{workflow_name}' target(s)")
    Ignore(['.', workflow_name], workflow)
    Ignore(['.', workflow_name], datacheck)
