gs2crmod 0.11.80 → 0.11.81
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/VERSION +1 -1
- data/gs2crmod.gemspec +6 -6
- data/lib/gs2crmod/gs2.rb +119 -61
- data/lib/gs2crmod/ingen.rb +8 -1
- data/lib/gs2crmod/namelists.rb +811 -116
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd002075eaac9b4c29d88b0aebd361dda5af3ab5
|
4
|
+
data.tar.gz: 8e4ca849e1ea872ac714da047a819f0fda8a5f87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8540f760d4cbe56a57a5d11ae5a28b5dd708f33558b189d40171d012b30d30569fe02252c47f9da934f887b710909c46cede919bc7198f879e6f09a32168dbf2
|
7
|
+
data.tar.gz: 07821b20d76a4baf24380e3370e32c958db355c28bb7e210be0c4cfa8d382c9bcc073a1a02ec50ebf2e9a2cf3b84614abc2aa90ec0f814c63f2c8b11aab2d422
|
data/Gemfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
# Add dependencies required to use your gem here.
|
3
3
|
# Example:
|
4
|
-
gem "coderunner", ">= 0.
|
4
|
+
gem "coderunner", ">= 0.15.5"
|
5
5
|
gem "rubyhacks", ">= 0.1.2"
|
6
6
|
# It seems necessary to have the following line un-commented on some systems but commented out on other systems:
|
7
7
|
gem "ruby-netcdf-updated", ">= 0.6.6.1"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.11.
|
1
|
+
0.11.81
|
data/gs2crmod.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: gs2crmod 0.11.
|
5
|
+
# stub: gs2crmod 0.11.81 ruby lib
|
6
6
|
# stub: ext/extconf.rb
|
7
7
|
|
8
8
|
Gem::Specification.new do |s|
|
9
9
|
s.name = "gs2crmod"
|
10
|
-
s.version = "0.11.
|
10
|
+
s.version = "0.11.81"
|
11
11
|
|
12
12
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
13
13
|
s.require_paths = ["lib"]
|
14
14
|
s.authors = ["Edmund Highcock", "Ferdinand van Wyk"]
|
15
|
-
s.date = "2014-
|
15
|
+
s.date = "2014-12-04"
|
16
16
|
s.description = "GS2 is a gyrokinetic flux tube initial value turbulence code which can be used for fusion or astrophysical plasmas. CodeRunner is a framework for the automated running and analysis of large simulations. This module allows GS2 (and its sister code AstroGK) to harness the power of the CodeRunner framework."
|
17
17
|
s.email = "edmundhighcock@sourceforge.net"
|
18
18
|
s.extensions = ["ext/extconf.rb"]
|
@@ -86,7 +86,7 @@ Gem::Specification.new do |s|
|
|
86
86
|
s.specification_version = 4
|
87
87
|
|
88
88
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
89
|
-
s.add_runtime_dependency(%q<coderunner>, [">= 0.
|
89
|
+
s.add_runtime_dependency(%q<coderunner>, [">= 0.15.5"])
|
90
90
|
s.add_runtime_dependency(%q<rubyhacks>, [">= 0.1.2"])
|
91
91
|
s.add_runtime_dependency(%q<ruby-netcdf-updated>, [">= 0.6.6.1"])
|
92
92
|
s.add_development_dependency(%q<shoulda>, ["= 3.0.1"])
|
@@ -95,7 +95,7 @@ Gem::Specification.new do |s|
|
|
95
95
|
s.add_development_dependency(%q<jeweler>, [">= 1.8.4"])
|
96
96
|
s.add_development_dependency(%q<minitest>, ["~> 4"])
|
97
97
|
else
|
98
|
-
s.add_dependency(%q<coderunner>, [">= 0.
|
98
|
+
s.add_dependency(%q<coderunner>, [">= 0.15.5"])
|
99
99
|
s.add_dependency(%q<rubyhacks>, [">= 0.1.2"])
|
100
100
|
s.add_dependency(%q<ruby-netcdf-updated>, [">= 0.6.6.1"])
|
101
101
|
s.add_dependency(%q<shoulda>, ["= 3.0.1"])
|
@@ -105,7 +105,7 @@ Gem::Specification.new do |s|
|
|
105
105
|
s.add_dependency(%q<minitest>, ["~> 4"])
|
106
106
|
end
|
107
107
|
else
|
108
|
-
s.add_dependency(%q<coderunner>, [">= 0.
|
108
|
+
s.add_dependency(%q<coderunner>, [">= 0.15.5"])
|
109
109
|
s.add_dependency(%q<rubyhacks>, [">= 0.1.2"])
|
110
110
|
s.add_dependency(%q<ruby-netcdf-updated>, [">= 0.6.6.1"])
|
111
111
|
s.add_dependency(%q<shoulda>, ["= 3.0.1"])
|
data/lib/gs2crmod/gs2.rb
CHANGED
@@ -86,38 +86,6 @@ require folder + '/read_netcdf.rb'
|
|
86
86
|
NaN = GSL::NAN
|
87
87
|
# GSL::Neg
|
88
88
|
|
89
|
-
|
90
|
-
def code_run_environment
|
91
|
-
case CodeRunner::SYS
|
92
|
-
when /iridis/
|
93
|
-
<<EOF
|
94
|
-
module load openmpi
|
95
|
-
EOF
|
96
|
-
when /helios/
|
97
|
-
<<EOF
|
98
|
-
module purge
|
99
|
-
module load intel
|
100
|
-
module load bullxmpi
|
101
|
-
module load netcdf_p
|
102
|
-
module load hdf5_p
|
103
|
-
module load fftw/3.3.3
|
104
|
-
module load bullxde papi
|
105
|
-
module load scalasca
|
106
|
-
EOF
|
107
|
-
#when /archer/
|
108
|
-
#<<EOF
|
109
|
-
#module swap PrgEnv-cray PrgEnv-intel
|
110
|
-
#module load intel/14.0.0.080
|
111
|
-
#module load fftw
|
112
|
-
#module load netcdf-hdf5parallel
|
113
|
-
#module load cray-hdf5-parallel
|
114
|
-
#EOF
|
115
|
-
else
|
116
|
-
|
117
|
-
@code_run_environment
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
89
|
eval(%[
|
122
90
|
], GLOBAL_BINDING)
|
123
91
|
|
@@ -182,7 +150,7 @@ eval(%[
|
|
182
150
|
# Other useful information about the run
|
183
151
|
###############################################
|
184
152
|
|
185
|
-
@gs2_run_info = [:time, :percent_of_total_time, :checked_converged, :is_a_restart, :restart_id, :restart_run_name, :completed_timesteps]
|
153
|
+
@gs2_run_info = [:time, :percent_of_total_time, :checked_converged, :is_a_restart, :restart_id, :restart_run_name, :completed_timesteps, :response_id]
|
186
154
|
|
187
155
|
@run_info = @gs2_run_info.dup
|
188
156
|
|
@@ -533,54 +501,112 @@ end
|
|
533
501
|
|
534
502
|
|
535
503
|
def restart(new_run)
|
536
|
-
#new_run = self.dup
|
537
504
|
(rcp.variables).each{|v| new_run.set(v, send(v)) if send(v)}
|
538
505
|
@naming_pars.delete(:preamble)
|
539
506
|
SUBMIT_OPTIONS.each{|v| new_run.set(v, self.send(v)) unless new_run.send(v)}
|
540
|
-
#(rcp.results + rcp.gs2_run_info).each{|result| new_run.set(result, nil)}
|
541
507
|
new_run.is_a_restart = true
|
542
508
|
new_run.ginit_option = "many"
|
543
509
|
new_run.delt_option = "check_restart"
|
544
|
-
#if Dir.entries(@directory).include? "nc"
|
545
|
-
#old_restart_run_name = (@restart_run_name or Dir.entries(@directory + '/nc').grep(/\.nc/)[0].sub(/\.nc\.\d+$/, ''))
|
546
|
-
#new_run.restart_file = File.expand_path("#@directory/nc/#{old_restart_run_name}.nc")
|
547
|
-
#else
|
548
|
-
#new_run.restart_file = File.expand_path("#@directory/#@run_name.nc")
|
549
|
-
#end
|
550
510
|
new_run.restart_id = @id
|
551
511
|
new_run.restart_run_name = @run_name
|
552
|
-
@runner.nprocs = @nprocs if @runner.nprocs == "1" # 1 is the default
|
553
|
-
|
554
|
-
|
555
|
-
|
512
|
+
@runner.nprocs = @nprocs if @runner.nprocs == "1" # 1 is the default
|
513
|
+
|
514
|
+
if !new_run.nprocs or new_run.nprocs != @nprocs
|
515
|
+
raise "Restart must be on the same number of processors as the previous "\
|
516
|
+
"run: new is #{new_run.nprocs.inspect} and old is #{@nprocs.inspect}"
|
517
|
+
end
|
556
518
|
new_run.run_name = nil
|
557
519
|
new_run.naming_pars = @naming_pars
|
558
|
-
new_run.update_submission_parameters(new_run.parameter_hash_string, false) if
|
520
|
+
new_run.update_submission_parameters(new_run.parameter_hash_string, false) if
|
521
|
+
new_run.parameter_hash
|
559
522
|
new_run.naming_pars.delete(:restart_id)
|
560
523
|
new_run.generate_run_name
|
561
|
-
|
524
|
+
copy_restart_files(new_run)
|
525
|
+
|
526
|
+
if new_run.read_response and new_run.read_response.fortran_true?
|
527
|
+
new_run.response_id = new_run.restart_id
|
528
|
+
copy_response_files(new_run)
|
529
|
+
end
|
530
|
+
|
531
|
+
new_run
|
532
|
+
end
|
533
|
+
|
534
|
+
def copy_restart_files(new_run)
|
535
|
+
eputs 'Copying restart files...', ''
|
562
536
|
FileUtils.makedirs(new_run.directory + '/nc')
|
563
537
|
#old_dir = File.dirname(@restart_file)
|
564
|
-
new_run.restart_file = "#@run_name.nc"
|
538
|
+
new_run.restart_file = "#@run_name.nc"
|
565
539
|
new_run.restart_dir = "nc"
|
566
|
-
#files = Dir.entries(old_dir).grep(/\.nc(?:\.\d|_ene)/)
|
567
|
-
#files = Dir.entries(old_dir).grep(/^\.\d+$/) if files.size == 0
|
568
540
|
files = list_of_restart_files.map do |file|
|
569
541
|
@directory + "/" + file
|
570
542
|
end
|
571
543
|
files.each_with_index do |file , index|
|
572
|
-
eputs "\033[2A" # Terminal jargon - go back one line
|
573
544
|
eputs "#{index+1} out of #{files.size}"
|
545
|
+
eputs "\033[2A" # Terminal jargon - go back one line
|
574
546
|
num = file.scan(/(?:\.\d+|_ene)$/)[0]
|
575
547
|
#FileUtils.cp("#{old_dir}/#{file}", "nc/#@restart_file#{num}")
|
576
548
|
FileUtils.cp(file, new_run.directory + "/nc/#{new_run.restart_file}#{num}")
|
577
549
|
end
|
578
|
-
#@runner.submit(new_run)
|
579
|
-
new_run
|
580
550
|
end
|
581
551
|
|
582
|
-
|
552
|
+
def copy_response_files(run)
|
553
|
+
eputs 'Copying response files...', ''
|
554
|
+
eputs 'The following run parameters have changed. Are you sure you can use '\
|
555
|
+
'these response files?'
|
556
|
+
diff_run_parameters(self, run)
|
557
|
+
FileUtils.makedirs(run.directory + '/response')
|
558
|
+
run.response_dir = "response"
|
559
|
+
|
560
|
+
files = list_of_response_files.map do |file|
|
561
|
+
@directory + "/" + file
|
562
|
+
end
|
563
|
+
|
564
|
+
files.each_with_index do |file , index|
|
565
|
+
eputs "#{index+1} out of #{files.size}"
|
566
|
+
eputs "\033[2A" # Terminal jargon - go back one line
|
567
|
+
response_ext = file.scan(/_ik_\d+_is_\d+.response/)
|
568
|
+
FileUtils.cp(file, run.directory + "/response/#{run.run_name}#{response_ext[0]}")
|
569
|
+
end
|
570
|
+
end
|
571
|
+
|
572
|
+
# The following function is essentially the same as the CR differences_between
|
573
|
+
# function without the runner loading set up code. This could possibly be moved
|
574
|
+
# to a more general function in CR.
|
575
|
+
def diff_run_parameters(run_1, run_2)
|
576
|
+
runs = [run_1, run_2]
|
577
|
+
rcp_fetcher = (runs[0] || @runner.run_class).rcp
|
578
|
+
vars = rcp.variables.dup + rcp.run_info.dup
|
579
|
+
|
580
|
+
# Clean up output by deleting some variables
|
581
|
+
vars.delete_if{|var| runs.map{|r| r.send(var)}.uniq.size == 1}
|
582
|
+
vars.delete :id
|
583
|
+
vars.delete :run_name
|
584
|
+
vars.delete :output_file
|
585
|
+
vars.delete :error_file
|
586
|
+
vars.delete :executable
|
587
|
+
vars.delete :comment
|
588
|
+
vars.delete :naming_pars
|
589
|
+
vars.delete :parameter_hash
|
590
|
+
vars.delete :parameter_hash_string
|
591
|
+
vars.delete :sys
|
592
|
+
vars.delete :status
|
593
|
+
vars.delete :job_no
|
594
|
+
vars.delete :running
|
595
|
+
vars.unshift :id
|
596
|
+
|
597
|
+
# Fancy table printing
|
598
|
+
table = vars.map{|var| [var] + runs.map{|r| str = r.instance_eval(var.to_s).to_s;
|
599
|
+
str.size>10?str[0..9]:str} }
|
600
|
+
col_widths = table.map{|row| row.map{|v| v.to_s.size}}.
|
601
|
+
inject{|o,n| o.zip(n).map{|a| a.max}}
|
602
|
+
eputs
|
603
|
+
table.each{|row| i=0; eputs row.map{|v| str = sprintf(" %#{col_widths[i]}s ",
|
604
|
+
v.to_s); i+=1; str}.join('|'); eputs '-' *
|
605
|
+
(col_widths.sum + col_widths.size*3 - 1) }
|
606
|
+
end
|
583
607
|
|
608
|
+
|
609
|
+
# Return a list of restart file paths (relative to the run directory).
|
584
610
|
def list_of_restart_files
|
585
611
|
Dir.chdir(@directory) do
|
586
612
|
files = Dir.entries.grep(/^\.\d+$/)
|
@@ -591,7 +617,7 @@ def list_of_restart_files
|
|
591
617
|
break if files.size == 0
|
592
618
|
end
|
593
619
|
end #if files.size == 0
|
594
|
-
#
|
620
|
+
# Finds a .nc file (w/o a number) in 'nc' folder if using single restart file
|
595
621
|
if files.size == 0
|
596
622
|
files = Dir.entries('nc').grep(/\.nc/).map{|file| 'nc' + "/" + file}
|
597
623
|
end #if files.size == 0
|
@@ -601,6 +627,21 @@ end
|
|
601
627
|
|
602
628
|
alias :lorf :list_of_restart_files
|
603
629
|
|
630
|
+
# Return list of response files similar to method for restart files
|
631
|
+
def list_of_response_files
|
632
|
+
Dir.chdir(@directory) do
|
633
|
+
files = Dir.entries('response').grep(/\.response/).map{|file| 'response' +
|
634
|
+
"/" + file}
|
635
|
+
files = Dir.entries.grep(/\.response/) if files.size == 0
|
636
|
+
if files.size == 0
|
637
|
+
(Dir.entries.find_all{|dir| FileTest.directory? dir} - ['.', '..']).each do |dir|
|
638
|
+
files = Dir.entries(dir).grep(/\.response/).map{|file| dir + "/" + file}
|
639
|
+
end
|
640
|
+
end
|
641
|
+
return files
|
642
|
+
end
|
643
|
+
end
|
644
|
+
|
604
645
|
# Put restart files in the conventional location, i.e. nc/run_name.proc
|
605
646
|
|
606
647
|
def standardize_restart_files
|
@@ -809,16 +850,34 @@ end
|
|
809
850
|
|
810
851
|
|
811
852
|
def generate_input_file(&block)
|
812
|
-
raise CRFatal("No Input Module File Given or Module Corrupted") unless
|
853
|
+
raise CRFatal("No Input Module File Given or Module Corrupted") unless
|
854
|
+
methods.include? (:input_file_text)
|
813
855
|
run_namelist_backwards_compatibility
|
814
|
-
|
856
|
+
|
857
|
+
# If it is a restart default behaviour will be to copy the response files
|
858
|
+
# from the run being restarted. Specifying a response_id will override this.
|
859
|
+
if not @is_a_restart and @response_id
|
860
|
+
@read_response = ".true."
|
861
|
+
|
862
|
+
@runner.run_list[@response_id].copy_response_files(self)
|
863
|
+
elsif @dump_response and @dump_response.fortran_true? and
|
864
|
+
(not @read_response or not @read_response.fortran_true?)
|
865
|
+
@response_dir = "response"
|
866
|
+
FileUtils.makedirs @response_dir
|
867
|
+
end
|
868
|
+
|
869
|
+
# The second test checks that the restart function has not been called
|
870
|
+
# manually earlier (e.g. in Trinity), but we must check that it is not in
|
871
|
+
# fact a resubmitted run.
|
872
|
+
if @restart_id and (not @is_a_restart or @resubmit_id)
|
815
873
|
@runner.run_list[@restart_id].restart(self)
|
816
|
-
elsif @save_for_restart and @save_for_restart.fortran_true? and
|
874
|
+
elsif @save_for_restart and @save_for_restart.fortran_true? and
|
875
|
+
(not @is_a_restart or @resubmit_id)
|
817
876
|
@restart_dir = "nc"
|
818
877
|
#if CODE_OPTIONS[:gs2] and CODE_OPTIONS[:gs2][:list]
|
819
878
|
#FileUtils.makedirs "#{@runner.root_folder}/#@restart_dir"
|
820
879
|
#else
|
821
|
-
|
880
|
+
FileUtils.makedirs @restart_dir
|
822
881
|
#end
|
823
882
|
@restart_file = "#@run_name.nc"
|
824
883
|
|
@@ -831,7 +890,6 @@ def generate_input_file(&block)
|
|
831
890
|
|
832
891
|
set_nprocs
|
833
892
|
|
834
|
-
|
835
893
|
if block
|
836
894
|
##### Allow the user to define their own pre-flight checks and changes
|
837
895
|
instance_eval(&block)
|
@@ -841,7 +899,6 @@ def generate_input_file(&block)
|
|
841
899
|
#########
|
842
900
|
end
|
843
901
|
|
844
|
-
|
845
902
|
write_input_file
|
846
903
|
|
847
904
|
######### Generate a report using the ingen tool if possible
|
@@ -849,6 +906,7 @@ def generate_input_file(&block)
|
|
849
906
|
########
|
850
907
|
end
|
851
908
|
|
909
|
+
|
852
910
|
def write_input_file
|
853
911
|
File.open(@run_name + ".in", 'w'){|file| file.puts input_file_text}
|
854
912
|
end
|
data/lib/gs2crmod/ingen.rb
CHANGED
@@ -105,7 +105,9 @@ def check_parameters
|
|
105
105
|
# Diagnostics
|
106
106
|
# Misc
|
107
107
|
|
108
|
-
|
108
|
+
##################
|
109
|
+
# Namelist Tests #
|
110
|
+
##################
|
109
111
|
|
110
112
|
rcp.namelists.each do |namelist, hash|
|
111
113
|
next if hash[:should_include].kind_of? String and not eval(hash[:should_include])
|
@@ -180,6 +182,11 @@ def check_parameters
|
|
180
182
|
|
181
183
|
error("ginit_option is 'many' but is_a_restart is false") if @ginit_option == "many" and not @is_a_restart
|
182
184
|
|
185
|
+
error("read_response is 'true' but run is not a restart. Make sure the "\
|
186
|
+
"@response_id is set to a run with response files.") if
|
187
|
+
@read_response and @read_response.fortran_true? and
|
188
|
+
not @is_a_restart and not @response_id
|
189
|
+
|
183
190
|
error("chop_side should not be used (remove test if default changes from T to F)") if !@chop_side or @chop_side.fortran_true?
|
184
191
|
|
185
192
|
#####################
|