Class: CodeRunner::Ecom

Inherits:
Run::FortranNamelist
  • Object
show all
Defined in:
lib/ecomcrmod/ecom.rb

Overview

This is a customised subclass of the CodeRunner::Run class which allows CodeRunner to run and analyse the Grad Shafranov solver ECOM (see Lee & Cerfon, CPC, 2015)

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.defaults_file_headerObject



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/ecomcrmod/ecom.rb', line 192

def self.defaults_file_header
  "############################################################################\n#                                                                          #\n# Automatically generated defaults file for the ECOM CodeRunner module  #\n#                                                                          #\n# This defaults file specifies a set of defaults for ECOM which are     #\n# used by CodeRunner to set up and run ECOM simulations.                #\n#                                                                          #\n############################################################################\n\n# Created: \#{Time.now.to_s}   \n\n@defaults_file_description = \"\"\n"
end

Instance Method Details

#check_parametersObject



114
115
# File 'lib/ecomcrmod/ecom.rb', line 114

def check_parameters
end

#generate_component_runsObject



137
138
139
# File 'lib/ecomcrmod/ecom.rb', line 137

def generate_component_runs
  #puts "HERE"
end

#generate_input_fileObject

This is a hook which gets called just before submitting a simulation. It sets up the folder and generates any necessary input files.



106
107
108
109
110
111
112
# File 'lib/ecomcrmod/ecom.rb', line 106

def generate_input_file
    check_parameters
    if @restart_id
      @runner.run_list[@restart_id].restart(self)
    end
    write_input_file
end

#get_statusObject



157
158
159
160
161
162
163
164
165
# File 'lib/ecomcrmod/ecom.rb', line 157

def get_status
    if not @running
      if FileTest.exist? 'trinity.out'
        @status = :Complete
      else
        @status = :Failed
      end
    end
end

#input_file_extensionObject



210
211
212
# File 'lib/ecomcrmod/ecom.rb', line 210

def input_file_extension
  ''
end

#input_file_headerObject



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/ecomcrmod/ecom.rb', line 170

def input_file_header
  "!==============================================================================\n!     ECOM INPUT FILE automatically generated by CodeRunner \n!==============================================================================\n!\n!  ECOM is a code which solves the Grad Shafranov equation \n!    \n!   See Lee & Cerfon, Comp Phys Comm, 2015\n!\n!  CodeRunner is a framework for the automated running and analysis \n!  of large simulations. \n!\n!   See http://coderunner.sourceforge.net\n!  \n!  Created \#{Time.now.to_s}\n!      by CodeRunner version \#{CodeRunner::CODE_RUNNER_VERSION.to_s}\n!\n!==============================================================================\n\n"
end

#parameter_stringObject

Parameters which follow the Trinity executable, in this case just the input file.



130
131
132
# File 'lib/ecomcrmod/ecom.rb', line 130

def parameter_string
  " ecom.in"
end

#parameter_transitionObject



134
135
# File 'lib/ecomcrmod/ecom.rb', line 134

def parameter_transition
end

A hook which gets called when printing the standard run information to the screen using the status command.



40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/ecomcrmod/ecom.rb', line 40

def print_out_line
  #p ['id', id, 'ctd', ctd]
  #p rcp.results.zip(rcp.results.map{|r| send(r)})
  name = @run_name
  name += " (res: #@restart_id)" if @restart_id
  name += " real_id: #@real_id" if @real_id
  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, "%")
  if ctd
    #beginning += sprintf("Q:%f, Pfusion:%f MW, Ti0:%f keV, Te0:%f keV, n0:%f x10^20", fusionQ, pfus, ti0, te0, ne0)
  end
  beginning += "  ---#{@comment}" if @comment
  beginning
end

#process_directory_code_specificObject

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).



147
148
149
150
151
152
153
154
155
# File 'lib/ecomcrmod/ecom.rb', line 147

def process_directory_code_specific
  get_status
  #p ['id is', id, 'ctd is ', ctd]
  #if ctd
    #get_global_results 
  #end
  #p ['fusionQ is ', fusionQ]
  #@percent_complete = completed_timesteps.to_f / ntstep.to_f * 100.0
end

#restart(new_run) ⇒ Object

Modify new_run so that it becomes a restart of self. Adusts all the parameters of the new run to be equal to the parameters of the run that calls this function, and sets up its run name correctly



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/ecomcrmod/ecom.rb', line 60

def restart(new_run)
  #new_run = self.dup
  (rcp.variables).each{|v| new_run.set(v, send(v)) if send(v)}
  #if @flux_option == "gs2"
    #gs2_runs.each_with_index do |run, i|
      #CodeRunner::Gs2.rcp.variables.each{|v| new_run.gs2_runs[i].set(v, run.send(v)) if run.send(v)}
    #end
  #end
  #@naming_pars.delete(:preamble)
  #SUBMIT_OPTIONS.each{|v| new_run.set(v, self.send(v)) unless new_run.send(v)}
  ##(rcp.results + rcp.gs2_run_info).each{|result| new_run.set(result, nil)}
  new_run.is_a_restart = true
  new_run.restart_id = @id
  new_run.restart_run_name = @run_name
  new_run.nopt = -1
  #new_run.init_option = "restart"
  #new_run.iternt_file = @run_name + ".iternt"
  #new_run.iterflx_file = @run_name + ".iterflx"
  #new_run.init_file = @run_name + ".tmp"
  #@runner.nprocs = @nprocs if @runner.nprocs == "1" # 1 is the default so this means the user probably didn't specify nprocs 
  #raise "Restart must be on the same number of processors as the previous run: new is #{new_run.nprocs.inspect} and old is #{@nprocs.inspect}" if !new_run.nprocs or new_run.nprocs != @nprocs
###   @runner.parameters.each{|var, value| new_run.set(var,value)} if @runner.parameters
###   ep @runner.parameters
  new_run.run_name = nil
  new_run.naming_pars = @naming_pars
  new_run.update_submission_parameters(new_run.parameter_hash.inspect, false) if new_run.parameter_hash 
  new_run.naming_pars.delete(:restart_id)
  new_run.generate_run_name
  #new_run.run_name += '_t'
  eputs 'Copying CHEASE Restart file'
  ##system "ls #@directory"
  FileUtils.cp("#@directory/NOUT", "#{new_run.directory}/NIN")
  ##########if new_run.flux_option == "gs2" and @flux_option == "gs2"
    ##########for i in 0...n_flux_tubes
      ##########new_run.gs2_runs[i].directory = new_run.directory + "/flux_tube_#{i+1}"
      ##########FileUtils.makedirs(new_run.gs2_runs[i].directory)
      ###########ep ['gs2_runs[i] before', gs2_runs[i].nwrite, new_run.gs2_runs[i].nwrite, new_run.gs2_runs[i].parameter_hash]
      ##########gs2_runs[i].restart(new_run.gs2_runs[i])
      ###########ep ['gs2_runs[i] after', gs2_runs[i].nwrite, new_run.gs2_runs[i].nwrite, new_run.gs2_runs[i].parameter_hash]
      ###########new_run.gs2_runs[i].run_name = new_run.run_name + (i+1).to_s
    ##########end
  ##########end
  ##@runner.submit(new_run)
  #new_run
end

#vim_outputObject Also known as: vo



119
120
121
# File 'lib/ecomcrmod/ecom.rb', line 119

def vim_output
  system "vim -Ro #{output_file} #{error_file}"
end

#write_input_fileObject

This command uses the infrastructure provided by Run::FortranNamelist, provided by CodeRunner itself.



125
126
127
# File 'lib/ecomcrmod/ecom.rb', line 125

def write_input_file
  File.open("ecom.in", 'w'){|file| file.puts input_file_text}
end