corfucrmod 1.0.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.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/Gemfile +22 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/README.rdoc.orig +19 -0
- data/Rakefile +63 -0
- data/VERSION +1 -0
- data/clean.sh +9 -0
- data/corfucrmod.gemspec +96 -0
- data/ext/corfucrmod/extconf.rb +46 -0
- data/ext/corfucrmod/trinitycrdriver_ext.c +73 -0
- data/lib/corfucrmod.rb +1 -0
- data/lib/corfucrmod/corfu.rb +367 -0
- data/lib/corfucrmod/optimisation.rb +352 -0
- data/lib/corfucrmod/trinitycrdriver.rb +61 -0
- metadata +261 -0
@@ -0,0 +1,352 @@
|
|
1
|
+
CodeRunner.setup_run_class('chease')
|
2
|
+
|
3
|
+
class CodeRunner::Chease
|
4
|
+
# We hotwire the execute command so that it just
|
5
|
+
# runs it instead of doing a batch submission
|
6
|
+
def execute
|
7
|
+
system "#{executable}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
class CodeRunner::Ecom
|
11
|
+
# We hotwire the execute command so that it just
|
12
|
+
# runs it instead of doing a batch submission
|
13
|
+
def execute
|
14
|
+
system "#{executable}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
class CodeRunner::Corfu::Optimisation
|
18
|
+
include GSL::MultiMin
|
19
|
+
# optimisation_spec is a hash of {:code_name => {:variable => [initial_guess, dimension_scale_factor]}}
|
20
|
+
# dimension_scale_factor is just some estimate of the length scale in which the result
|
21
|
+
# varies significantly
|
22
|
+
# code_name is either trinity or chease (both can be used simultaneously)
|
23
|
+
attr_reader :optimisation_spec
|
24
|
+
attr_reader :optimisation_variables
|
25
|
+
attr_accessor :trinity_runner
|
26
|
+
attr_accessor :gs_runner
|
27
|
+
attr_accessor :parameters_obj
|
28
|
+
attr_accessor :results_hash
|
29
|
+
def initialize(optimised_quantity, optimisation_spec)
|
30
|
+
#@folder = folder
|
31
|
+
@optimised_quantity = optimised_quantity
|
32
|
+
@optimisation_spec = optimisation_spec
|
33
|
+
@optimisation_variables = optimisation_spec.map{|code, hash| hash.map{|var, pars| [code, var]}}.flatten(1)
|
34
|
+
@optimisation_starts = optimisation_spec.map{|code, hash| hash.map{|var, pars| pars[0]}}.flatten(1)
|
35
|
+
@optimisation_steps = optimisation_spec.map{|code, hash| hash.map{|var, pars| pars[1]}}.flatten(1)
|
36
|
+
#@runner = CodeRunner.fetch_runner(
|
37
|
+
#p ['optimisation_variables', @optimisation_variables]
|
38
|
+
@results_hash = {}
|
39
|
+
@first_call = true
|
40
|
+
@ifspppl_converged = false
|
41
|
+
end
|
42
|
+
def dimension
|
43
|
+
@optimisation_variables.size
|
44
|
+
end
|
45
|
+
def serial_optimise(optimisation_method, parameters_obj)
|
46
|
+
optimisation_meth = case optimisation_method
|
47
|
+
when :simplex
|
48
|
+
FMinimizer::NMSIMPLEX
|
49
|
+
else
|
50
|
+
raise "Unknown optimisation_method"
|
51
|
+
end
|
52
|
+
@results_hash[:start_time] = Time.now.to_i
|
53
|
+
opt = FMinimizer.alloc(optimisation_meth, @optimisation_variables.size)
|
54
|
+
@parameters_obj = parameters_obj
|
55
|
+
catch(:out_of_time) do
|
56
|
+
func = Proc.new{|v, optimiser| optimiser.func(v)}
|
57
|
+
eputs 'Created func'
|
58
|
+
gsl_func = Function.alloc(func, dimension)
|
59
|
+
eputs 'Allocated gsl_func'
|
60
|
+
gsl_func.set_params(self)
|
61
|
+
eputs 'Set params'
|
62
|
+
opt.set(gsl_func, @optimisation_starts.to_gslv, @optimisation_steps.to_gslv)
|
63
|
+
eputs 'Set func and starting iteration'
|
64
|
+
parameters_obj.nit.times do |i|
|
65
|
+
opt.iterate
|
66
|
+
p ['status', opt.x, opt.minimum, i, parameters_obj.nit]
|
67
|
+
@results_hash[:iterations] ||= []
|
68
|
+
@results_hash[:iterations].push [opt.x.dup, opt.minimum]
|
69
|
+
@results_hash[:elapse_mins] = (Time.now.to_i - @results_hash[:start_time]).to_f/60
|
70
|
+
@results_hash[:current_time] = Time.now.to_i
|
71
|
+
File.open('results', 'w'){|f| f.puts @results_hash.pretty_inspect}
|
72
|
+
end
|
73
|
+
eputs 'Optimisation complete'
|
74
|
+
end
|
75
|
+
eputs 'Optimisation ended'
|
76
|
+
#MPI.Finalize
|
77
|
+
|
78
|
+
end
|
79
|
+
def func(v)
|
80
|
+
val = nil
|
81
|
+
count = 1
|
82
|
+
val_old, repeat = func_actual(v)
|
83
|
+
loop do
|
84
|
+
val, repeat, trinity_is_converged = func_actual(v)
|
85
|
+
if trinity_is_converged # This means that Trinity has reached steady state
|
86
|
+
|
87
|
+
# Now we check if the loop over recalculating the GS equation
|
88
|
+
# has converged
|
89
|
+
if ((val_old - val)/val).abs < @parameters_obj.convergence
|
90
|
+
if @parameters_obj.use_ifspppl_first and not @ifspppl_converged
|
91
|
+
@ifspppl_converged = true
|
92
|
+
else
|
93
|
+
break
|
94
|
+
end
|
95
|
+
end
|
96
|
+
break if count > @parameters_obj.max_func_evals
|
97
|
+
|
98
|
+
# If geometry is being evolved internally in Trinity, we don't
|
99
|
+
# need to run this loop
|
100
|
+
break if not repeat
|
101
|
+
val_old = val
|
102
|
+
#break if not repeat or (not @first_call and count > 1) or count > 4
|
103
|
+
count += 1 unless @parameters_obj.use_ifspppl_first and not @ifspppl_converged
|
104
|
+
end
|
105
|
+
end
|
106
|
+
@first_call = false
|
107
|
+
return val
|
108
|
+
end
|
109
|
+
def func_actual(v)
|
110
|
+
eputs 'Starting func'
|
111
|
+
@id||=1 # Id of the current trinity run which should always be equal to the number of func_actual calls
|
112
|
+
repeat = false
|
113
|
+
print_pars = {}
|
114
|
+
pars = {}
|
115
|
+
pars[:gs] = {}
|
116
|
+
pars[:trinity] = {}
|
117
|
+
pars[:trinity].absorb(@parameters_obj.trinity_pars) if @parameters_obj.trinity_pars
|
118
|
+
pars[:gs].absorb(@parameters_obj.gs_pars) if @parameters_obj.gs_pars
|
119
|
+
for i in 0...v.size
|
120
|
+
code, varname = @optimisation_variables[i]
|
121
|
+
val = v[i]
|
122
|
+
code = case code
|
123
|
+
when :chease, :ecom
|
124
|
+
:gs
|
125
|
+
else
|
126
|
+
:trinity
|
127
|
+
end
|
128
|
+
pars[code][varname] = val
|
129
|
+
print_pars[code] ||={}
|
130
|
+
print_pars[code][varname] = val
|
131
|
+
end
|
132
|
+
if not @first_run_done
|
133
|
+
pars[:trinity][:ntstep] = @parameters_obj.ntstep_first
|
134
|
+
#pars[:trinity][:nifspppl_initial] = -1
|
135
|
+
#pars[:trinity][:niter] = 2
|
136
|
+
|
137
|
+
# The line below assumes that the whole first run is done
|
138
|
+
# with ifspppl, in which case we don't want the timestep to get
|
139
|
+
# too large for the gryfx run afterwards.
|
140
|
+
#pars[:trinity][:ntdelt_max] = 0.05
|
141
|
+
#pars[:trinity][:convergetol] = -1.0
|
142
|
+
else
|
143
|
+
pars[:trinity][:ntstep] = @parameters_obj.ntstep
|
144
|
+
#pars[:trinity][:nifspppl_initial] = -1
|
145
|
+
#pars[:trinity][:niter] = 3
|
146
|
+
#pars[:trinity][:ntdelt_max] = 10.0
|
147
|
+
end
|
148
|
+
if @parameters_obj.use_ifspppl_first and not @ifspppl_converged
|
149
|
+
pars[:trinity][:nifspppl_initial] = pars[:trinity][:ntstep]
|
150
|
+
else
|
151
|
+
pars[:trinity][:nifspppl_initial] = -1
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
# Must fix this soon!
|
156
|
+
if @parameters_obj.gs_code == 'chease'
|
157
|
+
#pars[:gs][:ap] = [0.3,0.5,0.4,0.0,0.4,0.0,0.0]
|
158
|
+
#pars[:gs][:at] = [0.16,1.0,1.0,-1.1,-1.1]
|
159
|
+
end
|
160
|
+
|
161
|
+
trinity_runner.run_class.instance_variable_set(:@mpi_communicator, MPI::Comm::WORLD)
|
162
|
+
#if false and trinity_runner.run_list.size > 0
|
163
|
+
#else
|
164
|
+
if @first_run_done
|
165
|
+
#crun.nppfun=4
|
166
|
+
#crun.neqdsk=0
|
167
|
+
#crun.expeq_file = trinity_runner.run_list[@id]
|
168
|
+
end
|
169
|
+
if not @replay
|
170
|
+
if not @first_run_done and gs_runner.run_list.size > 0
|
171
|
+
#This means we are in a restart
|
172
|
+
@replay = true
|
173
|
+
@nrun = 1
|
174
|
+
if @parameters_obj.delete_final_run
|
175
|
+
eputs 'Removing final run: ' + trinity_runner.run_list.keys.max.to_s
|
176
|
+
trinity_runner.conditions = 'id==' + trinity_runner.run_list.keys.max.to_s
|
177
|
+
trinity_runner.destroy no_confirm: true
|
178
|
+
gs_runner.conditions = 'id==' + gs_runner.run_list.keys.max.to_s
|
179
|
+
gs_runner.destroy no_confirm: true
|
180
|
+
end
|
181
|
+
else
|
182
|
+
@nrun = nil
|
183
|
+
@replay = false
|
184
|
+
end
|
185
|
+
end
|
186
|
+
if @replay
|
187
|
+
eputs 'Replaying: ' + @nrun.to_s
|
188
|
+
run = trinity_runner.run_list[@nrun]
|
189
|
+
if not run
|
190
|
+
eputs 'Ending replay at ' + @nrun.to_s
|
191
|
+
@replay = false
|
192
|
+
@id = @gsid = @nrun-1
|
193
|
+
else
|
194
|
+
@id = @gsid = @nrun
|
195
|
+
end
|
196
|
+
@nrun += 1
|
197
|
+
end
|
198
|
+
Hash.phoenix('func_calls.rb') do |hash|
|
199
|
+
hash[@id+1] ||={}
|
200
|
+
hash[@id+1][:variables] = v.dup
|
201
|
+
hash[@id+1][:print_pars] = print_pars
|
202
|
+
hash
|
203
|
+
end
|
204
|
+
#raise "WORK!!"
|
205
|
+
eputs "Written parameters"
|
206
|
+
if not @replay
|
207
|
+
eputs "Not replaying... starting GS and Trinity runs"
|
208
|
+
remaining_wall_mins = (
|
209
|
+
@parameters_obj.wall_mins - @parameters_obj.wall_mins_margin -
|
210
|
+
(Time.now.to_i - @parameters_obj.start_time).to_f / 60.0
|
211
|
+
)
|
212
|
+
eputs "Remaining wall mins #{remaining_wall_mins}, wall mins #{@parameters_obj.wall_mins}, start time #{@parameters_obj.start_time}, time #{Time.now.to_i}, margin #{@parameters_obj.wall_mins_margin}"
|
213
|
+
if remaining_wall_mins < @parameters_obj.wall_mins_margin
|
214
|
+
eputs "Run out of time"
|
215
|
+
throw(:out_of_time)
|
216
|
+
end
|
217
|
+
eputs "Starting real run, @id = ",@id
|
218
|
+
# Create and initialize the gs run
|
219
|
+
gsrun = gs_runner.run_class.new(gs_runner)
|
220
|
+
raise "No gs_defaults strings" unless @parameters_obj.gs_defaults_strings.size > 0
|
221
|
+
@parameters_obj.gs_defaults_strings.each{|prc| gsrun.instance_eval(prc)}
|
222
|
+
if gs_runner.run_list.size > 0
|
223
|
+
#gsrun.restart_id = @gsid
|
224
|
+
if @parameters_obj.gs_code == 'chease'
|
225
|
+
last_converged = @id
|
226
|
+
#We need to find the last converged Trinity run to use as the pressure profile.
|
227
|
+
until last_converged == 0 or trinity_runner.combined_run_list[last_converged].is_converged?
|
228
|
+
eputs "Run #{last_converged} not converged"
|
229
|
+
last_converged -= 1
|
230
|
+
end
|
231
|
+
#unless (@parameters_obj.use_previous_pressure==0 and not @first_trinity_run_completed)
|
232
|
+
unless last_converged == 0
|
233
|
+
eputs "Using previous pressure profile"
|
234
|
+
# We give CHEASE the pressure profile from the previous run.
|
235
|
+
pars[:gs][:nppfun] = 4
|
236
|
+
pars[:gs][:nfunc] = 4
|
237
|
+
#if prid = @parameters_obj.use_previous_pressure and not @first_trinity_run_completed
|
238
|
+
# If the last trinity run did not converge we may want to run exactly
|
239
|
+
# the same case again, and in particular use the pressure profile from
|
240
|
+
# the previous Trinity run as input (as an unconverged pressure profile
|
241
|
+
# can lead to a wacky GS solution)
|
242
|
+
#gsrun.expeq_in=trinity_runner.combined_run_list[prid].directory + '/chease/EXPEQ.NOSURF'
|
243
|
+
#else
|
244
|
+
gsrun.expeq_in=trinity_runner.combined_run_list[last_converged].directory + '/chease/EXPEQ.NOSURF'
|
245
|
+
#end
|
246
|
+
# Don't optimise presssure profile.
|
247
|
+
pars[:gs][:nblopt] = 0
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
gsrun.update_submission_parameters(pars[:gs].inspect, false)
|
252
|
+
|
253
|
+
# Create and initialize the trinity run
|
254
|
+
run = trinity_runner.run_class.new(trinity_runner)
|
255
|
+
raise "No trinity_defaults_strings" unless @parameters_obj.trinity_defaults_strings.size > 0
|
256
|
+
run.instance_variable_set(:@set_flux_defaults_procs, []) unless run.instance_variable_get(:@set_flux_defaults_procs)
|
257
|
+
@parameters_obj.trinity_defaults_strings.each{|prc| run.instance_eval(prc)}
|
258
|
+
run.update_submission_parameters(pars[:trinity].inspect, false)
|
259
|
+
|
260
|
+
#if @parameters_obj.gs_code == 'chease' and (run.evolve_geometry and run.evolve_geometry.fortran_true?)
|
261
|
+
#pars[:gs][:nblopt] = 0
|
262
|
+
#end
|
263
|
+
gs_runner.submit(gsrun)
|
264
|
+
gsrun = gs_runner.run_list[@gsid = gs_runner.max_id]
|
265
|
+
gsrun.recheck
|
266
|
+
gs_runner.update
|
267
|
+
#gs_runner.print_out(0)
|
268
|
+
#FileUtils.cp(gsrun.directory + '/ogyropsi.dat', trinity_runner.root_folder + '/.')
|
269
|
+
|
270
|
+
run.gs_folder = gsrun.directory
|
271
|
+
while (
|
272
|
+
not FileTest.exist? run.gs_folder + '/ogyropsi.dat' or
|
273
|
+
File.read(run.gs_folder + '/ogyropsi.dat') =~ /nan/i
|
274
|
+
)
|
275
|
+
#eputs "GS solver failed: using previous solution"
|
276
|
+
|
277
|
+
gs_runner.conditions = 'id == ' + @gsid.to_s
|
278
|
+
gs_runner.destroy(no_confirm: true)
|
279
|
+
gs_runner.conditions = nil
|
280
|
+
eputs "GS solver failed for #{v.inspect}: returning 10000"
|
281
|
+
return [10000, false]
|
282
|
+
#run.gs_folder = gs_runner.run_list[@gsid -= 1].directory
|
283
|
+
end
|
284
|
+
#run.evolve_geometry = ".true."
|
285
|
+
eputs ['Set gs_folder', run.gs_folder]
|
286
|
+
trinity_runner.run_class.instance_variable_set(:@delay_execution, true)
|
287
|
+
if trinity_runner.run_list.size > 0
|
288
|
+
if (old_run = trinity_runner.run_list[@id]).is_converged?
|
289
|
+
eputs "Previous trinity run #@id converged: using profile as initial condition"
|
290
|
+
run.init_option="trinity"
|
291
|
+
## We have to copy the file because we need to be able to access the original from R
|
292
|
+
#FileUtils.cp("../id_#@id/#{old_run.run_name}.out.nc", "../id_#@id/#{old_run.run_name}_copy.out.nc")
|
293
|
+
run.init_file = "../id_#@id/#{old_run.run_name}.out.nc"
|
294
|
+
run.init_time = old_run.new_netcdf_file.var("t").get[-1]
|
295
|
+
old_run.new_ncclose rescue nil # Make sure the file is closed
|
296
|
+
else
|
297
|
+
eputs "Previous trinity run #@id not converged: restarting"
|
298
|
+
run.restart_id = @id
|
299
|
+
end
|
300
|
+
end
|
301
|
+
eputs 'Submitting run'
|
302
|
+
run.wall_mins = remaining_wall_mins
|
303
|
+
trinity_runner.submit(run)
|
304
|
+
run = trinity_runner.run_list[@id = trinity_runner.max_id]
|
305
|
+
|
306
|
+
|
307
|
+
comm = MPI::Comm::WORLD
|
308
|
+
arr = NArray.int(1)
|
309
|
+
arr[0] = 1
|
310
|
+
eputs 'Sending message'
|
311
|
+
comm.Bcast(arr,0)
|
312
|
+
comm.Bcast_string(run.directory)
|
313
|
+
comm.Bcast_string(run.run_name)
|
314
|
+
eputs 'Running trinity'
|
315
|
+
Dir.chdir(run.directory){run.run_trinity(run.run_name+'.trin', comm)}
|
316
|
+
eputs 'Rechecking'
|
317
|
+
trinity_runner.update
|
318
|
+
eputs 'Queue', run.queue_status
|
319
|
+
|
320
|
+
trinity_runner.update
|
321
|
+
@first_trinity_run_completed
|
322
|
+
end # if not @replay
|
323
|
+
#trinity_runner.print_out(0)
|
324
|
+
Dir.chdir(run.directory) do
|
325
|
+
run.recheck
|
326
|
+
run.status = :Complete
|
327
|
+
run.get_global_results
|
328
|
+
if (run.evolve_geometry and run.evolve_geometry.fortran_true?)
|
329
|
+
repeat = false
|
330
|
+
else
|
331
|
+
repeat = true
|
332
|
+
end
|
333
|
+
end
|
334
|
+
result = run.instance_eval(@optimised_quantity)
|
335
|
+
p ['result is ', result, 'repeat: ', repeat]
|
336
|
+
@first_run_done = true
|
337
|
+
@results_hash[:func_calls] ||=[]
|
338
|
+
@results_hash[:func_calls].push [print_pars, result]
|
339
|
+
Hash.phoenix('func_calls.rb') do |hash|
|
340
|
+
hash[@id] ||={}
|
341
|
+
hash[@id][:result] = result
|
342
|
+
hash[@id][:repeat] = repeat
|
343
|
+
hash[@id][:is_converged] = run.is_converged?
|
344
|
+
hash
|
345
|
+
end
|
346
|
+
return [-result, repeat, run.is_converged?]
|
347
|
+
#end
|
348
|
+
|
349
|
+
|
350
|
+
#v.square.sum
|
351
|
+
end
|
352
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
class CodeRunner
|
3
|
+
class Trinity
|
4
|
+
module TrinityDriver
|
5
|
+
extend FFI::Library
|
6
|
+
ffi_lib ENV['TRINITY'] + '/libtrin.so'
|
7
|
+
attach_function :runtr, :run_trinity_c, [:string, :size_t], :void
|
8
|
+
attach_function :runtr2, :run_trinity_test, [], :void
|
9
|
+
end
|
10
|
+
def run_trin_actual2(input_file, mpicomm_int)
|
11
|
+
puts ['calling TrinityDriver.runtr',mpicomm_int.class]
|
12
|
+
TrinityDriver.runtr(input_file, mpicomm_int)
|
13
|
+
end
|
14
|
+
def self.run_trin_standalone(input_file)
|
15
|
+
require 'mpi'
|
16
|
+
MPI.Init
|
17
|
+
obj = CodeRunner::Trinity.new
|
18
|
+
obj.run_trinity(input_file, MPI::Comm::WORLD)
|
19
|
+
MPI.Finalize
|
20
|
+
end
|
21
|
+
private :run_trin_actual2
|
22
|
+
end
|
23
|
+
end
|
24
|
+
require 'corfucrmod/trinitycrdriver_ext'
|
25
|
+
require 'mpi'
|
26
|
+
|
27
|
+
class CodeRunner::Trinity
|
28
|
+
# We overwrite the system module's implemenation of this command.
|
29
|
+
# Instead of running trinity via a bash command or a batch script,
|
30
|
+
# we run it directly via its API.
|
31
|
+
@delay_execution = false
|
32
|
+
def queue_status
|
33
|
+
""
|
34
|
+
end
|
35
|
+
def execute
|
36
|
+
if rcp.delay_execution
|
37
|
+
eputs 'Delaying execution...'
|
38
|
+
return
|
39
|
+
else
|
40
|
+
execute_actual
|
41
|
+
end
|
42
|
+
end
|
43
|
+
def execute_actual
|
44
|
+
Dir.chdir(@directory){
|
45
|
+
if rcp.mpi_communicator?
|
46
|
+
start_mpi = false
|
47
|
+
mpicomm = rcp.mpi_communicator
|
48
|
+
else
|
49
|
+
start_mpi = true
|
50
|
+
MPI.Init
|
51
|
+
mpicomm = MPI::Comm::WORLD
|
52
|
+
puts ["INITIALISED MPI", mpicomm.size ]
|
53
|
+
end
|
54
|
+
run_trinity(@run_name + ".trin", mpicomm)
|
55
|
+
if start_mpi
|
56
|
+
MPI.Finalize
|
57
|
+
end
|
58
|
+
|
59
|
+
}
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,261 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: corfucrmod
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Edmund Highcock
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-07-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: coderunner
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.14.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.14.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: text-data-tools
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.1.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.1.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: gs2crmod
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.11.33
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.11.33
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: trinitycrmod
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.7.11
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.7.11
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: ruby-mpi
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.2.0
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.2.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: cheasecrmod
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.1.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.1.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: tokfile
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.0.3
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.0.3
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: shoulda
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 3.0.1
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 3.0.1
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rdoc
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '3.12'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '3.12'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: bundler
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 1.0.0
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 1.0.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: jeweler
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 2.0.1
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 2.0.1
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: simplecov
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: minitest
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '4'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '4'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: rake-compiler
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
description: |-
|
210
|
+
CorFu, the Coderunner/Trinity Fusion Optimisation Framework
|
211
|
+
allows the optimisation of fusion performance using first principles
|
212
|
+
flux calculations via Trinity.
|
213
|
+
email: edmundhighcock@users.sourceforge.net
|
214
|
+
executables: []
|
215
|
+
extensions:
|
216
|
+
- ext/corfucrmod/extconf.rb
|
217
|
+
extra_rdoc_files:
|
218
|
+
- LICENSE.txt
|
219
|
+
- README.rdoc
|
220
|
+
- README.rdoc.orig
|
221
|
+
files:
|
222
|
+
- ".document"
|
223
|
+
- Gemfile
|
224
|
+
- LICENSE.txt
|
225
|
+
- README.rdoc
|
226
|
+
- README.rdoc.orig
|
227
|
+
- Rakefile
|
228
|
+
- VERSION
|
229
|
+
- clean.sh
|
230
|
+
- corfucrmod.gemspec
|
231
|
+
- ext/corfucrmod/extconf.rb
|
232
|
+
- ext/corfucrmod/trinitycrdriver_ext.c
|
233
|
+
- lib/corfucrmod.rb
|
234
|
+
- lib/corfucrmod/corfu.rb
|
235
|
+
- lib/corfucrmod/optimisation.rb
|
236
|
+
- lib/corfucrmod/trinitycrdriver.rb
|
237
|
+
homepage: http://github.com/edmundhighcock/corfucrmod
|
238
|
+
licenses:
|
239
|
+
- GPLv3.0
|
240
|
+
metadata: {}
|
241
|
+
post_install_message:
|
242
|
+
rdoc_options: []
|
243
|
+
require_paths:
|
244
|
+
- lib
|
245
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
246
|
+
requirements:
|
247
|
+
- - ">="
|
248
|
+
- !ruby/object:Gem::Version
|
249
|
+
version: '0'
|
250
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
251
|
+
requirements:
|
252
|
+
- - ">="
|
253
|
+
- !ruby/object:Gem::Version
|
254
|
+
version: '0'
|
255
|
+
requirements: []
|
256
|
+
rubyforge_project:
|
257
|
+
rubygems_version: 2.6.8
|
258
|
+
signing_key:
|
259
|
+
specification_version: 4
|
260
|
+
summary: A gem which implements the CorFu Optimisation Framework.
|
261
|
+
test_files: []
|