[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