Skip to content

Commit 39dae5e

Browse files
Merge pull request #781 from KratosMultiphysics/feature/increase-logs
Feature/increase logs
2 parents 5f11148 + 7b5b1bd commit 39dae5e

9 files changed

Lines changed: 188 additions & 53 deletions

File tree

kratos.gid/apps/FSI/examples/examples.tcl

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,4 @@ proc FSI::examples::Init { } {
88
uplevel #0 [list source [file join $::FSI::dir examples HighRiseBuilding.tcl]]
99
}
1010

11-
proc FSI::examples::UpdateMenus { } {
12-
set menu_id 7
13-
GiDMenu::InsertOption "Kratos" [list "Mok - Channel with flexible wall" ] [incr menu_id] PRE [list ::FSI::examples::MokChannelFlexibleWall] "" "" insertbefore =
14-
if {$::Model::SpatialDimension eq "2D"} {
15-
GiDMenu::InsertOption "Kratos" [list "Turek benchmark" ] [incr menu_id] PRE [list ::FSI::examples::TurekBenchmark] "" "" insertbefore =
16-
GiDMenu::InsertOption "Kratos" [list "High-rise building" ] [incr menu_id] PRE [list ::FSI::examples::HighRiseBuilding] "" "" insertbefore =
17-
}
18-
GiDMenu::InsertOption "Kratos" [list "---"] [incr menu_id] PRE "" "" "" insertbefore =
19-
GiDMenu::UpdateMenus
20-
}
21-
2211
FSI::examples::Init

kratos.gid/apps/FSI/start.tcl

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,6 @@ proc ::FSI::LoadMyFiles { } {
4545
uplevel #0 [list source [file join $FSI::dir examples examples.tcl]]
4646
}
4747

48-
proc ::FSI::CustomMenus { } {
49-
FSI::examples::UpdateMenus
50-
}
51-
5248
proc ::FSI::GetAttribute {name} {
5349
variable attributes
5450
set value ""

kratos.gid/kratos.tcl

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ namespace eval Kratos {
88

99
variable must_write_calc_data
1010
variable must_exist_calc_data
11+
12+
variable tmp_init_mesh_time
1113
}
1214

1315
# Hard minimum GiD Version is 14
@@ -80,6 +82,7 @@ proc Kratos::RegisterGiDEvents { } {
8082

8183
# Preferences window
8284
GiD_RegisterPluginPreferencesProc Kratos::Event_ModifyPreferencesWindow
85+
CreateWidgetsFromXml::ClearCachePreferences
8386
}
8487

8588
proc Kratos::Event_InitProblemtype { dir } {
@@ -140,6 +143,14 @@ proc Kratos::InitGlobalVariables {dir} {
140143
set kratos_private(echo_level) 0
141144
# indent in mdpa files | 0 ASCII unindented | 1 ASCII indented pretty
142145
set kratos_private(mdpa_format) 1
146+
# Version of the kratos executable
147+
set kratos_private(exec_version) "dev"
148+
# Allow logs -> 0 No | 1 Only local | 2 Share with dev team
149+
set Kratos::kratos_private(allow_logs) 1
150+
# git hash of the problemtype
151+
set Kratos::kratos_private(problemtype_git_hash) 0
152+
# Place were the logs will be placed
153+
set Kratos::kratos_private(model_log_folder) ""
143154

144155
# Variable to store the Kratos menu items
145156
set kratos_private(MenuItems) [dict create]
@@ -190,6 +201,10 @@ proc Kratos::LoadCommonScripts { } {
190201
}
191202

192203
proc Kratos::Event_LoadModelSPD { filespd } {
204+
after 1 [list Kratos::LoadModelSPD $filespd]
205+
}
206+
207+
proc Kratos::LoadModelSPD { filespd } {
193208
variable kratos_private
194209

195210
# Event called if a model exists, so close all the windows while tree isn't loaded
@@ -214,6 +229,8 @@ proc Kratos::Event_LoadModelSPD { filespd } {
214229
set old_doc [gid_groups_conds::open_XML_file_gzip $filespd]
215230
set old_root [$old_doc documentElement]
216231
set old_versionData [$old_root @version]
232+
set version_data [dict create model_version $old_versionData ]
233+
Kratos::Log "Load model -> [write::tcl2json $version_data]"
217234

218235
# Compare the version number
219236
if { [package vcompare $versionPT $old_versionData] != 0 } {
@@ -244,15 +261,23 @@ proc Kratos::Event_LoadModelSPD { filespd } {
244261

245262
# Open the tree
246263
spdAux::OpenTree
264+
265+
after 500 {set ::Kratos::kratos_private(model_log_folder) [file join [GiD_Info Project ModelName].gid Logs]}
247266
}
267+
248268
}
249269

250270
proc Kratos::Event_EndProblemtype { } {
271+
Kratos::Log "End session"
251272
# New event system need an unregister
252273
if {[GidUtils::VersionCmp "14.1.4d"] >= 0 } {
253274
GiD_UnRegisterEvents PROBLEMTYPE Kratos
275+
GiD_UnRegisterPluginPreferencesProc Kratos::Event_ModifyPreferencesWindow
254276
}
255277
if {[array exists ::Kratos::kratos_private]} {
278+
# Close the log and moves them to the folder
279+
Kratos::FlushLog
280+
256281
# Restore GiD variables that were modified by kratos and must be restored (maybe mesher)
257282
Kratos::RestoreVariables
258283

@@ -359,8 +384,10 @@ proc Kratos::TransformProblemtype {old_dom old_filespd} {
359384

360385
proc Kratos::Event_BeforeMeshGeneration {elementsize} {
361386
# Prepare things before meshing
362-
363-
387+
variable tmp_init_mesh_time
388+
set inittime [clock seconds]
389+
set tmp_init_mesh_time $inittime
390+
Kratos::Log "Mesh BeforeMeshGeneration start"
364391
GiD_Process Mescape Meshing MeshCriteria NoMesh Lines 1:end escape escape escape
365392
GiD_Process Mescape Meshing MeshCriteria NoMesh Surfaces 1:end escape escape escape
366393
GiD_Process Mescape Meshing MeshCriteria NoMesh Volumes 1:end escape escape escape
@@ -373,6 +400,9 @@ proc Kratos::Event_BeforeMeshGeneration {elementsize} {
373400
}
374401
# Maybe the current application needs to do some extra job
375402
set ret [apps::ExecuteOnCurrentApp BeforeMeshGeneration $elementsize]
403+
set endtime [clock seconds]
404+
set ttime [expr {$endtime-$inittime}]
405+
Kratos::Log "Mesh BeforeMeshGeneration end in [Duration $ttime]"
376406
return $ret
377407
}
378408

@@ -382,8 +412,14 @@ proc Kratos::Event_MeshProgress { total_percent partial_percents_0 partial_perce
382412
}
383413

384414
proc Kratos::Event_AfterMeshGeneration {fail} {
415+
variable tmp_init_mesh_time
385416
# Maybe the current application needs to do some extra job
386417
apps::ExecuteOnCurrentApp AfterMeshGeneration $fail
418+
set endtime [clock seconds]
419+
set ttime [expr {$endtime-$tmp_init_mesh_time}]
420+
Kratos::Log "Mesh end process in [Duration $ttime]"
421+
set mesh_data [Kratos::GetMeshBasicData]
422+
Kratos::Log "Mesh data -> [write::tcl2json $mesh_data]"
387423
}
388424

389425
proc Kratos::Event_AfterRenameGroup { oldname newname } {
@@ -484,8 +520,14 @@ proc Kratos::Event_SaveModelSPD { filespd } {
484520

485521
# Let the current app implement it's Save event
486522
apps::ExecuteOnCurrentApp AfterSaveModel $filespd
523+
524+
# Log it
525+
set Kratos::kratos_private(model_log_folder) [file join [GiD_Info Project ModelName].gid Logs]
526+
Kratos::Log "Save model [file tail $filespd ]"
527+
487528
}
488529

530+
489531
proc Kratos::Event_ChangedLanguage { newlan } {
490532
Kratos::UpdateMenus
491533
}

kratos.gid/scripts/Controllers/Preferences.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88
<option value='0' label='Optimized'/>
99
<option value='1' label='Readable'/>
1010
</combobox>
11+
<combobox name='allow_logs' variable='allow_logs' variablemanager='Kratos::ManagePreferences' label='Store logs' help=''>
12+
<option value='0' label='No'/>
13+
<option value='1' label='Only local, so I will get better support from the developers.'/>
14+
<option value='2' label='Share anonymous usage data. (See kratos > View current log) Coming soon :)'/>
15+
</combobox>
1116
<combobox name='echo_level' variable='echo_level' variablemanager='Kratos::ManagePreferences' label='Echo level' help='Show more/less message'>
1217
<option value='0' label='0'/>
1318
<option value='1' label='1'/>

kratos.gid/scripts/Controllers/PreferencesWindow.tcl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ proc Kratos::ManagePreferences { cmd name {value ""}} {
1111
}
1212
"SetValue" {
1313
set ::Kratos::kratos_private($name) $value
14+
if {$name eq "allow_logs"} {Kratos::InitLog}
1415
}
1516
"GetDefaultValue" {
1617
# same as GetValue
@@ -21,6 +22,9 @@ proc Kratos::ManagePreferences { cmd name {value ""}} {
2122
"echo_level" {
2223
set ret 0
2324
}
25+
"allow_logs" {
26+
set ret 1
27+
}
2428
"mdpa_format" {
2529
set ret 1
2630
}
@@ -38,7 +42,6 @@ proc Kratos::ModifyPreferencesWindow { root } {
3842

3943
if {[info exists kratos_private(Path)]} {
4044
set findnode [$root find "name" "general"]
41-
4245
if { $findnode != "" } {
4346
set xml_preferences_filename [file join $kratos_private(Path) scripts Controllers Preferences.xml]
4447
set xml_data [GidUtils::ReadFile $xml_preferences_filename]

kratos.gid/scripts/Logs.tcl

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,42 @@ proc Kratos::GetLogFilePath { } {
1818

1919
proc Kratos::InitLog { } {
2020
variable kratos_private
21-
set kratos_private(LogFilename) [clock format [clock seconds] -format "%Y%m%d%H%M%S"].log
22-
set logpath [Kratos::GetLogFilePath]
23-
file mkdir [file dirname $logpath]
24-
set logfile [open $logpath "a+"];
25-
puts $logfile "Kratos Log Session"
26-
close $logfile
27-
set kratos_private(Log) [list ]
21+
22+
if {[info exists Kratos::kratos_private(allow_logs)] && $Kratos::kratos_private(allow_logs)>0} {
23+
24+
set kratos_private(LogFilename) [clock format [clock seconds] -format "%Y%m%d%H%M%S"].log
25+
set logpath [Kratos::GetLogFilePath]
26+
file mkdir [file dirname $logpath]
27+
set logfile [open $logpath "a+"];
28+
puts $logfile "Kratos Log Session"
29+
close $logfile
30+
set kratos_private(Log) [list ]
31+
32+
Kratos::AutoFlush
33+
}
2834
}
2935

3036
proc Kratos::Log {msg} {
3137
variable kratos_private
38+
39+
if {[info exists kratos_private(Log)] && $Kratos::kratos_private(allow_logs) > 0} {
3240

33-
if {[info exists kratos_private(Log)]} {
34-
lappend kratos_private(Log) "*~* [clock format [clock seconds] -format {%Y-%m-%d %H:%M:%S}] | $msg"
41+
if {[info exists kratos_private(Log)]} {
42+
lappend kratos_private(Log) "*~* [clock format [clock seconds] -format {%Z %Y-%m-%d %H:%M:%S }] | $msg"
3543

36-
# One of the triggers is to flush if we've stored more than 5
37-
if {[llength $kratos_private(Log)] > 5} {
38-
Kratos::FlushLog
44+
# One of the triggers is to flush if we've stored more than 5
45+
if {[llength $kratos_private(Log)] > 5} {
46+
Kratos::FlushLog
47+
}
3948
}
4049
}
4150
}
4251

4352
proc Kratos::FlushLog { } {
4453
variable kratos_private
54+
4555
if {[info exists kratos_private(Log)]} {
56+
# only disturb the disk if we have something new to write
4657
if {[llength $kratos_private(Log)] > 0} {
4758
set logpath [Kratos::GetLogFilePath]
4859

@@ -58,15 +69,38 @@ proc Kratos::FlushLog { } {
5869
}
5970

6071
set kratos_private(Log) [list ]
72+
# Move it to the model, so the user can see and store to get support
73+
# Keep the original to keep centralized data to send to the servers
74+
if {$Kratos::kratos_private(model_log_folder) ne ""} {
75+
Kratos::MoveLogsToFolder $Kratos::kratos_private(model_log_folder) 0
76+
}
6177
}
6278
}
63-
after 5000 {Kratos::FlushLog}
6479

6580
}
6681

82+
proc Kratos::AutoFlush {} {
83+
if {[info exists Kratos::kratos_private(allow_logs)] && $Kratos::kratos_private(allow_logs)>0} {
84+
after 5000 {Kratos::AutoFlush}
85+
}
86+
}
87+
88+
proc Kratos::ViewLog {} {
89+
package require gid_cross_platform
90+
FlushLog
91+
gid_cross_platform::open_by_extension [Kratos::GetLogFilePath]
92+
}
93+
6794
#do not save preferences starting with flag gid.exe -c (that specify read only an alternative file)
6895
if { [GiD_Set SaveGidDefaults] } {
6996
Kratos::InitLog
70-
Kratos::FlushLog
7197
}
7298

99+
proc Kratos::MoveLogsToFolder {folder {flush_log 1}} {
100+
101+
if {[info exists Kratos::kratos_private(allow_logs)] && $Kratos::kratos_private(allow_logs)>0} {
102+
if {$flush_log} {FlushLog}
103+
if {![file exists $folder]} {file mkdir $folder}
104+
file copy -force [Kratos::GetLogFilePath] $folder
105+
}
106+
}

kratos.gid/scripts/Menus.tcl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,9 @@ proc Kratos::ChangeMenus { } {
134134
GiDMenu::InsertOption "Kratos" [list "---"] [incr pos] PRE "" "" "" replace =
135135
GiDMenu::InsertOption "Kratos" [list "Import MDPA"] [incr pos] PRE [list Kratos::ReadPreW] "" "" replace =
136136
GiDMenu::InsertOption "Kratos" [list "---"] [incr pos] PRE "" "" "" replace =
137-
if {[GidUtils::VersionCmp "14.1.4d"] <0 } { set cmd [list ChangeVariables kratos_preferences] } {set cmd [list PreferencesWindow kratos_preferences]}
137+
if {[GidUtils::VersionCmp "14.1.4d"] <0 } { set cmd [list ChangeVariables kratos_preferences] } {set cmd [list PreferencesWindow kratos_preferences]}
138138
GiDMenu::InsertOption "Kratos" [list "Kratos preferences" ] [incr pos] PRE $cmd "" "" replace =
139+
GiDMenu::InsertOption "Kratos" [list "View current log" ] [incr pos] PREPOST [list Kratos::ViewLog] "" "" replace =
139140
GiDMenu::InsertOption "Kratos" [list "About Kratos" ] [incr pos] PREPOST [list Kratos::About] "" "" replace =
140141
GidChangeDataLabel "Data units" ""
141142
GidChangeDataLabel "Interval" ""

kratos.gid/scripts/Utils.tcl

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,81 @@ proc Kratos::LoadEnvironment { } {
190190
# LOGS
191191

192192
proc Kratos::LogInitialData { } {
193+
194+
# Get the exec version
195+
Kratos::GetExecVersion
196+
Kratos::GetProblemtypeGitTag
197+
193198
set initial_data [dict create]
194-
dict set initial_data GiD_Version [GiD_Info gidversion]
195-
dict set initial_data Problemtype_Git_Hash "68418871cff2b897f7fb9176827871b339fe5f91"
199+
dict set initial_data gid_version [GiD_Info gidversion]
200+
dict set initial_data problemtype_git_hash $Kratos::kratos_private(problemtype_git_hash)
201+
dict set initial_data problemtype_version $Kratos::kratos_private(Version)
202+
dict set initial_data executable_version $Kratos::kratos_private(exec_version)
203+
dict set initial_data current_platform $::tcl_platform(platform)
196204

197205
Kratos::Log [write::tcl2json $initial_data]
206+
}
207+
208+
209+
proc Kratos::Duration { int_time } {
210+
if {$int_time == 0} {return "0 sec"}
211+
set timeList [list]
212+
foreach div {86400 3600 60 1} mod {0 24 60 60} name {day hr min sec} {
213+
set n [expr {$int_time / $div}]
214+
if {$mod > 0} {set n [expr {$n % $mod}]}
215+
if {$n > 1} {
216+
lappend timeList "$n ${name}s"
217+
} elseif {$n == 1} {
218+
lappend timeList "$n $name"
219+
}
220+
}
221+
return [join $timeList]
222+
}
223+
224+
225+
proc Kratos::GetExecVersion {} {
226+
catch {
227+
variable kratos_private
228+
set tmp_filename [GidUtils::GetTmpFilename]
229+
if { $::tcl_platform(platform) == "unix"} {set command [file join $kratos_private(Path) exec Kratos runkratos]} {set command [file join $kratos_private(Path) exec Kratos runkratos.exe]}
230+
set result [exec $command -c "import KratosMultiphysics as Kratos" >> $tmp_filename]
231+
set fp [open $tmp_filename r]
232+
set file_data [read $fp]
233+
close $fp
234+
file delete $tmp_filename
235+
set data [split $file_data "\n"]
236+
foreach line $data {
237+
if {[string first "Multi-Physics" $line] > 0} {
238+
set kratos_private(exec_version) [string range [string trim $line] 14 end]
239+
break;
240+
}
241+
}
242+
}
243+
}
244+
proc Kratos::GetProblemtypeGitTag {} {
245+
catch {
246+
variable kratos_private
247+
set tmp_filename [GidUtils::GetTmpFilename]
248+
set result [exec git -C $kratos_private(Path) log --format="%H" -n 1 >> $tmp_filename]
249+
set fp [open $tmp_filename r]
250+
set file_data [read $fp]
251+
close $fp
252+
file delete $tmp_filename
253+
set data [split $file_data "\n"]
254+
set kratos_private(problemtype_git_hash) [string trim [string trim [lindex $data 0]] "\""]
255+
}
256+
}
257+
258+
proc Kratos::GetMeshBasicData { } {
259+
set result [dict create]
260+
foreach element_type [GidUtils::GetElementTypes all] {
261+
set ne [GiD_Info Mesh NumElements $element_type]
262+
if { $ne } {
263+
dict set result $element_type $ne
264+
}
265+
}
266+
267+
dict set result nodes [GiD_Info Mesh NumNodes]
268+
dict set result is_quadratic [expr [GiD_Info Project Quadratic] && ![GiD_Cartesian get iscartesian] ]
269+
return $result
198270
}

0 commit comments

Comments
 (0)