Skip to content

Commit b92cc87

Browse files
Elements can set the mesh quadratic type
1 parent fcbf507 commit b92cc87

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

kratos.gid/kratos.tcl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ namespace eval ::Kratos {
1111

1212
variable tmp_init_mesh_time
1313
variable namespaces
14+
15+
variable mesh_criteria_forced
1416
}
1517

1618
# Hard minimum GiD Version is 14
@@ -190,6 +192,9 @@ proc Kratos::InitGlobalVariables {dir} {
190192

191193
variable pip_packages_required
192194
set pip_packages_required [list KratosMultiphysics-all==9.4.2]
195+
196+
variable mesh_criteria_forced
197+
set mesh_criteria_forced [dict create]
193198
}
194199

195200
proc Kratos::LoadCommonScripts { } {
@@ -447,6 +452,10 @@ proc Kratos::Event_BeforeMeshGeneration {elementsize} {
447452
GiD_MeshData mesh_criteria to_be_meshed 2 surfaces [GiD_EntitiesGroups get $group surfaces]
448453
GiD_MeshData mesh_criteria to_be_meshed 2 volumes [GiD_EntitiesGroups get $group volumes]
449454
}
455+
456+
# Change the mesh settings depending on the element requirements
457+
catch {Kratos::SetMeshCriteria $elementsize}
458+
450459
# Maybe the current application needs to do some extra job
451460
set ret [apps::ExecuteOnCurrentApp BeforeMeshGeneration $elementsize]
452461
set endtime [clock seconds]
@@ -462,6 +471,10 @@ proc Kratos::Event_MeshProgress { total_percent partial_percents_0 partial_perce
462471

463472
proc Kratos::Event_AfterMeshGeneration {fail} {
464473
variable tmp_init_mesh_time
474+
475+
# Change the mesh settings depending on the element requirements. Reset previous settings
476+
catch {Kratos::ResetMeshCriteria $fail}
477+
465478
# Maybe the current application needs to do some extra job
466479
apps::ExecuteOnCurrentApp AfterMeshGeneration $fail
467480
set endtime [clock seconds]

kratos.gid/scripts/Utils.tcl

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,61 @@ proc Kratos::GetMeshBasicData { } {
291291
return $result
292292
}
293293

294+
proc Kratos::SetMeshCriteria { elementsize } {
295+
296+
set force_mesh_order [dict create]
297+
set elements_used [spdAux::GetUsedElements]
298+
set forced_mesh_order -1
299+
foreach element_id $elements_used {
300+
set element [Model::getElement $element_id]
301+
if {[$element hasAttribute "MeshOrder"]} {
302+
set element_forces [$element getAttribute "MeshOrder"]
303+
if {$element_forces eq "Quadratic"} {
304+
set element_forces 1
305+
} else {
306+
set element_forces 0
307+
}
308+
dict set force_mesh_order $element_id $element_forces
309+
if {$forced_mesh_order eq -1} {
310+
set forced_mesh_order $element_forces
311+
} else {
312+
if {$forced_mesh_order ne $element_forces} {
313+
# W "The element $element_id requires a different mesh order"
314+
error "Incompatible mesh orders in elements"
315+
}
316+
}
317+
}
318+
}
319+
320+
if {$forced_mesh_order ne -1} {
321+
322+
set previous_mesh_order [write::isquadratic]
323+
variable mesh_criteria_forced
324+
dict set mesh_criteria_forced "PreviousMeshOrder" [write::isquadratic]
325+
GiD_Set Model(QuadraticType) $forced_mesh_order
326+
set mesh_type "Quadratic"
327+
if {$forced_mesh_order eq 0} {
328+
set mesh_type "Linear"
329+
}
330+
::GidUtils::SetWarnLine "Setting mesh mode: $mesh_type"
331+
}
332+
}
333+
334+
335+
proc Kratos::ResetMeshCriteria { fail } {
336+
variable mesh_criteria_forced
337+
if {[dict exists $mesh_criteria_forced "PreviousMeshOrder"]} {
338+
set previous_mesh_order [dict get $mesh_criteria_forced "PreviousMeshOrder"]
339+
GiD_Set Model(QuadraticType) $previous_mesh_order
340+
set mesh_type "Quadratic"
341+
if {$previous_mesh_order eq 0} {
342+
set mesh_type "Linear"
343+
}
344+
::GidUtils::SetWarnLine "Restoring mesh mode: $mesh_type"
345+
dict unset mesh_criteria_forced "PreviousMeshOrder"
346+
}
347+
}
348+
294349
proc ? {question true_val false_val} {
295350
return [expr $question ? $true_val : $false_val]
296351
}

0 commit comments

Comments
 (0)