diff --git a/kratos.gid/apps/MPM/app.json b/kratos.gid/apps/MPM/app.json index bc699c40a..f3cc2b3db 100644 --- a/kratos.gid/apps/MPM/app.json +++ b/kratos.gid/apps/MPM/app.json @@ -42,7 +42,8 @@ "unique_names": { "parts": "MPMParts", "nodal_conditions": "MPMNodalConditions", - "conditions": "MPMLoads" + "conditions": "MPMLoads", + "initial_conditions": "MPMInitialConditions" }, "write": { "coordinates": "all", diff --git a/kratos.gid/apps/MPM/examples/CantileverBeam.tcl b/kratos.gid/apps/MPM/examples/CantileverBeam.tcl index ce4fcd84c..4b0fc76a1 100644 --- a/kratos.gid/apps/MPM/examples/CantileverBeam.tcl +++ b/kratos.gid/apps/MPM/examples/CantileverBeam.tcl @@ -153,8 +153,8 @@ proc ::MPM::examples::CantileverBeam::TreeAssignation2D {args} { # Solution strategy parameters spdAux::SetValueOnTreeItem v "0.01" MPTimeParameters DeltaTime spdAux::SetValueOnTreeItem v "10" MPTimeParameters EndTime - spdAux::SetValueOnTreeItem v "wtep" GiDOptions OutputControlType - spdAux::SetValueOnTreeItem v "0.1" GiDOptions OutputDeltaTime - spdAux::SetValueOnTreeItem v "time" VtkOptions OutputControlType - spdAux::SetValueOnTreeItem v "0.1" VtkOptions OutputDeltaTime + spdAux::SetValueOnTreeItem v "step" GiDOptions OutputControlType + spdAux::SetValueOnTreeItem v "1" GiDOptions OutputDeltaTime + spdAux::SetValueOnTreeItem v "step" VtkOptions OutputControlType + spdAux::SetValueOnTreeItem v "1" VtkOptions OutputDeltaTime } diff --git a/kratos.gid/apps/MPM/examples/FallingSandBall.tcl b/kratos.gid/apps/MPM/examples/FallingSandBall.tcl index ea02008e6..778ab1274 100644 --- a/kratos.gid/apps/MPM/examples/FallingSandBall.tcl +++ b/kratos.gid/apps/MPM/examples/FallingSandBall.tcl @@ -149,8 +149,8 @@ proc ::MPM::examples::FallingSandBall::TreeAssignation2D {args} { # Solution strategy parameters spdAux::SetValueOnTreeItem v "0.005" MPTimeParameters DeltaTime spdAux::SetValueOnTreeItem v "2" MPTimeParameters EndTime - spdAux::SetValueOnTreeItem v "time" GiDOptions OutputControlType - spdAux::SetValueOnTreeItem v "0.02" GiDOptions OutputDeltaTime - spdAux::SetValueOnTreeItem v "time" VtkOptions OutputControlType - spdAux::SetValueOnTreeItem v "0.02" VtkOptions OutputDeltaTime + spdAux::SetValueOnTreeItem v "step" GiDOptions OutputControlType + spdAux::SetValueOnTreeItem v "4" GiDOptions OutputDeltaTime + spdAux::SetValueOnTreeItem v "step" VtkOptions OutputControlType + spdAux::SetValueOnTreeItem v "4" VtkOptions OutputDeltaTime } diff --git a/kratos.gid/apps/MPM/examples/GranularFlow.tcl b/kratos.gid/apps/MPM/examples/GranularFlow.tcl index ada892092..1f9730a43 100644 --- a/kratos.gid/apps/MPM/examples/GranularFlow.tcl +++ b/kratos.gid/apps/MPM/examples/GranularFlow.tcl @@ -152,8 +152,8 @@ proc ::MPM::examples::GranularFlow::TreeAssignation2D {args} { # Solution strategy parameters spdAux::SetValueOnTreeItem v "0.00005" MPTimeParameters DeltaTime spdAux::SetValueOnTreeItem v "2" MPTimeParameters EndTime - spdAux::SetValueOnTreeItem v "time" GiDOptions OutputControlType - spdAux::SetValueOnTreeItem v "0.01" GiDOptions OutputDeltaTime - spdAux::SetValueOnTreeItem v "time" VtkOptions OutputControlType - spdAux::SetValueOnTreeItem v "0.01" VtkOptions OutputDeltaTime + spdAux::SetValueOnTreeItem v "step" GiDOptions OutputControlType + spdAux::SetValueOnTreeItem v "200" GiDOptions OutputDeltaTime + spdAux::SetValueOnTreeItem v "step" VtkOptions OutputControlType + spdAux::SetValueOnTreeItem v "200" VtkOptions OutputDeltaTime } diff --git a/kratos.gid/apps/MPM/examples/examples.tcl b/kratos.gid/apps/MPM/examples/examples.tcl index c9eafdaef..d18121a02 100644 --- a/kratos.gid/apps/MPM/examples/examples.tcl +++ b/kratos.gid/apps/MPM/examples/examples.tcl @@ -10,4 +10,4 @@ proc ::MPM::examples::ErasePreviousIntervals { } { foreach int [$root selectNodes "$interval_base/blockdata\[@n='Interval'\]"] { if {[$int @name] ni [list Initial Total Custom1]} {$int delete} } -} \ No newline at end of file +} diff --git a/kratos.gid/apps/MPM/write/write.tcl b/kratos.gid/apps/MPM/write/write.tcl index 4210306c7..36859d3a1 100644 --- a/kratos.gid/apps/MPM/write/write.tcl +++ b/kratos.gid/apps/MPM/write/write.tcl @@ -13,6 +13,7 @@ proc MPM::write::Init { } { SetAttribute parts_un [::MPM::GetUniqueName parts] SetAttribute nodal_conditions_un [::MPM:::GetUniqueName nodal_conditions] SetAttribute conditions_un [::MPM::GetUniqueName conditions] + SetAttribute initial_conditions_un [::MPM::GetUniqueName initial_conditions] SetAttribute writeCoordinatesByGroups [::MPM::GetWriteProperty coordinates] SetAttribute main_launch_file [::MPM::GetAttribute main_launch_file] diff --git a/kratos.gid/apps/MPM/write/writeGrid.tcl b/kratos.gid/apps/MPM/write/writeGrid.tcl index 7b81993ad..8e2d07877 100644 --- a/kratos.gid/apps/MPM/write/writeGrid.tcl +++ b/kratos.gid/apps/MPM/write/writeGrid.tcl @@ -13,6 +13,8 @@ proc MPM::write::WriteGridMDPA { } { # Write conditions ::write::writeGeometryConnectivities [::write::GetGroupsAssignedIn [GetAttribute conditions_un]] + MPM::write::ResetNonConformingPointGeometryIds + MPM::write::writePointGeometriesFromNodes [MPM::write::GetNonConformingPointLoadGeometryGroups] # Write Submodelparts writeSubmodelparts grid @@ -21,11 +23,38 @@ proc MPM::write::WriteGridMDPA { } { } proc MPM::write::writeConditionsSubmodelparts { } { + set processed_groups [list ] + + foreach gNode [MPM::write::GetNonConformingPointLoadGeometryGroups] { + set group [get_domnode_attribute $gNode n] + set group [write::GetWriteGroupName $group] + if {$group in $processed_groups} { + continue + } + lappend processed_groups $group + write::writeGroupSubModelPartAsGeometry $group 1 1 [MPM::write::GetNonConformingPointGeometryIdsForGroup $group] + } + foreach group [MPM::write::GetConditionsGroups] { + if {$group in $processed_groups} { + continue + } + lappend processed_groups $group write::writeGroupSubModelPartAsGeometry $group } - foreach group [MPM::write::GetNodalConditionsGroups] { - write::writeGroupSubModelPartAsGeometry $group 0 + + foreach gNode [::write::GetGroupsAssignedIn [GetAttribute nodal_conditions_un]] { + set group [get_domnode_attribute $gNode n] + set group [write::GetWriteGroupName $group] + if {$group in $processed_groups} { + continue + } + lappend processed_groups $group + if {[MPM::write::IsNonConformingPointLoadGroup $gNode]} { + write::writeGroupSubModelPartAsGeometry $group 1 1 [MPM::write::GetNonConformingPointGeometryIdsForGroup $group] + } else { + write::writeGroupSubModelPartAsGeometry $group 0 + } } } @@ -33,7 +62,132 @@ proc MPM::write::GetNodalConditionsGroups { } { set groups [::write::GetGroupsNamesAssignedIn [GetAttribute nodal_conditions_un]] return $groups } + +proc MPM::write::GetNonConformingPointLoadGeometryGroups { } { + set non_conforming_point_load_groups [list ] + foreach un [list [GetAttribute conditions_un] [GetAttribute nodal_conditions_un]] { + foreach gNode [::write::GetGroupsAssignedIn $un] { + if {[MPM::write::IsNonConformingPointLoadGroup $gNode]} { + lappend non_conforming_point_load_groups $gNode + } + } + } + return $non_conforming_point_load_groups +} + +proc MPM::write::GetNonConformingPointLoadGeometryGroupNames { } { + set groups [list ] + foreach gNode [MPM::write::GetNonConformingPointLoadGeometryGroups] { + set group_name [get_domnode_attribute $gNode n] + set group_name [write::GetWriteGroupName $group_name] + if {$group_name ni $groups} { + lappend groups $group_name + } + } + return $groups +} + +proc MPM::write::writePointGeometriesFromNodes { group_list } { + set processed_groups [list ] + foreach gNode $group_list { + set group [get_domnode_attribute $gNode n] + set group [write::GetWriteGroupName $group] + if {$group in $processed_groups} { + continue + } + lappend processed_groups $group + MPM::write::writePointGeometryFromGroupNodes $group + } +} + +proc MPM::write::writePointGeometryFromGroupNodes { group } { + set geometry_ids_by_node [MPM::write::EnsureNonConformingPointGeometryIdsForGroup $group] + if {[dict size $geometry_ids_by_node] < 1} { + return + } + + set nDim $::Model::SpatialDimension + if {$nDim eq "2Da"} { + set nDim "2D" + } + + set s [::write::mdpaIndent] + ::write::WriteString "${s}Begin Geometries Point${nDim} // GUI group identifier: $group" + incr ::write::current_mdpa_indent_level + set s1 [::write::mdpaIndent] + foreach node_id [lsort -integer [dict keys $geometry_ids_by_node]] { + set geometry_id [dict get $geometry_ids_by_node $node_id] + ::write::WriteString "${s1}$geometry_id $node_id" + } + incr ::write::current_mdpa_indent_level -1 + ::write::WriteString "${s}End Geometries" + ::write::WriteString "" +} + +proc MPM::write::ResetNonConformingPointGeometryIds { } { + variable non_conforming_point_geometry_ids_by_group + variable next_non_conforming_point_geometry_id + + set non_conforming_point_geometry_ids_by_group [dict create] + set next_non_conforming_point_geometry_id [expr {[GiD_Info Mesh MaxNumElements] + 1}] +} + +proc MPM::write::EnsureNonConformingPointGeometryIdsForGroup { group } { + variable non_conforming_point_geometry_ids_by_group + variable next_non_conforming_point_geometry_id + + if {![info exists non_conforming_point_geometry_ids_by_group] || ![info exists next_non_conforming_point_geometry_id]} { + MPM::write::ResetNonConformingPointGeometryIds + } + + set group [write::GetWriteGroupName $group] + if {[dict exists $non_conforming_point_geometry_ids_by_group $group]} { + return [dict get $non_conforming_point_geometry_ids_by_group $group] + } + + set geometry_ids_by_node [dict create] + foreach node_id [lsort -integer [GiD_EntitiesGroups get $group nodes]] { + dict set geometry_ids_by_node $node_id $next_non_conforming_point_geometry_id + incr next_non_conforming_point_geometry_id + } + dict set non_conforming_point_geometry_ids_by_group $group $geometry_ids_by_node + return $geometry_ids_by_node +} + +proc MPM::write::GetNonConformingPointGeometryIdsForGroup { group } { + set geometry_ids_by_node [MPM::write::EnsureNonConformingPointGeometryIdsForGroup $group] + set geometry_ids [list ] + foreach node_id [lsort -integer [dict keys $geometry_ids_by_node]] { + lappend geometry_ids [dict get $geometry_ids_by_node $node_id] + } + return $geometry_ids +} + +proc MPM::write::IsNonConformingPointLoadGroup { gNode } { + set cond_id [get_domnode_attribute [$gNode parent] n] + if {$cond_id in [list PointLoad2DMPM PointLoad3DMPM]} { + return 1 + } + + set group_name [get_domnode_attribute $gNode n] + if {[string match "Nonconforming Point Load*" $group_name] || [string match "Non-Conforming Load on points*" $group_name]} { + return 1 + } + + set condition [Model::getCondition $cond_id] + if {$condition eq ""} { + set condition [Model::getNodalConditionbyId $cond_id] + } + if {$condition eq "" || ![$condition hasAttribute ElementType] || ![$condition hasAttribute ProcessName]} { + return 0 + } + return [expr { + "Point" in [$condition getAttribute ElementType] + && "ApplyMPMParticleNeumannConditionProcess" in [$condition getAttribute ProcessName] + }] +} + proc MPM::write::GetConditionsGroups { } { set groups [::write::GetGroupsNamesAssignedIn [GetAttribute conditions_un]] return $groups -} \ No newline at end of file +} diff --git a/kratos.gid/apps/MPM/write/writeProjectParameters.tcl b/kratos.gid/apps/MPM/write/writeProjectParameters.tcl index 07a7702b5..c934ed292 100644 --- a/kratos.gid/apps/MPM/write/writeProjectParameters.tcl +++ b/kratos.gid/apps/MPM/write/writeProjectParameters.tcl @@ -36,21 +36,20 @@ proc ::MPM::write::getParametersDict { } { } # Pressure dofs - set check_list [list "MPMUpdatedLagrangianUP2D" "MPMUpdatedLagrangianUP3D"] - foreach elem $check_list { + foreach elem [MPM::write::GetMixedUPElements] { if {$elem in [MPM::write::GetUsedElements Name]} { dict set project_parameters_dict solver_settings pressure_dofs true set active_stab [write::getValue STStratParams ActivateStabilization] if {$active_stab eq "Off"} { dict set project_parameters_dict solver_settings stabilization "none" } else { - dict set project_parameters_dict solver_settings stabilization "ppp" + set stab_type [write::getValue STStratParams stabilization] + dict set project_parameters_dict solver_settings stabilization $stab_type } dict unset project_parameters_dict solver_settings ActivateStabilization break } else { dict set project_parameters_dict solver_settings pressure_dofs false - dict unset project_parameters_dict solver_settings activate_stabilization dict unset project_parameters_dict solver_settings stabilization } } @@ -71,13 +70,14 @@ proc ::MPM::write::getParametersDict { } { set solverSettingsDict [dict merge $solverSettingsDict [write::getSolversParametersDict MPM] ] dict lappend solverSettingsDict auxiliary_variables_list RAYLEIGH_ALPHA dict set project_parameters_dict solver_settings $solverSettingsDict - + # Move slip to constraints set slip_process_list [list ] set new_load_process_list [list ] set load_process_list [dict get $project_parameters_dict processes loads_process_list] foreach load $load_process_list { if {[dict get $load python_module] eq "apply_mpm_slip_boundary_process"} { + set load [MPM::write::CleanSlipBoundaryProcess $load] lappend slip_process_list $load } else { lappend new_load_process_list $load @@ -85,6 +85,14 @@ proc ::MPM::write::getParametersDict { } { } dict set project_parameters_dict processes loads_process_list $new_load_process_list dict set project_parameters_dict processes list_other_processes $slip_process_list + + # Initial Conditions + set previous_mpn [write::GetConfigurationAttribute model_part_name] + write::SetConfigurationAttribute model_part_name MPM_Material + set initial_conditions_list [write::getConditionsParametersDict [GetAttribute initial_conditions_un] "Nodal"] + dict set project_parameters_dict processes initial_conditions_processes $initial_conditions_list + #dict set project_parameters_dict processes initial_conditions_processes $initial_conditions_list Parameteres model_part_name MPM_Material + write::SetConfigurationAttribute model_part_name $previous_mpn # Gravity set activate_gravity [write::getValue ActivateGravity] @@ -103,6 +111,86 @@ proc ::MPM::write::getParametersDict { } { dict set project_parameters_dict processes gravity [list $gravity_dict] } + # Body acceleration + set activate_body_acceleration [write::getValue ActivateBodyAcceleration] + if {$activate_body_acceleration eq "On"} { + set body_acceleration_dict [dict create ] + dict set body_acceleration_dict python_module assign_body_acceleration_to_material_point_process + dict set body_acceleration_dict kratos_module "KratosMultiphysics.MPMApplication" + dict set body_acceleration_dict process_name AssignBodyAccelerationToMaterialPointProcess + set body_acceleration_parameters_dict [dict create ] + dict set body_acceleration_parameters_dict model_part_name MPM_Material + dict set body_acceleration_parameters_dict variable_name MP_VOLUME_ACCELERATION + dict set body_acceleration_parameters_dict modulus [write::getValue MPMBodyAcceleration modulus] + dict set body_acceleration_parameters_dict component [MPM::write::GetBodyAccelerationComponent] + dict set body_acceleration_parameters_dict set_initial_mp_acceleration [MPM::write::GetBodyAccelerationInitialFlag] + dict set body_acceleration_dict Parameters $body_acceleration_parameters_dict + set list_other_processes [dict get $project_parameters_dict processes list_other_processes] + lappend list_other_processes $body_acceleration_dict + dict set project_parameters_dict processes list_other_processes $list_other_processes + } + + + # Tracking of mp points + lassign [write::getValue MPTracking ActivateTracking] track + if {$track eq "On"} { + set tracking_dict [dict create ] + dict set tracking_dict python_module mpm_point_output_process + dict set tracking_dict kratos_module "KratosMultiphysics.MPMApplication" + dict set tracking_dict process_name MPMPointOutputProcess + set tracking_parameters_dict [dict create ] + dict set tracking_parameters_dict model_part_name MPM_Material + lassign [write::getValue MPTracking position] dx dy dz + dict set tracking_parameters_dict position [list [expr $dx] [expr $dy] [expr $dz]] + lassign [write::getValue MPTracking interval] t0 tf + dict set tracking_parameters_dict interval [list [expr $t0] [expr $tf]] + lassign [write::getValue MPTracking output_press] press + if {$press eq "Yes" && [MPM::write::UsesMixedUPElements]} { + dict set tracking_parameters_dict output_pressure true + } else { + dict set tracking_parameters_dict output_pressure false + } + dict set tracking_parameters_dict print_format [write::getValue MPTracking print_format] + dict set tracking_parameters_dict write_tracking_output_file true + set output_file_settings_dict [dict create ] + dict set output_file_settings_dict file_name "MP_tracking.dat" + dict set tracking_parameters_dict output_file_settings $output_file_settings_dict + dict set tracking_dict Parameters $tracking_parameters_dict + dict set project_parameters_dict processes mp_tracking [list $tracking_dict] + } + + + + # Tracking of Grid points + lassign [write::getValue GridTracking ActivateTrackingGrid] track + if {$track eq "On"} { + set tracking_dict [dict create ] + dict set tracking_dict python_module point_output_process + dict set tracking_dict kratos_module "KratosMultiphysics" + dict set tracking_dict process_name PointOutputProcess + set tracking_parameters_dict [dict create ] + dict set tracking_parameters_dict model_part_name Background_Grid + lassign [write::getValue GridTracking positionGrid] dx dy dz + dict set tracking_parameters_dict position [list [expr $dx] [expr $dy] [expr $dz]] + lassign [write::getValue GridTracking intervalGrid] t0 tf + dict set tracking_parameters_dict interval [list [expr $t0] [expr $tf]] + + dict set tracking_parameters_dict print_format [write::getValue GridTracking print_formatGrid] + dict set tracking_parameters_dict entity_type element + dict set tracking_parameters_dict search_configuration initial + set grid_tracking_output_variables [list "DISPLACEMENT" "VELOCITY"] + lassign [write::getValue GridTracking output_pressGrid] press + if {$press eq "Yes" && [MPM::write::UsesMixedUPElements]} { + lappend grid_tracking_output_variables "PRESSURE" + } + dict set tracking_parameters_dict output_variables $grid_tracking_output_variables + set output_file_settings_dict [dict create ] + dict set output_file_settings_dict file_name "Grid_point_tracking.dat" + dict set tracking_parameters_dict output_file_settings $output_file_settings_dict + dict set tracking_dict Parameters $tracking_parameters_dict + dict set project_parameters_dict processes grid_point_tracking [list $tracking_dict] + } + # Output processes dict set project_parameters_dict output_processes [MPM::write::GetOutputProcessesList] @@ -211,9 +299,18 @@ proc ::MPM::write::GetOutputProcessesList { } { dict unset project_parameters_dict output_processes vtk_output dict unset grid_output_configuration_dict Parameters gauss_point_results - # Append the fluid and solid output processes to the output processes list - lappend vtk_output_processes_list $grid_output_configuration_dict - lappend vtk_output_processes_list $body_output_configuration_dict + # Append only the VTK output processes selected in Results > Vtk-Output. + set vtk_output_processes_list [list] + set vtk_print_option [write::getValue VtkOptions PrintOption] + if {$vtk_print_option eq ""} { + set vtk_print_option "body" + } + if {$vtk_print_option eq "grid" || $vtk_print_option eq "both"} { + lappend vtk_output_processes_list $grid_output_configuration_dict + } + if {$vtk_print_option eq "body" || $vtk_print_option eq "both"} { + lappend vtk_output_processes_list $body_output_configuration_dict + } dict set output_process vtk_output_processes $vtk_output_processes_list @@ -271,10 +368,61 @@ proc ::MPM::write::GetOutputProcessesList { } { dict set output_process mpm_energy_output [list $energy_dict] } + # Height output + lassign [write::getValue HeightOutput EnableHeightOutput] height_output + if {$height_output eq "Yes"} { + set height_dict [dict create ] + dict set height_dict python_module mpm_particle_height_output_process + dict set height_dict kratos_module "KratosMultiphysics.MPMApplication" + dict set height_dict process_name MPMParticleHeightOutputProcess + + set height_parameters_dict [dict create ] + dict set height_parameters_dict model_part_name "MPM_Material" + dict set height_parameters_dict background_grid_model_part_name "Background_Grid" + dict set height_parameters_dict sensor_positions [MPM::write::GetHeightSensorPositions] + lassign [write::getValue HeightOptions MeasuringDirection] dx dy dz + dict set height_parameters_dict measuring_direction [list [expr $dx] [expr $dy] [expr $dz]] + dict set height_parameters_dict search_radius_factor [expr [write::getValue HeightOptions SearchRadiusFactor]] + dict set height_parameters_dict print_format [write::getValue HeightOptions PrintFormat] + + set output_file_settings_dict [dict create ] + dict set output_file_settings_dict file_name [write::getValue HeightOutputFileSettings FileName] + dict set height_parameters_dict output_file_settings $output_file_settings_dict + + dict set height_dict Parameters $height_parameters_dict + dict set output_process height_output_process [list $height_dict] + } + return $output_process } +proc ::MPM::write::GetHeightSensorPositions { } { + set sensor_positions [list] + set number_of_sensors [write::getValue HeightSensors NumberOfSensors] + if {$number_of_sensors eq ""} { + set number_of_sensors 1 + } + for {set i 1} {$i <= $number_of_sensors} {incr i} { + lassign [write::getValue HeightSensors SensorPosition$i] dx dy dz + lappend sensor_positions [list [expr $dx] [expr $dy] [expr $dz]] + } + return $sensor_positions +} + +proc ::MPM::write::GetMixedUPElements { } { + return [list "MPMUpdatedLagrangianUP2D" "MPMUpdatedLagrangianUP3D"] +} + +proc ::MPM::write::UsesMixedUPElements { } { + foreach elem [MPM::write::GetMixedUPElements] { + if {$elem in [MPM::write::GetUsedElements Name]} { + return true + } + } + return false +} + proc ::MPM::write::getModelersParametersList { old_modelers } { set body_groups [MPM::write::GetPartsGroupsNames Body] @@ -327,5 +475,53 @@ proc ::MPM::write::writeParametersEvent { } { write::WriteJSON [getParametersDict] } +proc ::MPM::write::CleanSlipBoundaryProcess { slip_process_dict } { + if {![dict exists $slip_process_dict Parameters]} { + return $slip_process_dict + } + set friction "Off" + if {[dict exists $slip_process_dict Parameters Friction]} { + set friction [dict get $slip_process_dict Parameters Friction] + dict unset slip_process_dict Parameters Friction + } + if {$friction ne "On"} { + foreach parameter_name [list friction_coefficient tangential_penalty_factor option] { + if {[dict exists $slip_process_dict Parameters $parameter_name]} { + dict unset slip_process_dict Parameters $parameter_name + } + } + return $slip_process_dict + } + + if {[dict exists $slip_process_dict Parameters option]} { + set option [dict get $slip_process_dict Parameters option] + if {$option eq "" || $option eq "none"} { + dict unset slip_process_dict Parameters option + } + } + + return $slip_process_dict +} + +proc ::MPM::write::GetBodyAccelerationComponent { } { + set component [list ] + foreach direction [list X Y Z] { + set selector [write::getValue MPMBodyAcceleration selector_component_$direction] + if {$selector eq "ByFunction"} { + lappend component [write::getValue MPMBodyAcceleration function_component_$direction] + } else { + lappend component [expr [write::getValue MPMBodyAcceleration value_component_$direction]] + } + } + return $component +} + +proc ::MPM::write::GetBodyAccelerationInitialFlag { } { + set initial_acceleration [write::getValue MPMBodyAcceleration InitialAcceleration] + if {$initial_acceleration eq "On"} { + return true + } + return false +} diff --git a/kratos.gid/apps/MPM/xml/BodyAcceleration.spd b/kratos.gid/apps/MPM/xml/BodyAcceleration.spd new file mode 100644 index 000000000..005bb0406 --- /dev/null +++ b/kratos.gid/apps/MPM/xml/BodyAcceleration.spd @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kratos.gid/apps/MPM/xml/BoundaryConditions.spd b/kratos.gid/apps/MPM/xml/BoundaryConditions.spd index c33eca7ec..a8cd99315 100644 --- a/kratos.gid/apps/MPM/xml/BoundaryConditions.spd +++ b/kratos.gid/apps/MPM/xml/BoundaryConditions.spd @@ -1,5 +1,5 @@ - - + + diff --git a/kratos.gid/apps/MPM/xml/Conditions.xml b/kratos.gid/apps/MPM/xml/Conditions.xml index f59bab02e..468416d9c 100644 --- a/kratos.gid/apps/MPM/xml/Conditions.xml +++ b/kratos.gid/apps/MPM/xml/Conditions.xml @@ -118,6 +118,20 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kratos.gid/apps/MPM/xml/ConstitutiveLaws.xml b/kratos.gid/apps/MPM/xml/ConstitutiveLaws.xml index 27c9bd31a..0a0ca7958 100644 --- a/kratos.gid/apps/MPM/xml/ConstitutiveLaws.xml +++ b/kratos.gid/apps/MPM/xml/ConstitutiveLaws.xml @@ -139,6 +139,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -242,7 +266,6 @@ - @@ -251,4 +274,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/kratos.gid/apps/MPM/xml/InitialConditions.spd b/kratos.gid/apps/MPM/xml/InitialConditions.spd new file mode 100644 index 000000000..a91ce3578 --- /dev/null +++ b/kratos.gid/apps/MPM/xml/InitialConditions.spd @@ -0,0 +1,4 @@ + + + + diff --git a/kratos.gid/apps/MPM/xml/Loads.spd b/kratos.gid/apps/MPM/xml/Loads.spd new file mode 100644 index 000000000..6485615ac --- /dev/null +++ b/kratos.gid/apps/MPM/xml/Loads.spd @@ -0,0 +1,4 @@ + + + + diff --git a/kratos.gid/apps/MPM/xml/Main.spd b/kratos.gid/apps/MPM/xml/Main.spd index 3d237ffa4..4a1efde91 100644 --- a/kratos.gid/apps/MPM/xml/Main.spd +++ b/kratos.gid/apps/MPM/xml/Main.spd @@ -2,6 +2,7 @@ + diff --git a/kratos.gid/apps/MPM/xml/NodalConditions.xml b/kratos.gid/apps/MPM/xml/NodalConditions.xml index 20d196c69..0a5b77f17 100644 --- a/kratos.gid/apps/MPM/xml/NodalConditions.xml +++ b/kratos.gid/apps/MPM/xml/NodalConditions.xml @@ -4,12 +4,14 @@ - + - + + + diff --git a/kratos.gid/apps/MPM/xml/NonConformingBoundaryConditions.spd b/kratos.gid/apps/MPM/xml/NonConformingBoundaryConditions.spd new file mode 100644 index 000000000..9143b4828 --- /dev/null +++ b/kratos.gid/apps/MPM/xml/NonConformingBoundaryConditions.spd @@ -0,0 +1,4 @@ + + + + diff --git a/kratos.gid/apps/MPM/xml/Processes.xml b/kratos.gid/apps/MPM/xml/Processes.xml index c9dbd5bd1..d5b90d6f6 100644 --- a/kratos.gid/apps/MPM/xml/Processes.xml +++ b/kratos.gid/apps/MPM/xml/Processes.xml @@ -11,8 +11,37 @@ + + + + + - + + + + + + + + + + + + + + + + + + + + + + diff --git a/kratos.gid/apps/MPM/xml/Procs.spd b/kratos.gid/apps/MPM/xml/Procs.spd index ed10ed442..bc10dc0d6 100644 --- a/kratos.gid/apps/MPM/xml/Procs.spd +++ b/kratos.gid/apps/MPM/xml/Procs.spd @@ -1,12 +1,6 @@ - - - - + + + + + + + + + + + + - + @@ -40,6 +40,7 @@ + @@ -50,6 +51,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kratos.gid/apps/MPM/xml/SolutionStrategy.spd b/kratos.gid/apps/MPM/xml/SolutionStrategy.spd index 7006a6400..68c4ec101 100644 --- a/kratos.gid/apps/MPM/xml/SolutionStrategy.spd +++ b/kratos.gid/apps/MPM/xml/SolutionStrategy.spd @@ -8,10 +8,11 @@ - - + + + diff --git a/kratos.gid/apps/MPM/xml/Strategies.xml b/kratos.gid/apps/MPM/xml/Strategies.xml index 58c2d46b9..a8f67d245 100644 --- a/kratos.gid/apps/MPM/xml/Strategies.xml +++ b/kratos.gid/apps/MPM/xml/Strategies.xml @@ -1,6 +1,6 @@ - + @@ -29,7 +29,7 @@ - + diff --git a/kratos.gid/apps/MPM/xml/XmlController.tcl b/kratos.gid/apps/MPM/xml/XmlController.tcl index dbfc401e6..834fbbc40 100644 --- a/kratos.gid/apps/MPM/xml/XmlController.tcl +++ b/kratos.gid/apps/MPM/xml/XmlController.tcl @@ -46,17 +46,28 @@ proc MPM::xml::Init { } { } - -proc MPM::xml::MultiAppEvent {args} { - if {$args eq "init"} { - spdAux::parseRoutes - spdAux::ConvertAllUniqueNames ST MPM - } +proc ::MPM::xml::ProcGetSolutionStrategiesMPM { domNode args } { + set names "" + set pnames "" + set solutionType [get_domnode_attribute [$domNode selectNodes [spdAux::getRoute STSoluType]] v] + set Sols [::Model::GetSolutionStrategies [list "SolutionType" $solutionType] ] + set ids [list ] + foreach ss $Sols { + lappend ids [$ss getName] + append names [$ss getName] "," + append pnames [$ss getName] "," [$ss getPublicName] "," + } + set names [string range $names 0 end-1] + set pnames [string range $pnames 0 end-1] + + $domNode setAttribute values $names + set dv [lindex $ids 0] + if {[$domNode getAttribute v] eq ""} {$domNode setAttribute v $dv} + if {[$domNode getAttribute v] ni $ids} {$domNode setAttribute v $dv} + #spdAux::RequestRefresh + return $pnames } -proc MPM::xml::getUniqueName {name} { - return MPM${name} -} proc ::MPM::xml::ProcCheckNodalConditionStateMPM {domNode args} { return [MPM::xml::CheckNodalConditionStateById [$domNode @n] $domNode] @@ -87,6 +98,17 @@ proc MPM::xml::CheckNodalConditionStateById {conditionId domNode} { return "normal" } +proc MPM::xml::MultiAppEvent {args} { + if {$args eq "init"} { + spdAux::parseRoutes + spdAux::ConvertAllUniqueNames ST MPM + } +} + +proc MPM::xml::getUniqueName {name} { + return MPM${name} +} + proc MPM::xml::CustomTree { args } { # spdAux::SetValueOnTreeItem v "time" Results OutputControlType @@ -114,7 +136,7 @@ proc MPM::xml::ProcCheckGeometry {domNode args} { proc MPM::xml::ProcCheckActivateStabilizationState {domNode args} { set ret "hidden" - set up_mixed UpdatedLagrangianUP$::Model::SpatialDimension + set up_mixed MPMUpdatedLagrangianUP$::Model::SpatialDimension set used_elements [::MPM::write::GetUsedElements Name] if {$up_mixed in $used_elements} { set ret "normal" @@ -132,6 +154,48 @@ proc MPM::xml::ProcCheckStabilizationState {domNode args} { return $ret } +proc MPM::xml::ProcCheckGridTrackingPressureState {domNode args} { + set tracking_state [write::getValue GridTracking ActivateTrackingGrid] + if {$tracking_state ne "On"} { + return "hidden" + } + + set used_elements [::MPM::write::GetUsedElements Name] + foreach up_mixed [list MPMUpdatedLagrangianUP2D MPMUpdatedLagrangianUP3D] { + if {$up_mixed in $used_elements} { + return "normal" + } + } + return "hidden" +} + +proc MPM::xml::ProcCheckMPTrackingPressureState {domNode args} { + set tracking_state [write::getValue MPTracking ActivateTracking] + if {$tracking_state ne "On"} { + return "hidden" + } + + set used_elements [::MPM::write::GetUsedElements Name] + foreach up_mixed [list MPMUpdatedLagrangianUP2D MPMUpdatedLagrangianUP3D] { + if {$up_mixed in $used_elements} { + return "normal" + } + } + return "hidden" +} + +proc MPM::xml::ProcCheckHeightSensorState {domNode args} { + set sensor_index [lindex $args 0] + set number_of_sensors [write::getValue HeightSensors NumberOfSensors] + if {$number_of_sensors eq ""} { + set number_of_sensors 1 + } + if {$sensor_index <= $number_of_sensors} { + return "normal" + } + return "hidden" +} + proc MPM::xml::UsesMixedUPElements { } { foreach elem [::MPM::write::GetUsedElements Name] { if {$elem in [list MPMUpdatedLagrangianUP2D MPMUpdatedLagrangianUP3D]} { @@ -157,6 +221,10 @@ proc MPM::xml::ProcCheckNodalConditionOutputState {domNode args} { return "hidden" } + if {$outputId eq "REACTION"} { + $domNode setAttribute v No + } + return [MPM::xml::CheckNodalConditionStateById $conditionId $domNode] } diff --git a/kratos.gid/apps/Structural/xml/Strategies.xml b/kratos.gid/apps/Structural/xml/Strategies.xml index c61617adc..31218d8e6 100644 --- a/kratos.gid/apps/Structural/xml/Strategies.xml +++ b/kratos.gid/apps/Structural/xml/Strategies.xml @@ -103,4 +103,4 @@ - \ No newline at end of file + diff --git a/kratos.gid/scripts/Writing/WriteProjectParameters.tcl b/kratos.gid/scripts/Writing/WriteProjectParameters.tcl index 104737bf9..c4500e93a 100644 --- a/kratos.gid/scripts/Writing/WriteProjectParameters.tcl +++ b/kratos.gid/scripts/Writing/WriteProjectParameters.tcl @@ -733,4 +733,4 @@ proc write::GetModelPartNameFromParentTree { group {stage ""} } { incr safety } return $modelpart_name -} \ No newline at end of file +} diff --git a/kratos.gid/scripts/Writing/WriteSubModelPart.tcl b/kratos.gid/scripts/Writing/WriteSubModelPart.tcl index 3e34301d6..b4c735629 100644 --- a/kratos.gid/scripts/Writing/WriteSubModelPart.tcl +++ b/kratos.gid/scripts/Writing/WriteSubModelPart.tcl @@ -70,7 +70,7 @@ proc write::writeGroupSubModelPart { cid group {what "Elements"} {iniend ""} {ta } # -proc write::writeGroupSubModelPartAsGeometry { group { write_geometries 1} } { +proc write::writeGroupSubModelPartAsGeometry { group { write_geometries 1} { geometries_from_nodes 0 } { geometry_ids "" } } { variable submodelparts variable formats_dict variable geometry_cnd_name @@ -109,7 +109,17 @@ proc write::writeGroupSubModelPartAsGeometry { group { write_geometries 1} } { if {$write_geometries} { # Print geometries only if requested, so conditions with no topology features are not printed WriteString "${s1}Begin SubModelPartGeometries" - GiD_WriteCalculationFile elements -sorted $gdict + if {$geometry_ids ne ""} { + foreach geometry_id $geometry_ids { + WriteString "${s2}[format $id_f $geometry_id]" + } + } elseif {$geometries_from_nodes} { + foreach node_id [lsort -integer [GiD_EntitiesGroups get $group nodes]] { + WriteString "${s2}[format $id_f $node_id]" + } + } else { + GiD_WriteCalculationFile elements -sorted $gdict + } WriteString "${s1}End SubModelPartGeometries" } @@ -263,4 +273,4 @@ proc write::getSubModelPartId {cid group} { return 0 } } -} \ No newline at end of file +}