Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions kratos.gid/apps/Dam/python/MainKratos.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,37 @@ def Initialize(self):
self.list_of_processes += KratosMultiphysics.process_factory.KratosProcessFactory(self.model).ConstructListOfProcesses( self.ProjectParameters["temperature_by_device_list"] )
self.list_of_processes += KratosMultiphysics.process_factory.KratosProcessFactory(self.model).ConstructListOfProcesses( self.ProjectParameters["output_device_list"] )

# The initial-state import must be the only mechanism that assigns each
# imported field. Multiple JSON imports are allowed for disjoint parts;
# their overlap is validated globally before any ExecuteBeforeSolutionLoop.
self.initial_state_import_processes = [
process for process in self.list_of_processes
if hasattr(process, "PrevalidateInitialState")]

if any(getattr(process, "imports_reference_temperature", False)
for process in self.list_of_processes):
reference_process_classes = (
"ImposeNodalReferenceTemperatureProcess",
"ImposeGroutingReferenceTemperatureProcess")
reference_processes = [
process for process in self.list_of_processes
if (getattr(process, "assigns_reference_temperature", False) or
isinstance(
process,
KratosDam.DamNodalReferenceTemperatureProcess) or
type(process).__name__ in reference_process_classes)]
if reference_processes:
raise RuntimeError(
"Cannot import NODAL_REFERENCE_TEMPERATURE while a process "
"that assigns it is active. Remove or disable the "
"reference-temperature process for this analysis.")

if self.add_previous_results and self.initial_state_import_processes:
raise RuntimeError(
"An initial-state transfer process cannot be combined with "
"'transfer_results_process.add_previous_results'. Use only one "
"initial-state transfer mechanism per analysis.")

# Print list of constructed processes
if(self.echo_level>1):
for self.process in self.list_of_processes:
Expand Down Expand Up @@ -240,6 +271,12 @@ def Initialize(self):
# Execute initialize solution
self.construction_utilities.BeforeSolutionLoop()

# Validate all configured imports before any process applies fields.
if self.initial_state_import_processes:
from KratosMultiphysics.DamApplication import dam_initial_state_file
dam_initial_state_file.ValidateCombinedImports(
self.initial_state_import_processes)

# ExecuteBeforeSolutionLoop
for self.process in self.list_of_processes:
self.process.ExecuteBeforeSolutionLoop()
Expand Down
14 changes: 14 additions & 0 deletions kratos.gid/apps/Dam/write/write.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,20 @@ proc ::Dam::write::UpdateMaterials { } {

dict set matdict $mat CONSTITUTIVE_LAW_NAME $newconstlaw
}

# The Dam initial-state file format requires THICKNESS on 2D solid parts.
# Plane-strain laws do not define it themselves, so provide the standard
# unit thickness only when an initial-state transfer is enabled. This keeps
# unrelated analyses unchanged.
if {[Dam::write::IsInitialStateTransferEnabled] &&
[string match "2D*" [write::getValue nDim]]} {
foreach mat [dict keys $matdict] {
if {![dict exists $matdict $mat THICKNESS]} {
dict set matdict $mat THICKNESS 1.0
}
}
}

write::setMatDict $matdict
}

Expand Down
Loading