[cig-commits] r11879 - in cs/portal/trunk/northridge/SeismoWebPortal: . templates/SeismoWebPortal

leif at geodynamics.org leif at geodynamics.org
Wed Apr 30 21:11:44 PDT 2008


Author: leif
Date: 2008-04-30 21:11:44 -0700 (Wed, 30 Apr 2008)
New Revision: 11879

Added:
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalogs.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodels.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html
Modified:
   cs/portal/trunk/northridge/SeismoWebPortal/forms.py
   cs/portal/trunk/northridge/SeismoWebPortal/models.py
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/events.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/home.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/meshes.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/models.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/settings.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/simulation_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/simulations.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stations.html
   cs/portal/trunk/northridge/SeismoWebPortal/urls.py
   cs/portal/trunk/northridge/SeismoWebPortal/views.py
Log:
Separated Mineos parameters from Specfem parameters; factored-out the
concept of a "mode catalog" (cf. r11272).  Added the ability to upload
Mineos model files (cf. r11629).


Modified: cs/portal/trunk/northridge/SeismoWebPortal/forms.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/forms.py	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/forms.py	2008-05-01 04:11:44 UTC (rev 11879)
@@ -3,10 +3,9 @@
 from django.contrib.auth import authenticate, login
 from django.contrib.auth.models import User
 from django.core import validators
-from models import Mesh, Model, Simulation, Event, DataSource, Region, Source
-from models import UserInfo, Invite
-from cmt import CMTSolution
 
+import cmt
+import models
 
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Simulation
@@ -54,30 +53,30 @@
         return
 
 
-class MeshAddManipulator(Mesh.AddManipulator, MeshManipulator):
+class MeshAddManipulator(models.Mesh.AddManipulator, MeshManipulator):
     def __init__(self, nchunks):
-        Mesh.AddManipulator.__init__(self)
+        models.Mesh.AddManipulator.__init__(self)
         MeshManipulator.__init__(self, nchunks)
 
     def save(self, new_data):
         MeshManipulator.save(self, new_data)
-        return Mesh.AddManipulator.save(self, new_data)
+        return models.Mesh.AddManipulator.save(self, new_data)
 
 
-class MeshChangeManipulator(Mesh.ChangeManipulator, MeshManipulator):
+class MeshChangeManipulator(models.Mesh.ChangeManipulator, MeshManipulator):
     def __init__(self, nchunks, object_id):
-        Mesh.ChangeManipulator.__init__(self, object_id)
+        models.Mesh.ChangeManipulator.__init__(self, object_id)
         MeshManipulator.__init__(self, nchunks)
 
     def flatten_data(self):
-        new_data = Mesh.ChangeManipulator.flatten_data(self)
+        new_data = models.Mesh.ChangeManipulator.flatten_data(self)
         new_data['nproc'] = self.original_object.nproc_xi
         new_data['nex_c'] = self.original_object.nex_xi_c
         return new_data
 
     def save(self, new_data):
         MeshManipulator.save(self, new_data)
-        return Mesh.ChangeManipulator.save(self, new_data)
+        return models.Mesh.ChangeManipulator.save(self, new_data)
 
 
 class RunStatusManipulator(forms.Manipulator):
@@ -115,8 +114,8 @@
 
 def isValidInvitationCode(field_data, all_data):
     try:
-        invite = Invite.objects.get(code = field_data)
-    except Invite.DoesNotExist:
+        invite = models.Invite.objects.get(code = field_data)
+    except models.Invite.DoesNotExist:
         raise validators.ValidationError, "Invalid invitation code."
     if invite.hasExpired():
         raise validators.ValidationError, "This invitation code has expired."
@@ -163,7 +162,7 @@
         invite = None
         inviteCode = new_data['invite']
         if inviteCode:
-            invite = Invite.objects.get(code = inviteCode)
+            invite = models.Invite.objects.get(code = inviteCode)
             approved = True
         
         user, created = User.objects.get_or_create(
@@ -178,7 +177,7 @@
         # Now we're committed to creating the user account.
         user.set_password(new_data['password1'])
         user.save()
-        UserInfo.objects.create(
+        models.UserInfo.objects.create(
             user        = user,
             institution = new_data['institution'],
             address1    = new_data['address1'],
@@ -231,7 +230,7 @@
         new_data.update(self.user.__dict__)
         try:
             userInfo = self.user.userinfo
-        except UserInfo.DoesNotExist:
+        except models.UserInfo.DoesNotExist:
             pass
         else:
             new_data.update(userInfo.__dict__)
@@ -242,8 +241,8 @@
         user = self.user
         try:
             userInfo = user.userinfo
-        except UserInfo.DoesNotExist:
-            userInfo = UserInfo()
+        except models.UserInfo.DoesNotExist:
+            userInfo = models.UserInfo()
             user.userinfo = userInfo
         # Save the new user.
         user.first_name      = new_data['first_name']
@@ -273,7 +272,7 @@
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-class SingleSourceEventAddManipulator(Source.AddManipulator):
+class SingleSourceEventAddManipulator(models.Source.AddManipulator):
 
     def __init__(self):
         super(SingleSourceEventAddManipulator, self).__init__()
@@ -292,12 +291,12 @@
         from datetime import datetime
         
         # Create the new Event.
-        event = Event.objects.create(user = user,
-                                     name = new_data['name'])
+        event = models.Event.objects.create(user = user,
+                                            name = new_data['name'])
 
         # Create the DataSource and Region.
-        dataSource, created = DataSource.objects.get_or_create(name = new_data['dataSource'])
-        region, created = Region.objects.get_or_create(name = new_data['region'])
+        dataSource, created = models.DataSource.objects.get_or_create(name = new_data['dataSource'])
+        region, created = models.Region.objects.get_or_create(name = new_data['region'])
         
         # Add the Source.
         args = {}
@@ -310,12 +309,12 @@
         del args['name']
         del args['when_date']
         del args['when_time']
-        source = Source.objects.create(**args)
+        source = models.Source.objects.create(**args)
 
         return event
 
 
-class SingleSourceEventChangeManipulator(Source.ChangeManipulator):
+class SingleSourceEventChangeManipulator(models.Source.ChangeManipulator):
 
     def __init__(self, event):
         self.event = event
@@ -347,8 +346,8 @@
         event.save()
 
         # Create the DataSource and Region.
-        dataSource, created = DataSource.objects.get_or_create(name = new_data['dataSource'])
-        region, created = Region.objects.get_or_create(name = new_data['region'])
+        dataSource, created = models.DataSource.objects.get_or_create(name = new_data['dataSource'])
+        region, created = models.Region.objects.get_or_create(name = new_data['region'])
 
         source = event.singleSource
         source.dataSource = dataSource
@@ -376,7 +375,7 @@
         if not errors.get('cmtsolution'):
             try:
                 cmtSolution = new_data['cmtsolution']['content']
-                CMTSolution.parse(cmtSolution)
+                cmt.CMTSolution.parse(cmtSolution)
             except Exception, e:
                 errors['cmtsolution'] = ['Please select a file in CMTSOLUTION format.']
 
@@ -386,18 +385,143 @@
 
         # Parse the uploaded CMTSOLUTION file.
         cmtSolution = new_data['cmtsolution']['content']
-        cmtSolutionList = CMTSolution.parse(cmtSolution)
+        cmtSolutionList = cmt.CMTSolution.parse(cmtSolution)
 
         # Create the new event.
-        event = Event.objects.create(user = user,
-                                     name = new_data['name'])
+        event = models.Event.objects.create(user = user,
+                                            name = new_data['name'])
 
         # Add each source.
         for cmtSolution in cmtSolutionList:
-            Source.saveSource(event, cmtSolution)
+            models.Source.saveSource(event, cmtSolution)
 
         return event
 
 
+models.Event.UploadManipulator = UploadEventManipulator
 
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Stations
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+class UploadStationListManipulator(forms.Manipulator):
+    
+    def __init__(self):
+        super(UploadStationListManipulator, self).__init__()
+        self.fields = [
+            forms.TextField('name', maxlength=100, is_required=True),
+            forms.FileUploadField(field_name='stations', is_required=True),
+            ]
+
+    def get_validation_errors(self, new_data):
+        from StringIO import StringIO
+        
+        errors = super(UploadStationListManipulator, self).get_validation_errors(new_data)
+        
+        if not errors.get('stations'):
+            try:
+                stations = new_data['stations']['content']
+                stream = StringIO(stations)
+                parse_station_list(None, stream)
+            except Exception:
+                errors['stations'] = ['Please select a file in STATIONS format.']
+
+        return errors
+
+    def save(self, new_data, user):
+        from StringIO import StringIO
+
+        # Create the new station list.
+        stationList = models.StationList.objects.create(
+            user = user,
+            name = new_data['name'],
+            )
+        
+        # Parse the uploaded STATIONS file.
+        stations = new_data['stations']['content']
+        stream = StringIO(stations)
+        parse_station_list(stationList, stream)
+
+        return stationList
+
+
+models.StationList.UploadManipulator = UploadStationListManipulator 
+
+
+def parse_station_list(stationList, stream):
+
+    for line in stream:
+
+        # parse the line
+        code, network, latitude, longitude, elevation, bur = line.split()
+        latitude, longitude = float(latitude), float(longitude)
+        elevation, bur = float(elevation), float(bur)
+
+        if stationList is None:
+            continue
+
+        # get/create the network entry
+        network, created = models.StationNetwork.objects.get_or_create(code = network, defaults = { 'name': "" })
+
+        # create the station
+        station = models.Station.objects.create(
+            stationList = stationList,
+            code = code,
+            name = "",
+            network = network,
+            status = 1,
+            latitude = latitude,
+            longitude = longitude,
+            elevation = elevation,
+            bur = bur,
+            )
+    return
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Mineos
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+class UploadMineosModelManipulator(forms.Manipulator):
+    
+    def __init__(self):
+        super(UploadMineosModelManipulator, self).__init__()
+        self.fields = [
+            forms.FileUploadField(field_name='model', is_required=True),
+            ]
+
+    def get_validation_errors(self, new_data):
+        
+        errors = super(UploadMineosModelManipulator, self).get_validation_errors(new_data)
+        
+        if not errors.get('model'):
+            try:
+                content = new_data['model']['content']
+                #stream = StringIO(content)
+                #parseMineosModel(None, stream)
+            except Exception:
+                errors['model'] = ['Please select a file in XXX format.']
+
+        return errors
+
+    def save(self, new_data, user):
+
+        # Parse the uploaded MODEL file.
+        content = new_data['model']['content']
+        #stream = StringIO(content)
+        #parseMineosModel(None, stream)
+
+        # Create the new model.
+        model = models.MineosModel.objects.create(data = content)
+        #name = new_data['model']['filename']
+
+        return model
+
+
+models.MineosModel.UploadManipulator = UploadMineosModelManipulator
+
+
 # end of file

Modified: cs/portal/trunk/northridge/SeismoWebPortal/models.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/models.py	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/models.py	2008-05-01 04:11:44 UTC (rev 11879)
@@ -6,7 +6,6 @@
 from managers import CurrentUser, CurrentUserManager
 from middleware import get_current_user
 
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Events
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -495,17 +494,12 @@
     class Admin:
         pass
 
-    
-    # ~~~~~~ #
-    # Mineos #
-    # ~~~~~~ #
 
-    # jcom
-    radial = models.BooleanField(default=True)
-    toroidal = models.BooleanField(default=True)
-    spheroidal = models.BooleanField(default=True)
-    ictoroidal = models.BooleanField(default=True)
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Mineos
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+class MineosModeCatalog(models.Model):
 
     #------------------------------------------------------------------------
     # minos_bran
@@ -530,9 +524,36 @@
     # eigcon
 
     max_depth = models.FloatField(max_digits=19, decimal_places=10, default=1000.0) # km
-    
 
     #------------------------------------------------------------------------
+    # managers
+    objects = models.Manager()
+    user_objects = objects #CurrentUserManager()
+
+
+class MineosModel(models.Model):
+
+    # A Mineos model is a small (15-20K) text file.
+    data = models.TextField()
+
+    #------------------------------------------------------------------------
+    # managers
+    objects = models.Manager()
+    user_objects = objects #CurrentUserManager()
+
+
+class MineosParameters(models.Model):
+
+    catalog = models.ForeignKey(MineosModeCatalog)
+    model = models.ForeignKey(MineosModel)
+
+    # jcom
+    radial = models.BooleanField(default=True)
+    toroidal = models.BooleanField(default=True)
+    spheroidal = models.BooleanField(default=True)
+    ictoroidal = models.BooleanField(default=True)
+
+    #------------------------------------------------------------------------
     # green
 
     fmin = models.FloatField(max_digits=19, decimal_places=10, default=10.0) # mHz
@@ -543,9 +564,10 @@
     
     step = models.FloatField(max_digits=19, decimal_places=10, default=1.0) # seconds
 
-    def nsamples(self):
-        from math import ceil
-        return int(ceil(self.record_length * 60.0 / self.step))
+    #------------------------------------------------------------------------
+    # managers
+    objects = models.Manager()
+    user_objects = objects #CurrentUserManager()
 
 
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/events.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/events.html	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/events.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -6,7 +6,10 @@
 <div class=taskbar>
     <ul>
         <li class=first><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/simulations/">simulations</a>
+        <li><a href="/specfem3dglobe/simulations/">3D</a>
+        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
+        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
+        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
         <li class=selected><a href="/specfem3dglobe/events/">events</a>
         <li><a href="/specfem3dglobe/stations/">stations</a>
         <li><a href="/specfem3dglobe/meshes/">meshes</a>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/home.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/home.html	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/home.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -6,7 +6,10 @@
 <div class=taskbar>
     <ul>
         <li class="first selected"><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/simulations/">simulations</a>
+        <li><a href="/specfem3dglobe/simulations/">3D</a>
+        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
+        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
+        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
         <li><a href="/specfem3dglobe/events/">events</a>
         <li><a href="/specfem3dglobe/stations/">stations</a>
         <li><a href="/specfem3dglobe/meshes/">meshes</a>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/meshes.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/meshes.html	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/meshes.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -6,7 +6,10 @@
 <div class=taskbar>
     <ul>
         <li class=first><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/simulations/">simulations</a>
+        <li><a href="/specfem3dglobe/simulations/">3D</a>
+        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
+        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
+        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
         <li><a href="/specfem3dglobe/events/">events</a>
         <li><a href="/specfem3dglobe/stations/">stations</a>
         <li class=selected><a href="/specfem3dglobe/meshes/">meshes</a>

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -0,0 +1,77 @@
+
+{% extends "SeismoWebPortal/mineosmodecatalogs.html" %}
+
+{% block content %}
+
+<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} Mineos mode catalog</h2>
+
+<div class=toolbar>
+    <form method="post" action="/specfem3dglobe/help/toggle/">
+        <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
+        {% if help_visible %}
+        <input type="submit" name="hide_help" value="Hide Help" />
+        {% else %}
+        <input type="submit" name="show_help" value="Show Help" />
+        {% endif %}
+    </form>
+
+    {% if object %}
+    <form action="../delete/" method="get"><input type="submit" value="Delete" /></form>
+    {% endif %}
+
+</div>
+
+<form method="post" action=".">
+
+    {% if form.has_errors %}
+    <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
+    {% endif %}
+
+    <div class=tab30ex>
+
+    <div>
+        <label for="id_eps" class=before>eps</label>
+        {{ form.eps }}
+        {% if form.eps.errors %}<span class=error>{{ form.eps.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>The parameter <code>eps</code> controls the accuracy of the Runge-Kutta integration scheme. The relative accuracy 
+of an eigenfrequency is a factor 2 to 3 times <code>eps</code>. Parameter <code>eps</code> also controls the precision with which 
+a root is found and the minimum relative separation of two roots with the same angular order. It is 
+safe to set eps = 10<span style="vertical-align: super">-7</span> for periods greater than 10 seconds. For periods between 5 and 10 seconds, it 
+has to be set to 10<span style="vertical-align: super">-12</span>&mdash;10<span style="vertical-align: super">-10</span>.</span>{% endif %}
+    </div>
+
+    <p><label for="id_max_depth" class=before>maximum depth</label> {{ form.max_depth }} km
+       {% if form.max_depth.errors %}<span class=error>{{ form.max_depth.errors|join:", " }}</span>{% endif %}
+       {% if help_visible %}<span class=help>Maximum depth, d<span style="vertical-align: sub">max</span>, to cut all output eigenfunctions (in km). All output values exist in the interval 
+(r<span style="vertical-align: sub">n</span>, r<span style="vertical-align: sub">n</span> - d<span style="vertical-align: sub">max</span>) only, where r<span style="vertical-align: sub">n</span> is the radius of the free surface in km.</span>{% endif %}
+
+    </div> <!-- tab30ex -->
+
+
+    <p>Neglect gravitational terms above {{ form.wgrav }} mHz. {% if form.wgrav.errors %}<span class=error>{{ form.wgrav.errors|join:", " }}</span>{% endif %}
+       {% if help_visible %}<span class=help>This gives about a factor of 3 increase in speed.</span>{% endif %}
+
+    <p><label for="id_lmin" class=before>angular orders</label> {{ form.lmin }} <= l < {{ form.lmax }}
+       {% if form.lmin.errors %}<span class=error>{{ form.lmin.errors|join:", " }}</span>{% endif %}
+       {% if form.lmax.errors %}<span class=error>{{ form.lmax.errors|join:", " }}</span>{% endif %}
+       {% if help_visible %}<span class=help>The range of angular orders l to be computed. For radial modes, this range is not used.</span>{% endif %}
+
+    <p><label for="id_wmin" class=before>compute frequency range</label> {{ form.wmin }} <= w < {{ form.wmax }} mHz
+       {% if form.wmin.errors %}<span class=error>{{ form.wmin.errors|join:", " }}</span>{% endif %}
+       {% if form.wmax.errors %}<span class=error>{{ form.wmax.errors|join:", " }}</span>{% endif %}
+       {% if help_visible %}<span class=help>The frequency range to be computed (in millihertz).</span>{% endif %}
+
+    <p><label for="id_nmin" class=before>dispersion branch numbers</label> {{ form.nmin }} <= n < {{ form.nmax }}
+       {% if form.nmin.errors %}<span class=error>{{ form.nmin.errors|join:", " }}</span>{% endif %}
+       {% if form.nmax.errors %}<span class=error>{{ form.nmax.errors|join:", " }}</span>{% endif %}
+       {% if help_visible %}<span class=help>The range of dispersion branch numbers n to be computed; n = 0 is the fundamental mode.</span>{% endif %}
+
+
+    <div class=tab30ex>
+
+    <div><input class=submit type="submit" name="save" value="Save" />
+    </div>
+
+</form>
+
+{% endblock %}

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -0,0 +1,51 @@
+
+{% extends "SeismoWebPortal/mineosmodecatalogs.html" %}
+
+{% block content %}
+
+<div class=toolbar>
+    <form action="create/" method="get"><input type="submit" value="New..." /></form>
+</div>
+
+{% if object_list %}
+
+<table rules=cols class=cool width="100%">
+    <thead>
+    <tr>
+        <th rowspan=2 valign=bottom>eps</th>
+        <th rowspan=2 valign=bottom>wgrav<br><small>(mHz)</small></th>
+        <th colspan=2 valign=bottom><center>angular<br>orders</center></th>
+        <th colspan=2 valign=bottom><center>compute<br>frequency<br>range<br><small>(mHz)</small></center></th>
+        <th colspan=2 valign=bottom><center>dispersion<br>branch<br>numbers</center></th>
+    </tr>
+    <tr>
+        <th valign=bottom><small>min</small></th>
+        <th valign=bottom><small>max</small></th>
+        <th valign=bottom><small>min</small></th>
+        <th valign=bottom><small>max</small></th>
+        <th valign=bottom><small>min</small></th>
+        <th valign=bottom><small>max</small></th>
+    </tr>
+    </thead>
+
+    <tbody>
+    {% for object in object_list %}
+    <tr class="{% cycle odd,even %}">
+        <td>{{ object.eps }}</td>
+        <td>{{ object.wgrav }}</td>
+        <td>{{ object.lmin }}</td>
+        <td>{{ object.lmax }}</td>
+        <td>{{ object.wmin }}</td>
+        <td>{{ object.wmax }}</td>
+        <td>{{ object.nmin }}</td>
+        <td>{{ object.nmax }}</td>
+    </tr>
+    {% endfor %}
+    </tbody>
+</table>
+
+{% else %}
+    <p>You have no Mineos mode catalogs.
+{% endif %}
+
+{% endblock %}

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalogs.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalogs.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalogs.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -0,0 +1,26 @@
+
+{% extends "SeismoWebPortal/base.html" %}
+
+{% block desktop %}
+
+<div class=taskbar>
+    <ul>
+        <li class=first><a href="/specfem3dglobe/">home</a>
+        <li><a href="/specfem3dglobe/simulations/">3D</a>
+        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
+        <li class=selected><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
+        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
+        <li><a href="/specfem3dglobe/events/">events</a>
+        <li><a href="/specfem3dglobe/stations/">stations</a>
+        <li><a href="/specfem3dglobe/meshes/">meshes</a>
+        <li><a href="/specfem3dglobe/models/">models</a>
+        <li><a href="/specfem3dglobe/registration/">profile</a>
+    </ul>
+</div>
+
+<h1 class=titlebar>mineos mode catalogs</h1>
+
+{% block content %}
+{% endblock %}
+
+{% endblock %}

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -0,0 +1,32 @@
+
+{% extends "SeismoWebPortal/mineosmodels.html" %}
+
+{% block content %}
+
+<div class=toolbar>
+    <form action="upload/" method="get"><input type="submit" value="Upload..." /></form>
+</div>
+
+{% if object_list %}
+
+<table rules=cols class=cool width="100%">
+    <thead>
+    <tr>
+        <th>name</th>
+    </tr>
+    </thead>
+
+    <tbody>
+    {% for object in object_list %}
+    <tr class="{% cycle odd,even %}">
+        <td>{{ object }}</td>
+    </tr>
+    {% endfor %}
+    </tbody>
+</table>
+
+{% else %}
+    <p>You have no Mineos models.
+{% endif %}
+
+{% endblock %}

Copied: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html (from rev 11876, cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html)
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -0,0 +1,30 @@
+
+{% extends "SeismoWebPortal/mineosmodels.html" %}
+
+{% block content %}
+
+<h2 class=titlebar>upload mineos model</h2>
+
+<form action="/specfem3dglobe/mineosmodels/upload/" method="POST" enctype="multipart/form-data">
+
+    {% if form.has_errors %}
+    <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
+    {% endif %}
+
+    <div class=tab30ex>
+
+    <div>
+        <label for="id_model" class=before>local file to upload</label>
+        {{ form.model }} {{ form.model_file }}
+        {% if form.model.errors %}<span class=error>{{ form.model.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
+        <input class=submit type="submit" value="Upload">
+    </div>
+
+    </div> <!-- tab30ex -->
+
+</form>
+
+{% endblock %}

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodels.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodels.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodels.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -0,0 +1,26 @@
+
+{% extends "SeismoWebPortal/base.html" %}
+
+{% block desktop %}
+
+<div class=taskbar>
+    <ul>
+        <li class=first><a href="/specfem3dglobe/">home</a>
+        <li><a href="/specfem3dglobe/simulations/">3D</a>
+        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
+        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
+        <li class=selected><a href="/specfem3dglobe/mineosmodels/">1D models</a>
+        <li><a href="/specfem3dglobe/events/">events</a>
+        <li><a href="/specfem3dglobe/stations/">stations</a>
+        <li><a href="/specfem3dglobe/meshes/">meshes</a>
+        <li><a href="/specfem3dglobe/models/">models</a>
+        <li><a href="/specfem3dglobe/registration/">profile</a>
+    </ul>
+</div>
+
+<h1 class=titlebar>mineos models</h1>
+
+{% block content %}
+{% endblock %}
+
+{% endblock %}

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -0,0 +1,26 @@
+
+{% extends "SeismoWebPortal/base.html" %}
+
+{% block desktop %}
+
+<div class=taskbar>
+    <ul>
+        <li class=first><a href="/specfem3dglobe/">home</a>
+        <li><a href="/specfem3dglobe/simulations/">3D</a>
+        <li class=selected><a href="/specfem3dglobe/mineosparameters/">1D</a>
+        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
+        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
+        <li><a href="/specfem3dglobe/events/">events</a>
+        <li><a href="/specfem3dglobe/stations/">stations</a>
+        <li><a href="/specfem3dglobe/meshes/">meshes</a>
+        <li><a href="/specfem3dglobe/models/">models</a>
+        <li><a href="/specfem3dglobe/registration/">profile</a>
+    </ul>
+</div>
+
+<h1 class=titlebar>mineos parameters</h1>
+
+{% block content %}
+{% endblock %}
+
+{% endblock %}

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -0,0 +1,95 @@
+
+{% extends "SeismoWebPortal/mineosparameters.html" %}
+
+{% block content %}
+
+<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} Mineos parameters</h2>
+
+<div class=toolbar>
+    <form method="post" action="/specfem3dglobe/help/toggle/">
+        <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
+        {% if help_visible %}
+        <input type="submit" name="hide_help" value="Hide Help" />
+        {% else %}
+        <input type="submit" name="show_help" value="Show Help" />
+        {% endif %}
+    </form>
+
+    {% if object %}
+    <form action="../delete/" method="get"><input type="submit" value="Delete" /></form>
+    {% endif %}
+
+</div>
+
+<form method="post" action=".">
+
+    {% if form.has_errors %}
+    <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
+    {% endif %}
+
+    <div class=tab30ex>
+
+    <div>
+        <label for="id_catalog" class=before>catalog</label>
+        {{ form.catalog }}
+        {% if form.catalog.errors %}<span class=error>{{ form.catalog.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
+        <label for="id_model" class=before>model</label>
+        {{ form.model }}
+        {% if form.model.errors %}<span class=error>{{ form.model.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <fieldset><legend>oscillations</legend>
+
+    <div class=checkbox>
+        {{ form.radial }}
+        <label for="id_radial" class=after>radial</label>
+        {% if form.radial.errors %}<span class=error>{{ form.radial.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.toroidal }}
+        <label for="id_toroidal" class=after>toroidal</label>
+        {% if form.toroidal.errors %}<span class=error>{{ form.toroidal.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.spheroidal }}
+        <label for="id_spheroidal" class=after>spheroidal</label>
+        {% if form.spheroidal.errors %}<span class=error>{{ form.spheroidal.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.ictoroidal }}
+        <label for="id_ictoroidal" class=after>inner core toroidal</label>
+        {% if form.ictoroidal.errors %}<span class=error>{{ form.ictoroidal.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    </fieldset> <!-- oscillations -->
+
+    </div> <!-- tab30ex -->
+
+    <p><label for="id_fmin" class=before>select frequency range</label> {{ form.fmin }} <= f < {{ form.fmax }} mHz
+       {% if form.fmin.errors %}<span class=error>{{ form.fmin.errors|join:", " }}</span>{% endif %}
+       {% if form.fmax.errors %}<span class=error>{{ form.fmax.errors|join:", " }}</span>{% endif %}
+       {% if help_visible %}<span class=help>The frequency range to be selected from the input eigenfunction databases. All 
+modes with frequencies out of this range are rejected.</span>{% endif %}
+
+    <p><label for="id_step" class=before>sampling period</label> {{ form.step }} s
+       {% if form.step.errors %}<span class=error>{{ form.step.errors|join:", " }}</span>{% endif %}
+       {% if help_visible %}<span class=help>This determines the number of samples in the synthetic seismograms. All synthetic seismograms start from the 
+source time.</span>{% endif %}
+
+
+    <div class=tab30ex>
+
+    <div><input class=submit type="submit" name="save" value="Save" />
+    </div>
+
+    </div> <!-- tab30ex -->
+
+</form>
+
+{% endblock %}

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -0,0 +1,55 @@
+
+{% extends "SeismoWebPortal/mineosparameters.html" %}
+
+{% block content %}
+
+<div class=toolbar>
+    <form action="create/" method="get"><input type="submit" value="New..." /></form>
+</div>
+
+{% if object_list %}
+
+<table rules=cols class=cool width="100%">
+    <thead>
+    <tr>
+        <th rowspan=3 valign=bottom>model</th>
+        <th rowspan=3 valign=bottom>mode catalog</th>
+        <th colspan=4 valign=bottom>oscillations</th>
+        <th colspan=2 rowspan=2 valign=bottom><center>select<br>frequency<br>range<br><small>(mHz)</small></center></th>
+        <th rowspan=3 valign=bottom>sampling<br>period</th>
+    </tr>
+    <tr>
+        <th valign=bottom rowspan=2>radial</th>
+        <th valign=bottom rowspan=2>toroidal</th>
+        <th valign=bottom rowspan=2>spheroidal</th>
+        <th valign=bottom rowspan=2>ictoroidal</th>
+    </tr>
+    <tr>
+        <th valign=bottom><small>min</small></th>
+        <th valign=bottom><small>max</small></th>
+    </tr>
+    </thead>
+
+    <tbody>
+    {% for object in object_list %}
+    <tr class="{% cycle odd,even %}">
+        <td>{{ object.model }}</td>
+        <td>{{ object.catalog }}</td>
+        <td><img src="{{ root }}/pics/icon-{% if object.radial %}yes{% else %}no{% endif %}.gif" alt="{{ object.radial }}"></td>
+        <td><img src="{{ root }}/pics/icon-{% if object.toroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.toroidal }}"></td>
+        <td><img src="{{ root }}/pics/icon-{% if object.spheroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.spheroidal }}"></td>
+        <td><img src="{{ root }}/pics/icon-{% if object.ictoroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.ictoroidal }}"></td>
+        <td>{{ object.fmin }}</td>
+        <td>{{ object.fmax }}</td>
+        <td>{{ object.step }}</td>
+    </tr>
+    {% endfor %}
+    </tbody>
+</table>
+
+{% else %}
+    <p>You have no Mineos parameters.
+{% endif %}
+
+{% endblock %}
+

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/models.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/models.html	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/models.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -6,7 +6,10 @@
 <div class=taskbar>
     <ul>
         <li class=first><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/simulations/">simulations</a>
+        <li><a href="/specfem3dglobe/simulations/">3D</a>
+        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
+        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
+        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
         <li><a href="/specfem3dglobe/events/">events</a>
         <li><a href="/specfem3dglobe/stations/">stations</a>
         <li><a href="/specfem3dglobe/meshes/">meshes</a>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/settings.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/settings.html	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/settings.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -6,7 +6,10 @@
 <div class=taskbar>
     <ul>
         <li class=first><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/simulations/">simulations</a>
+        <li><a href="/specfem3dglobe/simulations/">3D</a>
+        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
+        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
+        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
         <li><a href="/specfem3dglobe/events/">events</a>
         <li><a href="/specfem3dglobe/stations/">stations</a>
         <li><a href="/specfem3dglobe/meshes/">meshes</a>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/simulation_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/simulation_form.html	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/simulation_form.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -138,90 +138,7 @@
     <input type="hidden" name="hdur_movie" value="0">
     {% endif %}
 
-    </div> <!-- tab30ex -->
 
-    <fieldset><legend>1D synthetics</legend>
-
-    <p>1D synthetics are generated using the PREM earth model, both with and without an ocean.
-
-    <fieldset><legend>oscillations</legend>
-
-    <div class=checkbox>
-        {{ form.radial }}
-        <label for="id_radial" class=after>radial</label>
-        {% if form.radial.errors %}<span class=error>{{ form.radial.errors|join:", " }}</span>{% endif %}
-    </div>
-
-    <div class=checkbox>
-        {{ form.toroidal }}
-        <label for="id_toroidal" class=after>toroidal</label>
-        {% if form.toroidal.errors %}<span class=error>{{ form.toroidal.errors|join:", " }}</span>{% endif %}
-    </div>
-
-    <div class=checkbox>
-        {{ form.spheroidal }}
-        <label for="id_spheroidal" class=after>spheroidal</label>
-        {% if form.spheroidal.errors %}<span class=error>{{ form.spheroidal.errors|join:", " }}</span>{% endif %}
-    </div>
-
-    <div class=checkbox>
-        {{ form.ictoroidal }}
-        <label for="id_ictoroidal" class=after>inner core toroidal</label>
-        {% if form.ictoroidal.errors %}<span class=error>{{ form.ictoroidal.errors|join:", " }}</span>{% endif %}
-    </div>
-
-    </fieldset> <!-- oscillations -->
-
-    <div>
-        <label for="id_eps" class=before>eps</label>
-        {{ form.eps }}
-        {% if form.eps.errors %}<span class=error>{{ form.eps.errors|join:", " }}</span>{% endif %}
-        {% if help_visible %}<span class=help>The parameter <code>eps</code> controls the accuracy of the Runge-Kutta integration scheme. The relative accuracy 
-of an eigenfrequency is a factor 2 to 3 times <code>eps</code>. Parameter <code>eps</code> also controls the precision with which 
-a root is found and the minimum relative separation of two roots with the same angular order. It is 
-safe to set eps = 10<span style="vertical-align: super">-7</span> for periods greater than 10 seconds. For periods between 5 and 10 seconds, it 
-has to be set to 10<span style="vertical-align: super">-12</span>&mdash;10<span style="vertical-align: super">-10</span>.</span>{% endif %}
-    </div>
-
-    <p>Neglect gravitational terms above {{ form.wgrav }} mHz. {% if form.wgrav.errors %}<span class=error>{{ form.wgrav.errors|join:", " }}</span>{% endif %}
-       {% if help_visible %}<span class=help>This gives about a factor of 3 increase in speed.</span>{% endif %}
-
-    <p><label for="id_lmin" class=before>angular orders</label> {{ form.lmin }} <= l < {{ form.lmax }}
-       {% if form.lmin.errors %}<span class=error>{{ form.lmin.errors|join:", " }}</span>{% endif %}
-       {% if form.lmax.errors %}<span class=error>{{ form.lmax.errors|join:", " }}</span>{% endif %}
-       {% if help_visible %}<span class=help>The range of angular orders l to be computed. For radial modes, this range is not used.</span>{% endif %}
-
-    <p><label for="id_wmin" class=before>compute frequency range</label> {{ form.wmin }} <= w < {{ form.wmax }} mHz
-       {% if form.wmin.errors %}<span class=error>{{ form.wmin.errors|join:", " }}</span>{% endif %}
-       {% if form.wmax.errors %}<span class=error>{{ form.wmax.errors|join:", " }}</span>{% endif %}
-       {% if help_visible %}<span class=help>The frequency range to be computed (in millihertz).</span>{% endif %}
-
-    <p><label for="id_nmin" class=before>dispersion branch numbers</label> {{ form.nmin }} <= n < {{ form.nmax }}
-       {% if form.nmin.errors %}<span class=error>{{ form.nmin.errors|join:", " }}</span>{% endif %}
-       {% if form.nmax.errors %}<span class=error>{{ form.nmax.errors|join:", " }}</span>{% endif %}
-       {% if help_visible %}<span class=help>The range of dispersion branch numbers n to be computed; n = 0 is the fundamental mode.</span>{% endif %}
-
-    <p><label for="id_max_depth" class=before>maximum depth</label> {{ form.max_depth }} km
-       {% if form.max_depth.errors %}<span class=error>{{ form.max_depth.errors|join:", " }}</span>{% endif %}
-       {% if help_visible %}<span class=help>Maximum depth, d<span style="vertical-align: sub">max</span>, to cut all output eigenfunctions (in km). All output values exist in the interval 
-(r<span style="vertical-align: sub">n</span>, r<span style="vertical-align: sub">n</span> - d<span style="vertical-align: sub">max</span>) only, where r<span style="vertical-align: sub">n</span> is the radius of the free surface in km.</span>{% endif %}
-
-    <p><label for="id_fmin" class=before>select frequency range</label> {{ form.fmin }} <= f < {{ form.fmax }} mHz
-       {% if form.fmin.errors %}<span class=error>{{ form.fmin.errors|join:", " }}</span>{% endif %}
-       {% if form.fmax.errors %}<span class=error>{{ form.fmax.errors|join:", " }}</span>{% endif %}
-       {% if help_visible %}<span class=help>The frequency range to be selected from the input eigenfunction databases. All 
-modes with frequencies out of this range are rejected.</span>{% endif %}
-
-    <p><label for="id_step" class=before>sampling period</label> {{ form.step }} s
-       {% if form.step.errors %}<span class=error>{{ form.step.errors|join:", " }}</span>{% endif %}
-       {% if help_visible %}<span class=help>This determines the number of samples in the synthetic seismograms. All synthetic seismograms start from the 
-source time.</span>{% endif %}
-
-    </fieldset> <!-- 1D synthetics -->
-
-
-    <div class=tab30ex>
-
     <div><input class=submit type="submit" name="save" value="Save" />
          <input class=submit type="submit" name="save_and_run" value="Save & Run" {% if not user.userinfo.approved %}DISABLED{% endif %} />
     </div>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/simulations.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/simulations.html	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/simulations.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -6,7 +6,10 @@
 <div class=taskbar>
     <ul>
         <li class=first><a href="/specfem3dglobe/">home</a>
-        <li class=selected><a href="/specfem3dglobe/simulations/">simulations</a>
+        <li class=selected><a href="/specfem3dglobe/simulations/">3D</a>
+        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
+        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
+        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
         <li><a href="/specfem3dglobe/events/">events</a>
         <li><a href="/specfem3dglobe/stations/">stations</a>
         <li><a href="/specfem3dglobe/meshes/">meshes</a>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stations.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stations.html	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stations.html	2008-05-01 04:11:44 UTC (rev 11879)
@@ -6,7 +6,10 @@
 <div class=taskbar>
     <ul>
         <li class=first><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/simulations/">simulations</a>
+        <li><a href="/specfem3dglobe/simulations/">3D</a>
+        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
+        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
+        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
         <li><a href="/specfem3dglobe/events/">events</a>
         <li class=selected><a href="/specfem3dglobe/stations/">stations</a>
         <li><a href="/specfem3dglobe/meshes/">meshes</a>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/urls.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/urls.py	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/urls.py	2008-05-01 04:11:44 UTC (rev 11879)
@@ -2,58 +2,44 @@
 import os
 
 from django.conf.urls.defaults import *
-from models import Mesh, Model, Simulation, UserInfo
-from models import Event, Source
-from models import Station, StationList, StationNetwork
-from models import Run, Job, OutputFile
+import models
 
 # Static Paths
-static_media_root = os.environ.get("WEBPORTAL_MEDIA_ROOT")+'/static'
+STATIC_ROOT = os.path.join(os.path.dirname(__file__), "static")
 
 
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Meshes, Models, Simulations
+# Generic
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-# Mesh
+def list_detail_args(ModelClass):
+    if hasattr(ModelClass, 'user_objects'):
+        queryset = ModelClass.user_objects.all()
+    else:
+        queryset = ModelClass.objects.all()
+    return dict(
+        queryset = queryset,
+        allow_empty = True,
+        )
 
+def cu_args(ModelClass, subdir):
+    return dict(
+        model = ModelClass,
+        post_save_redirect = ('/specfem3dglobe/%s/' % subdir),
+        )
 
-mesh_list_detail_args = {
-    'queryset': Mesh.user_objects.all(),
-    'allow_empty': True,
-}
+def delete_args(ModelClass, subdir):
+    return dict(
+        model = ModelClass,
+        post_delete_redirect = ('/specfem3dglobe/%s/' % subdir),
+        )
 
-mesh_delete_args = {
-    'model': Mesh,
-    'post_delete_redirect': '/specfem3dglobe/meshes/',
-}
+def upload_args(ModelClass):
+    return dict(
+        model = ModelClass,
+        )
 
-
-
-# Model
-
-model_list_detail_args = {
-    'queryset': Model.user_objects.all(),
-    'allow_empty': True,
-}
-
-model_delete_args = {
-    'model': Model,
-    'post_delete_redirect': '/specfem3dglobe/models/',
-}
-
-
-
-# Simulation
-
-simulation_delete_args = {
-    'model': Simulation,
-    'post_delete_redirect': '/specfem3dglobe/simulations/',
-}
-
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Registration
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -70,49 +56,28 @@
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-event_list_detail_args = {
-    'queryset': Event.user_objects.all(),
-    'allow_empty': True,
-}
-
 event_detail_args = {
-    'queryset': Event.user_objects.all(),
-    'extra_context': { 'object_list': Event.user_objects.all() },
+    'queryset': models.Event.user_objects.all(),
+    'extra_context': { 'object_list': models.Event.user_objects.all() },
 }
 
-event_delete_args = {
-    'model': Event,
-    'post_delete_redirect': '/specfem3dglobe/events/',
-    }
-
 source_detail_args = {
-    'queryset': Source.objects.all(),
+    'queryset': models.Source.objects.all(),
 }
 
 source_create_update_args = {
-    'model': Source,
+    'model': models.Source,
     'post_save_redirect': '/specfem3dglobe/events/',
     }
 
-source_delete_args = {
-    'model': Source,
-    'post_delete_redirect': '/specfem3dglobe/events/',
-    }
 
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Stations
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-stationlist_delete_args = {
-    'model': StationList,
-    'post_delete_redirect': '/specfem3dglobe/stations/',
-    }
-
-
 stationlist_create_update_args = {
-    'model': StationList,
+    'model': models.StationList,
     'post_save_redirect': '/specfem3dglobe/stations/',
     'follow': { 'user': False },
     }
@@ -123,10 +88,6 @@
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-run_list_detail_args = {
-    'queryset': Run.objects.all(),
-    'allow_empty': True,
-}
 
 
 
@@ -145,22 +106,22 @@
     (r'^registration/$', 'SeismoWebPortal.views.registration'),
     (r'^registration/password/$', 'SeismoWebPortal.views.password_change', password_change_args),
 
-    (r'^meshes/$', 'django.views.generic.list_detail.object_list', mesh_list_detail_args),
+    (r'^meshes/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.Mesh)),
     (r'^meshes/create/$', 'SeismoWebPortal.views.create_mesh'),
     (r'^meshes/create/(?P<nchunks>\d+)/$', 'SeismoWebPortal.views.manipulate_mesh', dict(action='create')),
     (r'^meshes/(?P<object_id>\d+)/$', 'SeismoWebPortal.views.manipulate_mesh', dict(action='edit')),
-    (r'^meshes/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', mesh_delete_args),
+    (r'^meshes/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.Mesh, 'meshes')),
 
-    (r'^models/$', 'django.views.generic.list_detail.object_list', model_list_detail_args),
+    (r'^models/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.Model)),
     (r'^models/create/$', 'SeismoWebPortal.views.create_model'),
     (r'^models/(?P<object_id>\d+)/$', 'SeismoWebPortal.views.update_model'),
-    (r'^models/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', model_delete_args),
+    (r'^models/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.Model, 'models')),
 
     (r'^simulations/$', 'SeismoWebPortal.views.simulation_index'),
     (r'^simulations/create/$', 'SeismoWebPortal.views.create_simulation'),
     (r'^simulations/(?P<object_id>\d+)/$', 'SeismoWebPortal.views.simulation_detail'),
     (r'^simulations/(?P<object_id>\d+)/edit/$', 'SeismoWebPortal.views.update_simulation'),
-    (r'^simulations/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', simulation_delete_args),
+    (r'^simulations/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.Simulation, 'simulations')),
     (r'^simulations/(?P<object_id>\d+)/run/$', 'SeismoWebPortal.views.run_simulation'),
     (r'^simulations/(?P<sim_id>\d+)/par_file\.txt$', 'SeismoWebPortal.views.par_file'),
     (r'^simulations/(?P<sim_id>\d+)/parameters\.pml$', 'SeismoWebPortal.views.parameters_pml'),
@@ -171,35 +132,50 @@
     (r'^simulations/(?P<sim_id>\d+)/mineos/stations\.site$', 'SeismoWebPortal.views.mineos_stations_site'),
     (r'^simulations/(?P<sim_id>\d+)/mineos/stations\.sitechan$', 'SeismoWebPortal.views.mineos_stations_sitechan'),
 
+    (r'^mineosparameters/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.MineosParameters)),
+    (r'^mineosparameters/create/$', 'django.views.generic.create_update.create_object', cu_args(models.MineosParameters, 'mineosparameters')),
+    (r'^mineosparameters/(?P<object_id>\d+)/$', 'django.views.generic.create_update.update_object', cu_args(models.MineosParameters, 'mineosparameters')),
+    (r'^mineosparameters/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.MineosParameters, 'mineosparameters')),
+
+    (r'^mineosmodecatalogs/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.MineosModeCatalog)),
+    (r'^mineosmodecatalogs/create/$', 'django.views.generic.create_update.create_object', cu_args(models.MineosModeCatalog, 'mineosmodecatalogs')),
+    (r'^mineosmodecatalogs/(?P<object_id>\d+)/$', 'django.views.generic.create_update.update_object', cu_args(models.MineosModeCatalog, 'mineosmodecatalogs')),
+    (r'^mineosmodecatalogs/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.MineosModeCatalog, 'mineosmodecatalogs')),
+
+    (r'^mineosmodels/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.MineosModel)),
+    (r'^mineosmodels/upload/$', 'SeismoWebPortal.views.upload', upload_args(models.MineosModel)),
+    (r'^mineosmodels/(?P<object_id>\d+)/$', 'django.views.generic.create_update.update_object', cu_args(models.MineosModel, 'mineosmodels')),
+    (r'^mineosmodels/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.MineosModel, 'mineosmodels')),
+
     # events
-    (r'^events/$', 'django.views.generic.list_detail.object_list', event_list_detail_args),
+    (r'^events/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.Event)),
     (r'^events/search/$', 'SeismoWebPortal.views.event_search'),
     (r'^events/create/$', 'SeismoWebPortal.views.manipulate_event', dict(action='create')),
-    (r'^events/upload/$', 'SeismoWebPortal.views.upload_event'),
+    (r'^events/upload/$', 'SeismoWebPortal.views.upload', upload_args(models.Event)),
     (r'^events/sources/(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', source_detail_args),
     (r'^events/sources/(?P<object_id>\d+)/edit/$', 'django.views.generic.create_update.update_object', source_create_update_args),
-    (r'^events/sources/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', source_delete_args),
+    (r'^events/sources/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.Source, 'events')),
     (r'^events/sources/(?P<object_id>\d+)/CMTSOLUTION\.txt$', 'SeismoWebPortal.views.cmtsolution_txt'),
     (r'^events/sources/(?P<object_id>\d+)/beachball\.gif$', 'SeismoWebPortal.views.beachball_gif'),
     (r'^events/(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', event_detail_args),
     (r'^events/(?P<object_id>\d+)/edit/$', 'SeismoWebPortal.views.manipulate_event', dict(action='edit')),
-    (r'^events/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', event_delete_args),
+    (r'^events/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.Event, 'events')),
     (r'^events/(?P<object_id>\d+)/CMTSOLUTION\.txt$','SeismoWebPortal.views.event_detail_cmtsolution_txt'),
     (r'^events/(?P<object_id>\d+)/gearth\.kml$','SeismoWebPortal.views.event_detail_gearth'),
 
     # stations
     (r'^stations/$', 'SeismoWebPortal.views.station_index'),
-    (r'^stations/upload/$', 'SeismoWebPortal.views.upload_station_list'),
-    (r'^stations/(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', {'queryset': StationList.user_objects.all()}),
+    (r'^stations/upload/$', 'SeismoWebPortal.views.upload', upload_args(models.StationList)),
+    (r'^stations/(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', {'queryset': models.StationList.user_objects.all()}),
     (r'^stations/(?P<object_id>\d+)/edit/$', 'django.views.generic.create_update.update_object', stationlist_create_update_args),
-    (r'^stations/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', stationlist_delete_args),
+    (r'^stations/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.StationList, 'stations')),
     (r'^stations/(?P<object_id>\d+)/stations\.txt$','SeismoWebPortal.views.stationlist_detail_txt'),
     (r'^stations/(?P<object_id>\d+)/gearth\.kml$','SeismoWebPortal.views.stationlist_detail_gearth'),
 
     # runs
-    (r'^runs/list\.py$', 'django.views.generic.list_detail.object_list', dict(run_list_detail_args,
-                                                                             template_name='SeismoWebPortal/run_list.py',
-                                                                             mimetype='text/plain')),
+    (r'^runs/list\.py$', 'django.views.generic.list_detail.object_list', dict(list_detail_args(models.Run),
+                                                                              template_name='SeismoWebPortal/run_list.py',
+                                                                              mimetype='text/plain')),
     (r'^runs/(?P<object_id>\d+)/status/$', 'SeismoWebPortal.views.update_run_status'),
 
     # jobs
@@ -212,7 +188,7 @@
     # help
     (r'^help/toggle/$', 'SeismoWebPortal.views.help_toggle'),
 
-    (r'^(.*)', 'django.views.static.serve', {'document_root':static_media_root}),
+    (r'^(.*)', 'django.views.static.serve', {'document_root': STATIC_ROOT}),
 )
 
 

Modified: cs/portal/trunk/northridge/SeismoWebPortal/views.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/views.py	2008-05-01 00:51:25 UTC (rev 11878)
+++ cs/portal/trunk/northridge/SeismoWebPortal/views.py	2008-05-01 04:11:44 UTC (rev 11879)
@@ -685,11 +685,10 @@
 manipulate_event = login_required(manipulate_event)
 
 
-def upload_event(request):
-    from forms import UploadEventManipulator
+def upload(request, model):
     from os.path import dirname
     
-    manipulator = UploadEventManipulator()
+    manipulator = model.UploadManipulator()
     help_visible = get_help_visible(request)
     
     if request.method == 'POST':
@@ -706,16 +705,18 @@
             errors = manipulator.get_validation_errors(new_data)
             if not errors:
                 manipulator.do_html2python(new_data)
-                new_event = manipulator.save(new_data, request.user)
-                url = "%s/%i/" % (dirname(dirname(request.path)), new_event.id)
+                obj = manipulator.save(new_data, request.user)
+                url = "%s/%i/" % (dirname(dirname(request.path)), obj.id)
                 return HttpResponseRedirect(url)
     else:
         errors = new_data = {}
 
     form = forms.FormWrapper(manipulator, new_data, errors)
-    return render_to_response('SeismoWebPortal/event_upload.html',
+    template_name = "%s/%s_upload.html" % (model._meta.app_label, model._meta.object_name.lower())
+    return render_to_response(template_name,
                               {'form': form, 'help_visible': help_visible},
                               RequestContext(request, {}))
+upload = login_required(upload)
 
 
 def event_detail_gearth(request, object_id):
@@ -803,39 +804,6 @@
 station_index = login_required(station_index)
 
 
-def upload_station_list(request):
-    from os.path import dirname
-    
-    manipulator = UploadStationListManipulator()
-    help_visible = get_help_visible(request)
-    
-    if request.method == 'POST':
-        new_data = request.POST.copy()
-        errors = {}
-        if new_data.has_key('show_help'):
-            help_visible = True
-            request.session['help_visible'] = help_visible
-        elif new_data.has_key('hide_help'):
-            help_visible = False
-            request.session['help_visible'] = help_visible
-        else:
-            new_data.update(request.FILES)
-            errors = manipulator.get_validation_errors(new_data)
-            if not errors:
-                manipulator.do_html2python(new_data)
-                stationList = manipulator.save(new_data, request.user)
-                url = "%s/%i/" % (dirname(dirname(request.path)), stationList.id)
-                return HttpResponseRedirect(url)
-    else:
-        errors = new_data = {}
-
-    form = forms.FormWrapper(manipulator, new_data, errors)
-    return render_to_response('SeismoWebPortal/stationlist_upload.html',
-                              {'form': form, 'help_visible': help_visible},
-                              RequestContext(request, {}))
-upload_station_list = login_required(upload_station_list)
-
-
 def stationlist_detail_gearth(request, object_id):
     stationList = get_object_or_404(StationList, id=object_id)
     kwds = dict(queryset = stationList.station_set.all(),
@@ -847,73 +815,6 @@
 # support code
 
 
-def parse_station_list(stationList, stream):
-
-    for line in stream:
-
-        # parse the line
-        code, network, latitude, longitude, elevation, bur = line.split()
-        latitude, longitude = float(latitude), float(longitude)
-        elevation, bur = float(elevation), float(bur)
-
-        if stationList is None:
-            continue
-
-        # get/create the network entry
-        network, created = StationNetwork.objects.get_or_create(code = network, defaults = { 'name': "" })
-
-        # create the station
-        station = Station.objects.create(stationList = stationList,
-                                         code = code,
-                                         name = "",
-                                         network = network,
-                                         status = 1,
-                                         latitude = latitude,
-                                         longitude = longitude,
-                                         elevation = elevation,
-                                         bur = bur)
-    return
-
-
-class UploadStationListManipulator(forms.Manipulator):
-    
-    def __init__(self):
-        super(UploadStationListManipulator, self).__init__()
-        self.fields = [
-            forms.TextField('name', maxlength=100, is_required=True),
-            forms.FileUploadField(field_name='stations', is_required=True),
-            ]
-
-    def get_validation_errors(self, new_data):
-        from StringIO import StringIO
-        
-        errors = super(UploadStationListManipulator, self).get_validation_errors(new_data)
-        
-        if not errors.get('stations'):
-            try:
-                stations = new_data['stations']['content']
-                stream = StringIO(stations)
-                parse_station_list(None, stream)
-            except Exception:
-                errors['stations'] = ['Please select a file in STATIONS format.']
-
-        return errors
-
-    def save(self, new_data, user):
-        from StringIO import StringIO
-
-        # Create the new station list.
-        stationList = StationList.objects.create(user = user,
-                                                 name = new_data['name'])
-        
-        # Parse the uploaded STATIONS file.
-        stations = new_data['stations']['content']
-        stream = StringIO(stations)
-        parse_station_list(stationList, stream)
-
-        return stationList
-
-
 # move to shared location
 def gearth_object_list(request, **kwds):
     from django.views.generic.list_detail import object_list



More information about the cig-commits mailing list