[cig-commits] r12038 - in cs/portal/trunk/northridge/SeismoWebPortal: . static/images templates/SeismoWebPortal
leif at geodynamics.org
leif at geodynamics.org
Tue May 27 19:49:30 PDT 2008
Author: leif
Date: 2008-05-27 19:49:30 -0700 (Tue, 27 May 2008)
New Revision: 12038
Added:
cs/portal/trunk/northridge/SeismoWebPortal/static/images/document.gif
cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/job_progress_form.html
Modified:
cs/portal/trunk/northridge/SeismoWebPortal/forms.py
cs/portal/trunk/northridge/SeismoWebPortal/models.py
cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineos_parameters.pml
cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/par_file.txt
cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/parameters.pml
cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_detail.html
cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_form.html
cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_list.py
cs/portal/trunk/northridge/SeismoWebPortal/urls.py
cs/portal/trunk/northridge/SeismoWebPortal/views.py
Log:
Dusted-off the daemon's server-side HTTP interface.
Modified: cs/portal/trunk/northridge/SeismoWebPortal/forms.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/forms.py 2008-05-28 00:08:46 UTC (rev 12037)
+++ cs/portal/trunk/northridge/SeismoWebPortal/forms.py 2008-05-28 02:49:30 UTC (rev 12038)
@@ -116,6 +116,9 @@
self.fields = [
forms.SelectField(fieldName, is_required=True, choices=choices)
for fieldName, choices in self.selectFields
+ ] + [
+ forms.FloatField('record_length', max_digits=19, decimal_places=10, is_required=True,
+ validator_list=[models.isValidRecordLength]),
]
return
@@ -132,10 +135,14 @@
else:
value = value.id
data[fieldName] = value
+ data['record_length'] = obj.record_length
+ data['zero_half_duration'] = obj.zero_half_duration
else:
for fieldName, choices in self.selectFields:
if len(choices) == 2:
data[fieldName] = choices[1][0]
+ data['record_length'] = 20.0
+ data['zero_half_duration'] = True
return data
def save(self, new_data):
@@ -143,6 +150,7 @@
stationList = models.StationList.objects.get(id = int(new_data['stationList']))
parametersType, parametersId = map(int, new_data['parameters'].split(','))
parametersType = ContentType.objects.get(id = parametersType)
+ record_length = new_data['record_length']
obj = self.obj
if obj:
@@ -150,6 +158,7 @@
obj.stationList = stationList
obj.parametersType = parametersType
obj.parametersId = parametersId
+ obj.record_length = record_length
obj.save()
else:
obj = models.Run.objects.create(
@@ -157,6 +166,7 @@
stationList = stationList,
parametersType = parametersType,
parametersId = parametersId,
+ record_length = record_length,
)
return obj
@@ -172,6 +182,30 @@
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Jobs
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+class JobProgressManipulator(forms.Manipulator):
+
+ def __init__(self, object_id, **kwds):
+ from django.shortcuts import get_object_or_404
+ self.job = get_object_or_404(models.Job, id = object_id)
+ self.fields = [
+ forms.FloatField('progress', max_digits=19, decimal_places=10, is_required=True),
+ ]
+ return
+
+ def flatten_data(self):
+ return {'progress': self.job.progress}
+
+ def save(self, new_data):
+ self.job.progress = new_data['progress']
+ self.job.save()
+ return self.job
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Registration
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Modified: cs/portal/trunk/northridge/SeismoWebPortal/models.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/models.py 2008-05-28 00:08:46 UTC (rev 12037)
+++ cs/portal/trunk/northridge/SeismoWebPortal/models.py 2008-05-28 02:49:30 UTC (rev 12038)
@@ -270,15 +270,6 @@
return (256.0 / float(self.nex_xi())) * (self.angular_width_xi / 90.0) * 17.0
-def isValidRecordLength(field_data, all_data):
- lower = 0.0
- upper = 100.0
- number = float(field_data)
- if lower < number and number <= upper:
- return
- raise validators.ValidationError("Please enter a positive number between %.1f and %.1f." % (lower, upper))
-
-
class Specfem3DGlobeParameters(models.Model):
name = models.CharField(maxlength=100)
@@ -313,7 +304,9 @@
def get_model_id(self):
return model_types[self.model-1][0]
+ code = 1
+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Mineos
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -385,12 +378,27 @@
def __str__(self): return self.name
+ def nsamples(self, run):
+ from math import ceil
+ return int(ceil(run.record_length * 60.0 / self.step))
+ code = 2
+
+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Runs, Jobs
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+def isValidRecordLength(field_data, all_data):
+ lower = 0.0
+ upper = 100.0
+ number = float(field_data)
+ if lower < number and number <= upper:
+ return
+ raise validators.ValidationError("Please enter a positive number between %.1f and %.1f." % (lower, upper))
+
+
class Run(models.Model):
event = models.ForeignKey(Event)
stationList = models.ForeignKey(StationList)
@@ -399,6 +407,10 @@
parametersId = models.PositiveIntegerField(db_index=True)
parameters = models.GenericForeignKey(ct_field='parametersType', fk_field='parametersId')
+ record_length = models.FloatField(max_digits=19, decimal_places=10, default=20.0,
+ validator_list=[isValidRecordLength])
+ zero_half_duration = models.BooleanField(default=True)
+
status = models.CharField(maxlength=100)
started = models.DateTimeField(auto_now_add=True, editable=False)
finished = models.DateTimeField(null=True)
@@ -409,13 +421,17 @@
def __str__(self):
return "Run %04d" % self.id
+ code = property(lambda self: self.parameters.code)
+
class Job(models.Model):
# each run may correspond to multiple jobs
run = models.ForeignKey(Run)
task = models.CharField(maxlength=100)
status = models.CharField(maxlength=100)
+ progress = models.FloatField(max_digits=19, decimal_places=10, default=-1.0)
+
created = models.DateTimeField(auto_now_add=True, editable=False)
started = models.DateTimeField(null=True, blank=True)
finished = models.DateTimeField(null=True, blank=True)
Copied: cs/portal/trunk/northridge/SeismoWebPortal/static/images/document.gif (from rev 12037, cs/portal/trunk/seismo/SeismoWebPortal/static/icons/document.gif)
===================================================================
(Binary files differ)
Copied: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/job_progress_form.html (from rev 12036, cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/job_progress_form.html)
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/job_progress_form.html (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/job_progress_form.html 2008-05-28 02:49:30 UTC (rev 12038)
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Job Progress</title>
+ </head>
+
+ <body>
+
+ <h1>Job Progress</h1>
+
+ {% if form.has_errors %}
+ <p>{{ form.error_dict }}
+ {% endif %}
+
+ <form method="post" action="{{ action }}">
+
+ <p><label for="id_status">progress</label> {{ form.progress }}
+
+ <p><input type="submit" value="Save">
+
+ </form>
+
+ </body>
+</html>
Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineos_parameters.pml
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineos_parameters.pml 2008-05-28 00:08:46 UTC (rev 12037)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineos_parameters.pml 2008-05-28 02:49:30 UTC (rev 12038)
@@ -7,32 +7,33 @@
<component name="mineos">
<!-- input files (fixed) -->
+ <property name="model">model.txt</property>
<property name="event">event.txt</property>
<property name="stations">stations</property>
<!-- common -->
- <property name="radial">{{ simulation.radial }}</property>
- <property name="toroidal">{{ simulation.toroidal }}</property>
- <property name="spheroidal">{{ simulation.spheroidal }}</property>
- <property name="inner-core-toroidal">{{ simulation.ictoroidal }}</property>
+ <property name="radial">{{ parameters.radial }}</property>
+ <property name="toroidal">{{ parameters.toroidal }}</property>
+ <property name="spheroidal">{{ parameters.spheroidal }}</property>
+ <property name="inner-core-toroidal">{{ parameters.ictoroidal }}</property>
<!-- minos_bran -->
- <property name="eps">{{ simulation.eps }}</property>
- <property name="wgrav">{{ simulation.wgrav }}*milli*hertz</property>
- <property name="lmin">{{ simulation.lmin }}</property>
- <property name="lmax">{{ simulation.lmax }}</property>
- <property name="wmin">{{ simulation.wmin }}*milli*hertz</property>
- <property name="wmax">{{ simulation.wmax }}*milli*hertz</property>
- <property name="nmin">{{ simulation.nmin }}</property>
- <property name="nmax">{{ simulation.nmax }}</property>
+ <property name="eps">{{ parameters.catalog.eps }}</property>
+ <property name="wgrav">{{ parameters.catalog.wgrav }}*milli*hertz</property>
+ <property name="lmin">{{ parameters.catalog.lmin }}</property>
+ <property name="lmax">{{ parameters.catalog.lmax }}</property>
+ <property name="wmin">{{ parameters.catalog.wmin }}*milli*hertz</property>
+ <property name="wmax">{{ parameters.catalog.wmax }}*milli*hertz</property>
+ <property name="nmin">{{ parameters.catalog.nmin }}</property>
+ <property name="nmax">{{ parameters.catalog.nmax }}</property>
<!-- eigcon -->
- <property name="max-depth">{{ simulation.max_depth }}*km</property>
+ <property name="max-depth">{{ parameters.catalog.max_depth }}*km</property>
<!-- green -->
- <property name="fmin">{{ simulation.fmin }}*milli*hertz</property>
- <property name="fmax">{{ simulation.fmax }}*milli*hertz</property>
- <property name="nsamples">{{ simulation.nsamples }}</property>
+ <property name="fmin">{{ parameters.fmin }}*milli*hertz</property>
+ <property name="fmax">{{ parameters.fmax }}*milli*hertz</property>
+ <property name="nsamples">{{ parameters.nsamples }}</property>
</component>
Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/par_file.txt
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/par_file.txt 2008-05-28 00:08:46 UTC (rev 12037)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/par_file.txt 2008-05-28 02:49:30 UTC (rev 12038)
@@ -4,23 +4,23 @@
SAVE_FORWARD = .false. # save last frame of forward simulation or not
# number of chunks (1,2,3 or 6)
-NCHUNKS = {{ simulation.mesh.nchunks }}
+NCHUNKS = {{ parameters.mesh.nchunks }}
# angular width of the first chunk (not used if full sphere with six chunks)
-ANGULAR_WIDTH_XI_IN_DEGREES = {{ simulation.mesh.angular_width_xi|stringformat:".1f" }} # angular size of a chunk
-ANGULAR_WIDTH_ETA_IN_DEGREES = {{ simulation.mesh.angular_width_eta|stringformat:".1f" }}
-CENTER_LATITUDE_IN_DEGREES = {{ simulation.mesh.center_latitude|stringformat:".1f" }}
-CENTER_LONGITUDE_IN_DEGREES = {{ simulation.mesh.center_longitude|stringformat:".1f" }}
-GAMMA_ROTATION_AZIMUTH = {{ simulation.mesh.gamma_rotation_azimuth|stringformat:".1f" }}
+ANGULAR_WIDTH_XI_IN_DEGREES = {{ parameters.mesh.angular_width_xi|stringformat:".1f" }} # angular size of a chunk
+ANGULAR_WIDTH_ETA_IN_DEGREES = {{ parameters.mesh.angular_width_eta|stringformat:".1f" }}
+CENTER_LATITUDE_IN_DEGREES = {{ parameters.mesh.center_latitude|stringformat:".1f" }}
+CENTER_LONGITUDE_IN_DEGREES = {{ parameters.mesh.center_longitude|stringformat:".1f" }}
+GAMMA_ROTATION_AZIMUTH = {{ parameters.mesh.gamma_rotation_azimuth|stringformat:".1f" }}
# number of elements at the surface along the two sides of the first chunk
# (must be multiple of 16 and 8 * multiple of NPROC below)
-NEX_XI = {{ simulation.mesh.nex_xi }}
-NEX_ETA = {{ simulation.mesh.nex_eta }}
+NEX_XI = {{ parameters.mesh.nex_xi }}
+NEX_ETA = {{ parameters.mesh.nex_eta }}
# number of MPI processors along the two sides of the first chunk
-NPROC_XI = {{ simulation.mesh.nproc_xi }}
-NPROC_ETA = {{ simulation.mesh.nproc_eta }}
+NPROC_XI = {{ parameters.mesh.nproc_xi }}
+NPROC_ETA = {{ parameters.mesh.nproc_eta }}
# 1D models with real structure:
# 1D_isotropic_prem, 1D_transversely_isotropic_prem, 1D_iasp91, 1D_1066a, 1D_ak135, 1D_ref, 1D_ref_iso
@@ -31,21 +31,21 @@
# fully 3D models:
# transversely_isotropic_prem_plus_3D_crust_2.0, 3D_anisotropic, 3D_attenuation,
# s20rts, s362ani, s362iso, s362wmani, s362ani_prem, s29ea
-MODEL = {{ simulation.get_model_id }}
+MODEL = {{ parameters.get_model_id }}
# parameters describing the Earth model
-OCEANS = .{{ simulation.oceans }}.
-ELLIPTICITY = .{{ simulation.ellipticity }}.
-TOPOGRAPHY = .{{ simulation.topography }}.
-GRAVITY = .{{ simulation.gravity }}.
-ROTATION = .{{ simulation.rotation }}.
-ATTENUATION = .{{ simulation.attenuation }}.
+OCEANS = .{{ parameters.oceans }}.
+ELLIPTICITY = .{{ parameters.ellipticity }}.
+TOPOGRAPHY = .{{ parameters.topography }}.
+GRAVITY = .{{ parameters.gravity }}.
+ROTATION = .{{ parameters.rotation }}.
+ATTENUATION = .{{ parameters.attenuation }}.
# absorbing boundary conditions for a regional simulation
-ABSORBING_CONDITIONS = .{{ simulation.auto_absorbing_conditions }}.
+ABSORBING_CONDITIONS = .{{ parameters.auto_absorbing_conditions }}.
# record length in minutes
-RECORD_LENGTH_IN_MINUTES = {{ simulation.record_length|stringformat:".1f" }}
+RECORD_LENGTH_IN_MINUTES = {{ parameters.record_length|stringformat:".1f" }}
# save AVS or OpenDX movies
MOVIE_SURFACE = .false.
Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/parameters.pml
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/parameters.pml 2008-05-28 00:08:46 UTC (rev 12037)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/parameters.pml 2008-05-28 02:49:30 UTC (rev 12038)
@@ -5,35 +5,35 @@
<inventory>
<component name="Specfem3DGlobe">
- <facility name="model">{{ simulation.get_model_id }}</facility>
+ <facility name="model">{{ parameters.get_model_id }}</facility>
<component name="solver">
- <property name="record-length">{{ simulation.record_length }}*minute</property>
- <property name="absorbing-conditions">{{ simulation.auto_absorbing_conditions }}</property>
+ <property name="record-length">{{ parameters.record_length }}*minute</property>
+ <property name="absorbing-conditions">{{ parameters.auto_absorbing_conditions }}</property>
</component>
<component name="mesher">
- <property name="nchunks">{{ simulation.mesh.nchunks }}</property>
- <property name="angular-width-xi">{{ simulation.mesh.angular_width_xi }}*deg</property>
- <property name="angular-width-eta">{{ simulation.mesh.angular_width_eta }}*deg</property>
- <property name="center-latitude">{{ simulation.mesh.center_latitude }}*deg</property>
- <property name="center-longitude">{{ simulation.mesh.center_longitude }}*deg</property>
- <property name="gamma-rotation-azimuth">{{ simulation.mesh.gamma_rotation_azimuth }}*deg</property>
- <property name="nex-xi">{{ simulation.mesh.nex_xi }}</property>
- <property name="nex-eta">{{ simulation.mesh.nex_eta }}</property>
- <property name="nproc-xi">{{ simulation.mesh.nproc_xi }}</property>
- <property name="nproc-eta">{{ simulation.mesh.nproc_eta }}</property>
+ <property name="nchunks">{{ parameters.mesh.nchunks }}</property>
+ <property name="angular-width-xi">{{ parameters.mesh.angular_width_xi }}*deg</property>
+ <property name="angular-width-eta">{{ parameters.mesh.angular_width_eta }}*deg</property>
+ <property name="center-latitude">{{ parameters.mesh.center_latitude }}*deg</property>
+ <property name="center-longitude">{{ parameters.mesh.center_longitude }}*deg</property>
+ <property name="gamma-rotation-azimuth">{{ parameters.mesh.gamma_rotation_azimuth }}*deg</property>
+ <property name="nex-xi">{{ parameters.mesh.nex_xi }}</property>
+ <property name="nex-eta">{{ parameters.mesh.nex_eta }}</property>
+ <property name="nproc-xi">{{ parameters.mesh.nproc_xi }}</property>
+ <property name="nproc-eta">{{ parameters.mesh.nproc_eta }}</property>
</component>
<component name="model">
- <property name="oceans">{{ simulation.oceans }}</property>
- <property name="ellipticity">{{ simulation.ellipticity }}</property>
- <property name="topography">{{ simulation.topography }}</property>
- <property name="gravity">{{ simulation.gravity }}</property>
- <property name="rotation">{{ simulation.rotation }}</property>
- <property name="attenuation">{{ simulation.attenuation }}</property>
+ <property name="oceans">{{ parameters.oceans }}</property>
+ <property name="ellipticity">{{ parameters.ellipticity }}</property>
+ <property name="topography">{{ parameters.topography }}</property>
+ <property name="gravity">{{ parameters.gravity }}</property>
+ <property name="rotation">{{ parameters.rotation }}</property>
+ <property name="attenuation">{{ parameters.attenuation }}</property>
</component>
</component>
Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_detail.html 2008-05-28 00:08:46 UTC (rev 12037)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_detail.html 2008-05-28 02:49:30 UTC (rev 12038)
@@ -4,8 +4,11 @@
<dl class=parameters>
<dt>id</dt><dd>{{ object.id|stringformat:"04d" }}</dd>
<dt>event</dt><dd>{{ object.event }}</dd>
- <dt>stationList</dt><dd>{{ object.stationList }}</dd>
+ <dt>station list</dt><dd>{{ object.stationList }}</dd>
<dt>parameters</dt><dd>{{ object.parameters }}</dd>
+ <dt>record length</dt><dd>{{ object.record_length }}</dd>
+ <dt>zero half duration</dt>
+ <dd><img src="{{root}}/images/icon-{% if object.zero_half_duration %}yes{% else %}no{% endif %}.gif"> {{ object.zero_half_duration }}</dd>
<dt>started</dt><dd>{{ object.started|date }} {{ object.started|time }}</dd>
<dt>finished</dt><dd>{{ object.finshed|date }} {{ object.finished|time }}</dd>
<dt>status</dt><dd>{{ object.status }}</dd>
Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_form.html 2008-05-28 00:08:46 UTC (rev 12037)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_form.html 2008-05-28 02:49:30 UTC (rev 12038)
@@ -14,21 +14,6 @@
<p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
{% endif %}
-{% if form.has_errors %}
-<dl class=error>
- {% for f in form.error_dict.iteritems %}
- <dt>{{ f.0 }}</dt>
- <dd>
- <ul class=error>
- {% for e in f.1 %}
- <li>{{ e }}</li>
- {% endfor %}
- </ul>
- </dd>
- {% endfor %}
-</dl>
-{% endif %}
-
<div class=tab30ex>
<div>
@@ -49,6 +34,13 @@
{% if form.parameters.errors %}<span class=error>{{ form.parameters.errors|join:", " }}</span>{% endif %}
</div>
+ <div>
+ <label for="id_record_length" class=before>record length</label>
+ {{ form.record_length }} minutes
+ {% if form.record_length.errors %}<span class=error>{{ form.record_length.errors|join:", " }}</span>{% endif %}
+ <dl class="help inline collapsible collapsedOnLoad"><dt class="collapsibleHeader"><img src="{{root}}/images/help-small.gif"></dt><dd class="collapsibleContent">Choose the desired record length of the synthetic seismograms (in minutes). This controls the length of the numerical simulation, i.e., twice the record length requires twice as much CPU time. This must be 100 minutes or less for simulations run via the web.</dd></dl></dd></dl>
+ </div>
+
<div><input class=submit type="submit" name="save" value="Save" />
</div>
Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_list.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_list.py 2008-05-28 00:08:46 UTC (rev 12037)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_list.py 2008-05-28 02:49:30 UTC (rev 12038)
@@ -1,5 +1,5 @@
(
{% for object in object_list %}
- { 'id': {{ object.id }}, 'status': '{{ object.status }}', 'simulation': {{ object.simulation.id }}, 'nodes': {{ object.simulation.nodes }} },
+ { 'id': {{ object.id }}, 'status': '{{ object.status }}', 'code': {{ object.code }} },
{% endfor %}
)
Modified: cs/portal/trunk/northridge/SeismoWebPortal/urls.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/urls.py 2008-05-28 00:08:46 UTC (rev 12037)
+++ cs/portal/trunk/northridge/SeismoWebPortal/urls.py 2008-05-28 02:49:30 UTC (rev 12038)
@@ -20,26 +20,18 @@
(r'^(?P<pathname>style.css)$', 'SeismoWebPortal.views.directToTemplate', dict(template = 'SeismoWebPortal/style.css', mimetype='text/css')),
- # input files downloaded by daemon
- (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/par_file\.txt$', 'SeismoWebPortal.views.par_file'),
- (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/parameters\.pml$', 'SeismoWebPortal.views.parameters_pml'),
- (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/stations\.txt$', 'SeismoWebPortal.views.stations_txt'),
- (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/events\.txt$', 'SeismoWebPortal.views.events_txt'),
- (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/mineos/parameters\.pml$', 'SeismoWebPortal.views.mineos_parameters_pml'),
- (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/mineos/event\.txt$', 'SeismoWebPortal.views.mineos_event_txt'),
- (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/mineos/stations\.site$', 'SeismoWebPortal.views.mineos_stations_site'),
- (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/mineos/stations\.sitechan$', 'SeismoWebPortal.views.mineos_stations_sitechan'),
-
# runs
(r'^runs/list\.py$', 'django.views.generic.list_detail.object_list', dict(queryset = models.Run.objects.all(),
allow_empty = True,
template_name='SeismoWebPortal/run_list.py',
mimetype='text/plain')),
(r'^runs/(?P<object_id>\d+)/status/$', 'SeismoWebPortal.views.update_run_status'),
+ (r'^runs/(?P<object_id>\d+)/(?P<filename>.*)$', 'SeismoWebPortal.views.downloadInputFile'),
# jobs
(r'^jobs/create/$', 'SeismoWebPortal.views.daemon_post', dict(modelName='Job', action='create')),
(r'^jobs/(?P<object_id>\d+)/update/$', 'SeismoWebPortal.views.daemon_post', dict(modelName='Job', action='update')),
+ (r'^jobs/(?P<object_id>\d+)/progress/$', 'SeismoWebPortal.views.daemon_post', dict(modelName='Job', action='progress')),
# output files
(r'^output/create/$', 'SeismoWebPortal.views.daemon_post', dict(modelName='OutputFile', action='create')),
Modified: cs/portal/trunk/northridge/SeismoWebPortal/views.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/views.py 2008-05-28 00:08:46 UTC (rev 12037)
+++ cs/portal/trunk/northridge/SeismoWebPortal/views.py 2008-05-28 02:49:30 UTC (rev 12038)
@@ -347,10 +347,13 @@
def daemon_post(request, modelName=None, action=None, object_id=None):
+ from forms import JobProgressManipulator
+ follow = None
if modelName == "Job":
ModelClass = models.Job
template = 'SeismoWebPortal/job_form.html'
+ follow = {'progress': False}
elif modelName == "OutputFile":
ModelClass = models.OutputFile
template = 'SeismoWebPortal/outputfile_form.html'
@@ -358,9 +361,14 @@
raise Http404
if action == "create":
- manipulator = ModelClass.AddManipulator()
+ manipulator = ModelClass.AddManipulator(follow = follow)
elif action == "update":
- manipulator = ModelClass.ChangeManipulator(object_id)
+ manipulator = ModelClass.ChangeManipulator(object_id, follow = follow)
+ elif action == "progress":
+ if ModelClass is not models.Job:
+ raise Http404
+ manipulator = JobProgressManipulator(object_id)
+ template = 'SeismoWebPortal/job_progress_form.html'
else:
raise Http404
@@ -387,46 +395,69 @@
RequestContext(request, {}))
+def downloadInputFile(request, object_id, filename):
+ run = get_object_or_404(models.Run, id=object_id)
+
+ if run.code == models.Specfem3DGlobeParameters.code:
+ index = {
+ "par_file.txt": par_file_txt,
+ "parameters.pml": parameters_pml,
+ "event.txt": event_txt,
+ "stations.txt": stations_txt,
+ }
+
+ elif run.code == models.MineosParameters.code:
+ index = {
+ "parameters.pml": mineos_parameters_pml,
+ "event.txt": mineos_event_txt,
+ "stations.site": mineos_stations_site,
+ "stations.sitechan": mineos_stations_sitechan,
+ "model.txt": mineos_model_txt,
+ }
+
+ else:
+ assert False
+
+
+ try:
+ view = index[filename]
+ except KeyError:
+ raise Http404
+
+ return view(request, run)
+
+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# daemon interface -- Specfem 3D Globe input file downloads
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-def par_file(request, sim_id):
+def par_file_txt(request, run):
+ parameters = run.parameters
+ parameters.record_length = run.record_length
response = HttpResponse(mimetype='text/plain')
- #response['Content-Disposition'] = 'attachment; filename=parameters.xml'
-
- simulation = get_object_or_404(models.Specfem3DGlobeParameters, id=sim_id)
-
t = loader.get_template('SeismoWebPortal/par_file.txt')
- c = Context({
- 'simulation': simulation,
- })
+ c = Context({'parameters': parameters })
response.write(t.render(c))
return response
-def parameters_pml(request, sim_id):
+def parameters_pml(request, run):
+ parameters = run.parameters
+ parameters.record_length = run.record_length
response = HttpResponse(mimetype='text/xml')
- #response['Content-Disposition'] = 'attachment; filename=parameters.xml'
-
- simulation = get_object_or_404(models.Specfem3DGlobeParameters, id=sim_id)
-
t = loader.get_template('SeismoWebPortal/parameters.pml')
- c = Context({
- 'simulation': simulation,
- })
+ c = Context({'parameters': parameters })
response.write(t.render(c))
return response
-def events_txt(request, sim_id):
-
+def event_txt(request, run):
response = HttpResponse(mimetype='text/plain')
- simulation = get_object_or_404(models.Specfem3DGlobeParameters, id=sim_id)
+ event = run.event
- count = simulation.events.source_set.count()
- for event in simulation.events.source_set.all():
+ count = event.source_set.count()
+ for event in event.source_set.all():
cmtSolution = cmt.CMTSolution.createFromDBModel(event)
# NYI: Specfem requires this to be zero for one
@@ -437,7 +468,7 @@
if count == 1:
cmtSolution.timeShift = 0.0
- if simulation.zero_half_duration:
+ if run.zero_half_duration:
cmtSolution.halfDuration = 0.0
response.write(str(cmtSolution))
@@ -445,73 +476,62 @@
return response
-def stations_txt(request, sim_id):
- response = HttpResponse(mimetype='text/plain')
+def stations_txt(request, run):
+ stations = mezzanine.StationList(run.stationList)
+ return stations.downloadAsText(request)
- simulation = get_object_or_404(models.Specfem3DGlobeParameters, id=sim_id)
- stations = simulation.stations.station_set.all()
- write_stations(stations, response)
-
- return response
-
-
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# daemon interface -- Mineos input file downloads
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-def mineos_parameters_pml(request, sim_id):
+def mineos_parameters_pml(request, run):
+ parameters = run.parameters
+ parameters.nsamples = parameters.nsamples(run)
response = HttpResponse(mimetype='text/xml')
-
- simulation = get_object_or_404(models.Specfem3DGlobeParameters, id=sim_id)
-
t = loader.get_template('SeismoWebPortal/mineos_parameters.pml')
- c = Context({
- 'simulation': simulation,
- })
+ c = Context({'parameters': parameters })
response.write(t.render(c))
return response
-def mineos_event_txt(request, sim_id):
+def mineos_event_txt(request, run):
from math import log10, fabs, pow, ldexp
response = HttpResponse(mimetype='text/plain')
- simulation = get_object_or_404(models.Specfem3DGlobeParameters, id=sim_id)
-
- for source in simulation.events.source_set.all():
- cmt = cmt.CMTSolution.createFromDBModel(source)
+ event = run.event
- logs = [int(log10(fabs(x))) for x in (cmt.Mrr, cmt.Mtt, cmt.Mpp, cmt.Mrt, cmt.Mrp, cmt.Mtp)]
+ for source in event.source_set.all():
+ s = cmt.CMTSolution.createFromDBModel(source)
+
+ logs = [int(log10(fabs(x))) for x in (s.Mrr, s.Mtt, s.Mpp, s.Mrt, s.Mrp, s.Mtp)]
biggestLog = max(logs)
coefficient = pow(10.0, biggestLog)
response.write("%-8s %s %5.2f %5.2f %7.2f %6.2f %3.1f %4.1f %.2e %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %.1e 0 0 0 0 0 0\n" %
(source.eventName[0:8],
- source.when.strftime("%Y %j %H %M"), cmt._second,
- cmt.latitude, cmt.longitude, cmt.depth,
- simulation.step,
- cmt.halfDuration, # negative?
- cmt.scalarSeismicMoment(), # will '+' cause trouble?
- cmt.Mrr / coefficient,
- cmt.Mtt / coefficient,
- cmt.Mpp / coefficient,
- cmt.Mrt / coefficient,
- cmt.Mrp / coefficient,
- cmt.Mtp / coefficient,
+ source.when.strftime("%Y %j %H %M"), s._second,
+ s.latitude, s.longitude, s.depth,
+ run.parameters.step,
+ s.halfDuration, # negative?
+ s.scalarSeismicMoment(), # will '+' cause trouble?
+ s.Mrr / coefficient,
+ s.Mtt / coefficient,
+ s.Mpp / coefficient,
+ s.Mrt / coefficient,
+ s.Mrp / coefficient,
+ s.Mtp / coefficient,
coefficient,
))
return response
-def mineos_stations_site(request, sim_id):
+def mineos_stations_site(request, run):
response = HttpResponse(mimetype='text/plain')
- simulation = get_object_or_404(models.Specfem3DGlobeParameters, id=sim_id)
-
- stations = simulation.stations.station_set.all()
+ stations = run.stationList.station_set.all()
ondate = 0
offdate = -1
statype = refsta = "-"
@@ -528,12 +548,10 @@
return response
-def mineos_stations_sitechan(request, sim_id):
+def mineos_stations_sitechan(request, run):
response = HttpResponse(mimetype='text/plain')
- simulation = get_object_or_404(models.Specfem3DGlobeParameters, id=sim_id)
-
- stations = simulation.stations.station_set.all()
+ stations = run.stationList.station_set.all()
chanid = -1
# Mineos actually cares about the date range. Stations that were
@@ -556,6 +574,12 @@
return response
+def mineos_model_txt(request, run):
+ response = HttpResponse(mimetype='text/plain')
+ response.write(run.parameters.model.data)
+ return response
+
+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# registration
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
More information about the cig-commits
mailing list