Ignore:
Timestamp:
Jun 22, 2010, 5:30:32 PM (13 years ago)
Author:
steve
Message:

Added in some more c based limiters

File:
1 edited

Legend:

Unmodified
Added
Removed
  • anuga_work/development/2010-projects/anuga_1d/base/quantity.py

    r7855 r7868  
    7070        #flux calculations and forcing functions
    7171       
    72         N = domain.number_of_elements
     72        self.N = domain.number_of_elements
     73        N = self.N
    7374        self.explicit_update = numpy.zeros(N, numpy.float )
    7475        self.semi_implicit_update = numpy.zeros(N, numpy.float )
     
    7879        self.qmin = numpy.zeros(self.centroid_values.shape, numpy.float)
    7980
    80         self.beta = domain.beta
     81        #These are taken from domain but can be set for each quantity
     82        # if so desired
     83        self.beta = 0.0
     84        self.limiter = 'vanleer'
    8185
    8286
     
    604608        return integral
    605609
     610    def get_beta(self,beta):
     611        """Get limiting parameter
     612        """
     613       
     614        return self.beta
     615
     616    def set_beta(self,beta):
     617        """Set limiting parameter
     618        """
     619
     620        #Probably should test that it is not too large
     621        self.beta = beta
     622
     623
     624    def get_limiter(self):
     625        return self.limiter
     626
     627    def set_limiter(self,limiter):
     628
     629        possible_limiters = \
     630        ['pyvolution', 'minmod_steve', 'minmod', 'minmod_kurganov', 'superbee', 'vanleer', 'vanalbada']
     631
     632        if limiter in possible_limiters:
     633            self.limiter = limiter
     634            return
     635
     636        msg = '%s is an incorrect limiter type.\n'% limiter
     637        msg += 'Possible types are: '+ ", ".join(["%s" % el for el in possible_limiters])
     638        raise Exception, msg
    606639
    607640    def update(self, timestep):
     
    795828
    796829        #Gradient
    797         G[1:-1] = xmic( self.domain.beta, d1, d2 )     
     830        G[1:-1] = xmic( self.beta, d1, d2 )     
    798831
    799832       
     
    818851        """
    819852
    820         if self.domain.limiter == "pyvolution":
     853        if self.limiter == "pyvolution":
    821854            self.limit_pyvolution()
    822855
    823         elif self.domain.limiter == "minmod_steve":
     856        elif self.limiter == "minmod_steve":
    824857            self.limit_minmod()
    825858
     
    9851018        from limiters_python import minmod, minmod_kurganov, minmod_kurganov_old, maxmod, vanleer, vanalbada
    9861019
    987         limiter = self.domain.limiter
     1020        limiter = self.get_limiter()
    9881021        #print limiter
    9891022       
    9901023        #print 'limit_range'
    991         N = self.domain.number_of_elements
     1024        N = self.N
    9921025        qc = self.centroid_values
    9931026        qv = self.vertex_values
     
    10131046        phi[N-1] = (qc[N-1] - qc[N-2])/(xc[N-1] - xc[N-2])
    10141047
     1048
    10151049        if limiter == "minmod":
    10161050            phi[1:-1] = minmod(beta_p[1:-1],beta_m[1:-1])
     
    10231057
    10241058        elif limiter == "minmod_kurganov":
    1025             theta = 2.0
     1059            theta = self.beta
    10261060            phi[1:-1] = minmod_kurganov(theta*beta_p[1:-1],theta*beta_m[1:-1], beta_x[1:-1])
    10271061
     
    10341068            msg = 'Unknown limiter'
    10351069            raise Exception, msg
    1036    
     1070
     1071
     1072       
    10371073        qv[:,0] = qc + phi*dx[:,0]
    10381074        qv[:,1] = qc + phi*dx[:,1]
    10391075
    10401076
    1041         #Phi limiter
    1042 #        for k in range(N):
    1043 #            n0 = self.domain.neighbours[k,0]
    1044 #            n1 = self.domain.neighbours[k,1]
    1045 #            if n0 < 0:
    1046 #                phi = (qc[k+1] - qc[k])/(xc[k+1] - xc[k])
    1047 #            elif n1 < 0:
    1048 #                phi = (qc[k] - qc[k-1])/(xc[k] - xc[k-1])
    1049 #            #elif (self.domain.wet_nodes[k,0] == 2) & (self.domain.wet_nodes[k,1] == 2):
    1050 #            #    phi = 0.0
    1051 #            else:
    1052 #                if limiter == "minmod":
    1053 #                    phi = minmod(beta_p[k],beta_m[k])
    1054 #
    1055 #                elif limiter == "minmod_kurganov":#Change this
    1056 #                    # Also known as monotonized central difference limiter
    1057 #                    # if theta = 2.0
    1058 #                    theta = 2.0
    1059 #                    phi = minmod_kurganov(theta*beta_p[k],theta*beta_m[k],beta_x[k])
    1060 #
    1061 #                elif limiter == "superbee":
    1062 #                    slope1 = minmod(beta_m[k],2.0*beta_p[k])
    1063 #                    slope2 = minmod(2.0*beta_m[k],beta_p[k])
    1064 #                    phi = maxmod(slope1,slope2)
    1065 #
    1066 #                elif limiter == "vanleer":
    1067 #                    phi = vanleer(beta_p[k],beta_m[k])
    1068 #
    1069 #                elif limiter == "vanalbada":
    1070 #                    phi = vanalbada(beta_m[k],beta_p[k])
    1071 #
    1072 #            for i in range(2):
    1073 #                qv[k,i] = qc[k] + phi*dx[k,i]
     1077
    10741078
    10751079    def limit_steve_slope(self):   
Note: See TracChangeset for help on using the changeset viewer.