trinitycrmod 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,18 @@
1
+ require 'text-data-tools'
2
+
3
+ class CodeRunner
4
+ class Trinity
5
+ # this module provides easy access to the Trinity textbased output data
6
+ # by defining a TextDataFile for every text output file. See the documentation
7
+ # for TextDataTools for more information.
8
+ module OutputFiles
9
+ def info_outfile
10
+ TextDataTools::Named::DataFile.new(@directory + '/' + @run_name + '.info', ':')
11
+ end
12
+ def time_outfile
13
+ TextDataTools::Column::DataFile.new(@directory + '/' + @run_name + '.time', true, /\S+/, /\w+/)
14
+ end
15
+ end
16
+ include OutputFiles
17
+ end
18
+ end
@@ -0,0 +1,216 @@
1
+ require 'coderunner'
2
+ require 'text-data-tools'
3
+
4
+ class CodeRunner
5
+ # This is a customised subclass of the CodeRunner::Run class which allows CodeRunner to run and analyse the multiscale gyrokinetic turbulent transport solver Trinity.
6
+ #
7
+ # It generates the Trinity input file, and both analyses the results and allows easy plotting of them. It also interfaces with the GS2 CodeRunner module to allow analysis of the individual GS2 results if GS2 is being used as the flux code.
8
+ class Trinity < Run::FortranNamelist
9
+ #include CodeRunner::SYSTEM_MODULE
10
+
11
+
12
+
13
+ # Where this file is
14
+ @code_module_folder = folder = File.dirname(File.expand_path(__FILE__)) # i.e. the directory this file is in
15
+
16
+ # Use the Run::FortranNamelist tools to process the variable database
17
+ setup_namelists(@code_module_folder)
18
+ require 'trinitycrmod/output_files'
19
+
20
+ ################################################
21
+ # Quantities that are read or determined by CodeRunner
22
+ # after the simulation has ended
23
+ ###################################################
24
+
25
+ @results = [
26
+ :pfus,
27
+ :fusionQ,
28
+ :pnet,
29
+ :alpha_power,
30
+ :aux_power,
31
+ :rad_power,
32
+ :ne0,
33
+ :ne95,
34
+ :ti0,
35
+ :ti95,
36
+ :te0,
37
+ :te95,
38
+ :omega0,
39
+ :omega95,
40
+ :wth
41
+ ]
42
+
43
+ @code_long="Trinity Turbulent Transport Solver"
44
+
45
+ @run_info=[:time, :is_a_restart, :restart_id, :restart_run_name, :completed_timesteps, :percent_complete]
46
+
47
+ @uses_mpi = true
48
+
49
+ @modlet_required = false
50
+
51
+ @naming_pars = []
52
+
53
+ # Any folders which are a number will contain the results from flux simulations.
54
+ @excluded_sub_folders = (1...1000).to_a.map{|i| i.to_s}
55
+
56
+ # A hook which gets called when printing the standard run information to the screen using the status command.
57
+ def print_out_line
58
+ #p ['id', id, 'ctd', ctd]
59
+ #p rcp.results.zip(rcp.results.map{|r| send(r)})
60
+ name = @run_name
61
+ name += " (res: #@restart_id)" if @restart_id
62
+ name += " real_id: #@real_id" if @real_id
63
+ beginning = sprintf("%2d:%d %-60s %1s:%2.1f(%s) %3s%1s", @id, @job_no, name, @status.to_s[0,1], @run_time.to_f / 60.0, @nprocs.to_s, percent_complete, "%")
64
+ if ctd
65
+ beginning += sprintf("Q:%f, Pfusion:%f MW, Ti0:%f keV, Te0:%f keV, n0:%f x10^20", fusionQ, pfus, ti0, te0, ne0)
66
+ end
67
+ beginning += " ---#{@comment}" if @comment
68
+ beginning
69
+ end
70
+
71
+
72
+ # This is a hook which gets called just before submitting a simulation. It sets up the folder and generates any necessary input files.
73
+ def generate_input_file
74
+ write_input_file
75
+ end
76
+
77
+ # This command uses the infrastructure provided by Run::FortranNamelist, provided by CodeRunner itself.
78
+ def write_input_file
79
+ File.open(@run_name + ".trin", 'w'){|file| file.puts input_file_text}
80
+ end
81
+
82
+ # Parameters which follow the Trinity executable, in this case just the input file.
83
+ def parameter_string
84
+ @run_name + ".trin"
85
+ end
86
+
87
+ def parameter_transition
88
+ end
89
+
90
+
91
+ @source_code_subfolders = []
92
+
93
+ # This method, as its name suggests, is called whenever CodeRunner is asked to analyse a run directory. This happens if the run status is not :Complete, or if the user has specified recalc_all(-A on the command line) or reprocess_all (-a on the command line).
94
+ #
95
+ def process_directory_code_specific
96
+ get_status
97
+ #p ['id is', id, 'ctd is ', ctd]
98
+ if ctd
99
+ get_global_results
100
+ end
101
+ #p ['fusionQ is ', fusionQ]
102
+ @percent_complete = nil
103
+ end
104
+
105
+ def get_status
106
+ if @running
107
+ get_completed_timesteps
108
+ if completed_timesteps == 0
109
+ @status = :NotStarted
110
+ else
111
+ @status = :Incomplete
112
+ end
113
+ else
114
+ get_completed_timesteps
115
+ if File.read(output_file) =~/trinity\s+finished/i
116
+ @status = :Complete
117
+ else
118
+ @status = :Failed
119
+ end
120
+ end
121
+ end
122
+
123
+ def get_completed_timesteps
124
+ Dir.chdir(@directory) do
125
+ completed_timesteps = time_outfile.exists? ?
126
+ time_outfile.get_1d_array_integer(/itstep/).max :
127
+ 0
128
+ end
129
+ end
130
+
131
+ def get_global_results
132
+ @fusionQ = info_outfile.get_variable_value('Q').to_f
133
+ @pfus = info_outfile.get_variable_value(/fusion\s+power/i).to_f
134
+ @pnet = info_outfile.get_variable_value(/net\s+power/i).to_f
135
+ @aux_power = info_outfile.get_variable_value(/aux.*\s+power/i).to_f
136
+ @alpha_power = info_outfile.get_variable_value(/alpha\s+power/i).to_f
137
+ @rad_power = info_outfile.get_variable_value(/radiated\s+power/i).to_f
138
+ @ne0 = info_outfile.get_variable_value(/core\s+density/i).to_f
139
+ @ti0 = info_outfile.get_variable_value(/core\s+T_i/i).to_f
140
+ @te0 = info_outfile.get_variable_value(/core\s+T_e/i).to_f
141
+ @omega0 = info_outfile.get_variable_value(/core\s+omega/i).to_f
142
+ #p 'send(fusionQ)', send(:fusionQ)
143
+ end
144
+
145
+ def self.get_input_help_from_source_code(source_folder)
146
+ source = get_aggregated_source_code_text(source_folder)
147
+ rcp.namelists.each do |nmlst, hash|
148
+ hash[:variables].each do |var, var_hash|
149
+
150
+ # next unless var == :w_antenna
151
+ var = var_hash[:code_name] || var
152
+ values_text = source.scan(Regexp.new("\\W#{var}\\s*=\\s*.+")).join("\n")
153
+ ep values_text
154
+ values = scan_text_for_variables(values_text).map{|(v,val)| val}
155
+ values.uniq!
156
+ # ep values if var == :nbeta
157
+ values.delete_if{|val| val.kind_of? String} if values.find{|val| val.kind_of? Numeric}
158
+ values.delete_if{|val| val.kind_of? String and not String::FORTRAN_BOOLS.include? val} if values.find{|val| val.kind_of? String and String::FORTRAN_BOOLS.include? val}
159
+ # values.sort!
160
+ # ep var
161
+ # ep values
162
+ sample_val = values[0]
163
+ p sample_val
164
+ help = values_text.scan(/ !(.*)/).flatten[0]
165
+ p help
166
+ #gets
167
+ var_hash[:help] = help
168
+ var_hash[:description] = help
169
+ save_namelists
170
+
171
+ end
172
+ end
173
+ end
174
+
175
+ def input_file_header
176
+ <<EOF
177
+ !==============================================================================
178
+ ! Trinity INPUT FILE automatically generated by CodeRunner
179
+ !==============================================================================
180
+ !
181
+ ! Trinity is a multiscale turbulent transport code for fusion plasmas.
182
+ !
183
+ ! See http://gyrokinetics.sourceforge.net
184
+ !
185
+ ! CodeRunner is a framework for the automated running and analysis
186
+ ! of large simulations.
187
+ !
188
+ ! See http://coderunner.sourceforge.net
189
+ !
190
+ ! Created on #{Time.now.to_s}
191
+ ! by CodeRunner version #{CodeRunner::CODE_RUNNER_VERSION.to_s}
192
+ !
193
+ !==============================================================================
194
+
195
+ EOF
196
+ end
197
+ def self.defaults_file_header
198
+ <<EOF1
199
+ ############################################################################
200
+ # #
201
+ # Automatically generated defaults file for the Trinity CodeRunner module #
202
+ # #
203
+ # This defaults file specifies a set of defaults for Trinity which are #
204
+ # used by CodeRunner to set up and run Trinity simulations. #
205
+ # #
206
+ ############################################################################
207
+
208
+ # Created: #{Time.now.to_s}
209
+
210
+ @defaults_file_description = ""
211
+ EOF1
212
+ end
213
+
214
+ end
215
+ end
216
+
@@ -0,0 +1 @@
1
+ require 'trinitycrmod/trinity'
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'coderunner'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,6 @@
1
+ require 'helper'
2
+ CodeRunner.setup_run_class('trinity')
3
+ #CodeRunner::Trinity.get_input_help_from_source_code(ENV['TRINITY_SOURCE'])
4
+ CodeRunner::Trinity.update_defaults_from_source_code(ENV['TRINITY_SOURCE'])
5
+ CodeRunner::Trinity.synchronise_variables(ENV['TRINITY_SOURCE'])
6
+
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'coderunner'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,57 @@
1
+
2
+
3
+
4
+ &geometry
5
+ geo_option = "iterdb"
6
+ geo_file = "../../../ifspppl/2d.dat"
7
+ geo_time = 15.2
8
+ fluxlabel_option = "aminor"
9
+ rad_out = 0.85
10
+ nrad = 9
11
+ use_external_geo = .false.
12
+ write_dbinfo = .true.
13
+ /
14
+
15
+ &species
16
+ species_option = "iterdb"
17
+ ntspec = 2
18
+ qi = 1.0
19
+ mi = 2.5
20
+ deuterium = 1
21
+ tritium = 2
22
+ /
23
+
24
+ &time
25
+ ntstep = 200
26
+ ntdelt = 0.1
27
+ impfac = 1.0
28
+ niter = 1
29
+ errtol = 0.01
30
+ errflr = 0.01
31
+ flrfac = 2.0
32
+ ntdelt_max = 100.0
33
+ /
34
+
35
+ &fluxes
36
+ flux_option = "ifspppl"
37
+ vtfac = 2.0
38
+ grad_option = "tgrads"
39
+ fork_flag = .false.
40
+ /
41
+
42
+ &physics
43
+ include_neo = .true.
44
+ turb_heat = .false.
45
+ temp_equil = .true.
46
+ /
47
+
48
+ &sources
49
+ source_option = "iterdb"
50
+ write_pwr_profs = .true.
51
+ include_radiation = .true.
52
+ include_alphas = .true.
53
+ /
54
+
55
+ &init
56
+ init_option = "iterdb"
57
+ /
Binary file
@@ -0,0 +1,46 @@
1
+ require 'helper'
2
+
3
+ class TestTrinitycrmodIFSPPPL < Test::Unit::TestCase
4
+ def setup
5
+ @runner = CodeRunner.fetch_runner(Y: 'test/ifspppl', C: 'trinity', X: '/dev/null')
6
+ end
7
+ def teardown
8
+ FileUtils.rm('test/ifspppl/.code_runner_script_defaults.rb')
9
+ FileUtils.rm('test/ifspppl/.CODE_RUNNER_TEMP_RUN_LIST_CACHE')
10
+ end
11
+ def test_basics
12
+ assert_equal(@runner.run_class, CodeRunner::Trinity)
13
+ end
14
+ def test_submit
15
+ @runner.run_class.make_new_defaults_file("rake_test", "test/ifspppl/test.trin")
16
+ FileUtils.mv('rake_test_defaults.rb', @runner.run_class.rcp.user_defaults_location)
17
+ CodeRunner.submit(Y: 'test/ifspppl', T: true, D: 'rake_test')
18
+ base_hash = @runner.run_class.parse_input_file('test/ifspppl/test.trin')
19
+ test_hash = @runner.run_class.parse_input_file('test/ifspppl/v/id_1/v_id_1.trin')
20
+ assert_equal(base_hash, test_hash)
21
+ FileUtils.rm(@runner.run_class.rcp.user_defaults_location + '/rake_test_defaults.rb')
22
+ FileUtils.rm('test/ifspppl/rake_test_defaults.rb')
23
+ FileUtils.rm_r('test/ifspppl/v')
24
+ end
25
+ end
26
+
27
+ class TestTrinitycrmodIFSPPPLAnalysis < Test::Unit::TestCase
28
+ def setup
29
+ #@runner = CodeRunner.fetch_runner(Y: 'test/ifspppl_results', C: 'trinity', X: '/dev/null')
30
+ Dir.chdir('test/ifspppl_results/v'){system "tar -xzf id_1.tgz"}
31
+ @runner = CodeRunner.fetch_runner(Y: 'test/ifspppl_results', C: 'trinity', X: ENV['HOME'] + '/Code/trinity/trunk/trinity', A: true)
32
+ #@runner.run_class.make_new_defaults_file("rake_test", "test/ifspppl/test.trin")
33
+ #FileUtils.mv('rake_test_defaults.rb', @runner.run_class.rcp.user_defaults_location)
34
+ #CodeRunner.submit(Y: 'test/ifspppl_results', D: 'rake_test', n: '1')
35
+ end
36
+ def test_analysis
37
+ CodeRunner.status(Y: 'test/ifspppl_results')
38
+ assert_equal(@runner.run_list.size, 1)
39
+ assert_equal(@runner.run_list[1].fusionQ, 0.075658439797815016)
40
+ end
41
+ def teardown
42
+ FileUtils.rm('test/ifspppl_results/.code_runner_script_defaults.rb')
43
+ FileUtils.rm('test/ifspppl_results/.CODE_RUNNER_TEMP_RUN_LIST_CACHE')
44
+ FileUtils.rm_r('test/ifspppl_results/v/id_1/')
45
+ end
46
+ end
metadata ADDED
@@ -0,0 +1,165 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trinitycrmod
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Edmund Highcock
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: coderunner
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.11.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.11.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: text-data-tools
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 1.1.1
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.1.1
46
+ - !ruby/object:Gem::Dependency
47
+ name: shoulda
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rdoc
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '3.12'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '3.12'
78
+ - !ruby/object:Gem::Dependency
79
+ name: bundler
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>'
84
+ - !ruby/object:Gem::Version
85
+ version: 1.0.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>'
92
+ - !ruby/object:Gem::Version
93
+ version: 1.0.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: jeweler
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: 1.8.4
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 1.8.4
110
+ description: This module allows Trinity, the Multiscale Gyrokinetic Turbulent Transport
111
+ solver for Fusion Reactors, to harness the power of CodeRunner, a framework for
112
+ the automated running and analysis of simulations.
113
+ email: edmundhighcock@sourceforge.net
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files:
117
+ - LICENSE.txt
118
+ - README.rdoc
119
+ files:
120
+ - .document
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.rdoc
124
+ - Rakefile
125
+ - VERSION
126
+ - lib/trinitycrmod.rb
127
+ - lib/trinitycrmod/deleted_variables.rb
128
+ - lib/trinitycrmod/namelists.rb
129
+ - lib/trinitycrmod/output_files.rb
130
+ - lib/trinitycrmod/trinity.rb
131
+ - sync_variables/helper.rb
132
+ - sync_variables/sync_variables.rb
133
+ - test/helper.rb
134
+ - test/ifspppl/test.trin
135
+ - test/ifspppl_results/v/id_1.tgz
136
+ - test/test_trinitycrmod.rb
137
+ homepage: http://github.com/edmundhighcock/trinitycrmod
138
+ licenses:
139
+ - GPLv3
140
+ post_install_message:
141
+ rdoc_options: []
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ segments:
151
+ - 0
152
+ hash: -4412447683332078047
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ requirements: []
160
+ rubyforge_project:
161
+ rubygems_version: 1.8.23
162
+ signing_key:
163
+ specification_version: 3
164
+ summary: CodeRunner module for the Trinity simulation software.
165
+ test_files: []