Changeset 9659


Ignore:
Timestamp:
Feb 11, 2015, 11:26:16 AM (9 years ago)
Author:
davies
Message:

Experimenting with different smooths for internal boundary functions

Location:
trunk/anuga_core/anuga
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/anuga_core/anuga/parallel/parallel_internal_boundary_operator.py

    r9657 r9659  
    100100        self.smoothing_timescale = 0.
    101101        self.smooth_Q = 0.
     102        self.smooth_delta_total_energy = 0.
    102103        # Set them based on a call to the discharge routine with smoothing_timescale=0.
    103104        # [values of self.smooth_* are required in discharge_routine, hence dummy values above]
     
    106107        # Finally, set the smoothing timescale we actually want
    107108        self.smoothing_timescale = smoothing_timescale
     109        self.smooth_delta_total_energy = self.delta_total_energy
    108110
    109111    def parallel_safe(self):
     
    162164        # Determine the direction of the flow
    163165        if self.myid == self.master_proc:
    164             if self.use_velocity_head:
    165                 self.delta_total_energy = enq_total_energy0 - enq_total_energy1
    166                 self.driving_energy = max(enq_total_energy0, enq_total_energy1)
    167                 # Compute discharge
    168                 Q = self.internal_boundary_function(enq_total_energy0, enq_total_energy1)
    169             else:
    170                 self.delta_total_energy = enq_stage0 - enq_stage1
    171                 self.driving_energy = max(enq_stage0, enq_stage1)
    172                 # Compute discharge
    173                 Q = self.internal_boundary_function(enq_stage0, enq_stage1)
    174 
    175             # Other variables required by anuga's structure operator are not used
     166            # Variables required by anuga's structure operator which are not
     167            # used
    176168            barrel_velocity = numpy.nan
    177169            outlet_culvert_depth = numpy.nan
     
    179171            case = ''
    180172
    181             # Use time-smoothed discharge
     173            # 'Timescale' for smoothed discharge and energy
    182174            ts = self.domain.timestep/max(self.domain.timestep, self.smoothing_timescale, 1.0e-30)
     175
     176            # Energy or stage as head
     177            if self.use_velocity_head:
     178                E0 = enq_total_energy0
     179                E1 = enq_total_energy1
     180            else:
     181                E0 = enq_stage0
     182                E1 = enq_stage1
     183
     184            self.delta_total_energy = E0 - E1
     185            self.driving_energy = max(E0, E1)
     186
     187            # Compute a 'smoothed' delta_total_energy for improved numerical
     188            # stability
     189            self.smooth_delta_total_energy = self.smooth_delta_total_energy +\
     190                ts*(self.delta_total_energy - self.smooth_delta_total_energy)
     191
     192            if numpy.sign(self.smooth_delta_total_energy) != numpy.sign(self.delta_total_energy):
     193                self.smooth_delta_total_energy = 0.
     194
     195            # Compute the 'tailwater' energy from the 'headwater' energy
     196            # and the smooth_delta_total_energy Note if ts = 1 (no
     197            # smoothing), then the raw inlet energies are used
     198            if E0 >= E1:
     199                inlet0_energy = 1.0*E0
     200                inlet1_energy = inlet0_energy - self.smooth_delta_total_energy
     201
     202            else:
     203                inlet1_energy = 1.0*E1
     204                inlet0_energy = inlet1_energy + self.smooth_delta_total_energy
     205
     206            # Compute discharge
     207            Q = self.internal_boundary_function(inlet0_energy, inlet1_energy)
    183208            self.smooth_Q = self.smooth_Q + ts*(Q - self.smooth_Q)
    184            
     209
    185210            if numpy.sign(self.smooth_Q) != numpy.sign(Q):
    186211                # The flow direction of the 'instantaneous Q' based on the
  • trunk/anuga_core/anuga/shallow_water/shallow_water_domain.py

    r9654 r9659  
    14441444            send(volume,0)
    14451445       
    1446         barrier()
     1446        #barrier()
    14471447   
    14481448        if myid == 0:
     
    14831483            send(flux_integral,0)
    14841484       
    1485         barrier()
     1485        #barrier()
    14861486   
    14871487        if myid == 0:
     
    15181518            send(flux_integral,0)
    15191519       
    1520         barrier()
     1520        #barrier()
    15211521   
    15221522        if myid == 0:
  • trunk/anuga_core/anuga/structures/internal_boundary_operator.py

    r9657 r9659  
    100100        self.smoothing_timescale = 0.
    101101        self.smooth_Q = 0.
     102        self.smooth_delta_total_energy = 0.
    102103        # Set them based on a call to the discharge routine with smoothing_timescale=0.
    103104        # [values of self.smooth_* are required in discharge_routine, hence dummy values above]
     
    106107        # Finally, set the smoothing timescale we actually want
    107108        self.smoothing_timescale = smoothing_timescale
    108 
     109        self.smooth_delta_total_energy = self.delta_total_energy
     110   
     111    ###########################################################################
    109112    def discharge_routine(self):
    110113        """Procedure to determine the inflow and outflow inlets.
     
    131134            self.inlet0_energy = self.inlets[0].get_enquiry_stage()
    132135            self.inlet1_energy = self.inlets[1].get_enquiry_stage()
    133 
    134         # Compute discharge
    135         Q = self.internal_boundary_function(self.inlet0_energy, self.inlet1_energy)
     136       
     137        # Store these variables for anuga's structure output
     138        self.driving_energy = max(self.inlet0_energy, self.inlet1_energy)
     139        self.delta_total_energy = self.inlet0_energy - self.inlet1_energy
    136140
    137141        # Other variables required by anuga's structure operator are not used
     
    141145        case = ''
    142146
     147        # ts is used for smoothing discharge and delta_total_energy
     148        if self.domain.timestep > 0.:
     149            ts = self.domain.timestep/max(self.domain.timestep, self.smoothing_timescale, 1.0e-30)
     150        else:
     151            ts = 1.0
     152
     153        # Compute a 'smoothed' delta_total_energy
     154        self.smooth_delta_total_energy = self.smooth_delta_total_energy +\
     155            ts*(self.delta_total_energy - self.smooth_delta_total_energy)
     156
     157        if numpy.sign(self.smooth_delta_total_energy) != numpy.sign(self.delta_total_energy):
     158            self.smooth_delta_total_energy = 0.
     159
     160        # Compute the 'tailwater' energy from the 'headwater' energy and the smooth_delta_total_energy
     161        # Note if ts = 1 (no smoothing), then the raw inlet energies are used
     162        if self.inlet0_energy >= self.inlet1_energy:
     163            inlet0_energy = 1.0*self.inlet0_energy
     164            inlet1_energy = inlet0_energy - self.smooth_delta_total_energy
     165
     166            # Compute discharge
     167            Q = self.internal_boundary_function(inlet0_energy, inlet1_energy)
     168        else:
     169            inlet1_energy = 1.0*self.inlet1_energy
     170            inlet0_energy = inlet1_energy + self.smooth_delta_total_energy
     171
     172            # Compute discharge
     173            Q = self.internal_boundary_function(inlet0_energy, inlet1_energy)
     174
    143175        # Use time-smoothed discharge
    144         ts = self.domain.timestep/max(self.domain.timestep, self.smoothing_timescale, 1.0e-30)
    145176        self.smooth_Q = self.smooth_Q + ts*(Q - self.smooth_Q)
    146177
     
    163194            Q = min( abs(self.smooth_Q), abs(Q) )
    164195
    165         # Store these variables for anuga's structure output
    166         self.driving_energy = max(self.inlet0_energy, self.inlet1_energy)
    167         self.delta_total_energy = self.inlet0_energy - self.inlet1_energy
    168 
    169196        return Q, barrel_velocity, outlet_culvert_depth
Note: See TracChangeset for help on using the changeset viewer.