Changeset 9010


Ignore:
Timestamp:
Oct 30, 2013, 5:34:25 PM (12 years ago)
Author:
davies
Message:

Reduction of velocity spikes in Audusse version?

Location:
trunk/anuga_work/development/gareth
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/anuga_work/development/gareth/experimental/bal_and/swb2_domain.py

    r9008 r9010  
    6464        # Most of these override the options in config.py
    6565        #------------------------------------------------
    66         self.set_CFL(1.0)
     66        self.set_CFL(1.00)
    6767        self.set_use_kinematic_viscosity(False)
    6868        self.timestepping_method='rk2'#'rk3'#'euler'#'rk2'
     
    7676
    7777        self.beta_w=1.0
    78         self.beta_w_dry=0.0
     78        self.beta_w_dry=1.0
    7979        self.beta_uh=1.0
    8080        self.beta_uh_dry=0.0
  • trunk/anuga_work/development/gareth/experimental/bal_and/swb2_domain_ext.c

    r9008 r9010  
    6767    // Apply limiting of speeds according to the ANUGA manual
    6868    if (*h < epsilon) {
    69       *h = max(0.0,*h);  // Could have been negative
     69      //*h = max(0.0,*h);  // Could have been negative
    7070      //*h = 0.0;  // Could have been negative
    7171      u = 0.0;
     
    167167  //  vh_left=0.;
    168168  //}
    169   u_left = _compute_speed(&uh_left, &h_left,
     169  // NOTE: using hle instead of h_left here seems to help prevent velocity spikes
     170  u_left = _compute_speed(&uh_left, &hle,
    170171              epsilon, h0, limiting_threshold);
    171172
     
    182183  //  vh_right=0.;
    183184  //}
    184   u_right = _compute_speed(&uh_right, &h_right,
     185  // NOTE: using hre instead of h_right here seems to help prevent velocity spikes
     186  u_right = _compute_speed(&uh_right, &hre,
    185187                epsilon, h0, limiting_threshold);
    186188
     
    284286      //}else{
    285287          // Standard smoothing term
    286       edgeflux[i] += (s_max*s_min)*(q_right_rotated[i] - q_left_rotated[i]);
     288      edgeflux[i] += 1.0*(s_max*s_min)*(q_right_rotated[i] - q_left_rotated[i]);
    287289      //}
    288290
     
    339341    // Local variables
    340342    double max_speed, length, inv_area, zl, zr;
    341     double h0 = H0;//H0*H0;//H0*0.1;//H0*H0;//H0*H0; // This ensures a good balance when h approaches H0.
     343    double h0 = H0*H0;//H0*H0;//H0*0.1;//H0*H0;//H0*H0; // This ensures a good balance when h approaches H0.
    342344    double h_left, h_right, z_half ;  // For andusse scheme
    343345
     
    465467            // Don't allow an outward advective flux if the cell centroid stage
    466468            // is < the edge value
    467             if(stage_centroid_values[k] < z_half && edgeflux[0] > 0.){
     469            if(((stage_centroid_values[k] < z_half)| hle<H0) && edgeflux[0] > 0.){
    468470                edgeflux[0] = 0.;
    469471                edgeflux[1] = 0.;
    470472                edgeflux[2] = 0.;
     473                //max_speed=0.;
    471474                //pressure_flux=0.;
    472475            }
    473            
    474             if(stage_centroid_values[n] < z_half && edgeflux[0] < 0.){
     476            //
     477            if(((stage_centroid_values[n] < z_half)| hre<H0) && edgeflux[0] < 0.){
    475478                edgeflux[0] = 0.;
    476479                edgeflux[1] = 0.;
    477480                edgeflux[2] = 0.;
     481                //max_speed=0.;
    478482                //pressure_flux=0.;
    479483            }
     
    604608     }
    605609
     610    //printf("%e \n", edgeflux_store[3*30*3]);
     611
    606612    // Now add up stage, xmom, ymom explicit updates
    607613    for(k=0; k<number_of_elements; k++){
     
    619625            // GD HACK
    620626            // Option to limit advective fluxes
    621             //if(hc > -h0){
     627            if(hc > H0){
    622628                stage_explicit_update[k] += edgeflux_store[ki3+0];
    623                 // Cut these terms for shallow flows, and protect stationary states from round-off error
    624629                xmom_explicit_update[k] += edgeflux_store[ki3+1];
    625630                ymom_explicit_update[k] += edgeflux_store[ki3+2];
    626             //}else{
    627             //    stage_explicit_update[k] += edgeflux_store[ki3+0];
    628             //}
     631            }else{
     632                stage_explicit_update[k] += edgeflux_store[ki3+0];
     633            }
    629634
    630635
     
    927932      // Check if cell k is wet
    928933      //if(stage_centroid_values[k] > elevation_centroid_values[k]){
    929       if(stage_centroid_values[k] > elevation_centroid_values[k] + 2.*minimum_allowed_height+epsilon){
     934      if(stage_centroid_values[k] > elevation_centroid_values[k] + 1.*minimum_allowed_height+epsilon){
    930935      //if(stage_centroid_values[k] > max_elevation_edgevalue[k] + minimum_allowed_height+epsilon){
    931936          cell_wetness_scale[k] = 1.; 
    932937      }
     938
     939      min_elevation_edgevalue[k] = min(elevation_edge_values[3*k],
     940                                       min(elevation_edge_values[3*k+1],
     941                                           elevation_edge_values[3*k+2]));
     942      max_elevation_edgevalue[k] = max(elevation_edge_values[3*k],
     943                                       max(elevation_edge_values[3*k+1],
     944                                           elevation_edge_values[3*k+2]));
    933945  }
    934946
     
    944956
    945957   
    946     // Try some Froude-number limiting in shallow depths
    947     dpth=max(stage_centroid_values[k] - elevation_centroid_values[k], 0.0);
    948 
    949     if(dpth<0.1){
    950         // momnorm = momentum^2
    951         momnorm=(xmom_centroid_values[k]*xmom_centroid_values[k]+
    952                  ymom_centroid_values[k]*ymom_centroid_values[k]);
    953        
    954         // vel^2 < constant*g*dpth [-- then multiply both sides by dpth^2]
    955         if(momnorm > 4*9.81*dpth*dpth*dpth){
    956             // Down-scale momentum so that Froude number < constant
    957             tmp=sqrt((4*9.81*dpth*dpth*dpth)/momnorm);
    958             xmom_centroid_values[k] *=tmp;
    959             ymom_centroid_values[k] *=tmp;
    960         }
    961     }
     958    ////// Try some Froude-number limiting in shallow depths
     959    //dpth=max(stage_centroid_values[k] - elevation_centroid_values[k], 0.0);
     960    ////
     961    //if(dpth< max(max_elevation_edgevalue[k]-min_elevation_edgevalue[k],10*minimum_allowed_height)){
     962    //    // momnorm = momentum^2
     963    //    momnorm=(xmom_centroid_values[k]*xmom_centroid_values[k]+
     964    //             ymom_centroid_values[k]*ymom_centroid_values[k]);
     965    //   
     966    //    // vel^2 < constant*g*dpth [-- then multiply both sides by dpth^2]
     967    //    if(momnorm > 1*9.81*dpth*dpth*dpth){
     968    //        // Down-scale momentum so that Froude number < constant
     969    //        tmp=sqrt((1*9.81*dpth*dpth*dpth)/momnorm);
     970    //        xmom_centroid_values[k] *=tmp;
     971    //        ymom_centroid_values[k] *=tmp;
     972    //    }
     973    //}
    962974  }
    963975
     
    9941006          ymom_centroid_values[k] = ymom_centroid_values[k]/dk;
    9951007
    996           min_elevation_edgevalue[k] = min(elevation_edge_values[3*k],
    997                                            min(elevation_edge_values[3*k+1],
    998                                                elevation_edge_values[3*k+2]));
    999           max_elevation_edgevalue[k] = max(elevation_edge_values[3*k],
    1000                                            max(elevation_edge_values[3*k+1],
    1001                                                elevation_edge_values[3*k+2]));
    10021008
    10031009          // SET HEIGHT IN PLACE
     
    10331039          stage_edge_values[k3+1] = stage_centroid_values[k];
    10341040          stage_edge_values[k3+2] = stage_centroid_values[k];
     1041   
     1042          //xmom_centroid_values[k] = 0.;
     1043          //ymom_centroid_values[k] = 0.;
     1044         
    10351045          xmom_edge_values[k3]    = xmom_centroid_values[k];
    10361046          xmom_edge_values[k3+1]  = xmom_centroid_values[k];
     
    11141124          //if(stage_centroid_values[k2]<=elevation_centroid_values[k2]+minimum_allowed_height+epsilon){
    11151125          // FIXME: Remove cell_wetness_scale if you don't need it
    1116           if(k2<0 || (cell_wetness_scale[k2]==-10.0 && stage_centroid_values[k]<stage_centroid_values[k2]) ){
     1126          if(k2<0 || (cell_wetness_scale[k2]==0.0 && stage_centroid_values[k]<max_elevation_edgevalue[k])){
    11171127              k2 = k ;
    11181128          }
    11191129          //if(stage_centroid_values[k0]<=max_elevation_edgevalue[k0]+epsilon){
    11201130          //if(stage_centroid_values[k0]<=elevation_centroid_values[k0]+minimum_allowed_height+epsilon){
    1121           if(k0 < 0 || (cell_wetness_scale[k0]==-10.0 && stage_centroid_values[k]<stage_centroid_values[k0])){
     1131          if(k0 < 0 || (cell_wetness_scale[k0]==0.0 && stage_centroid_values[k]<max_elevation_edgevalue[k])){
    11221132              k0 = k ;
    11231133          }
    11241134          //if(stage_centroid_values[k1]<=max_elevation_edgevalue[k1]+epsilon){
    11251135          //if(stage_centroid_values[k1]<=elevation_centroid_values[k1]+minimum_allowed_height+epsilon){
    1126           if(k1 < 0 || (cell_wetness_scale[k1]==-10.0 && stage_centroid_values[k]<stage_centroid_values[k1])){
     1136          if(k1 < 0 || (cell_wetness_scale[k1]==0.0 && stage_centroid_values[k]<max_elevation_edgevalue[k])){
    11271137              k1 = k ;
    11281138          }
     
    11771187              //stage_edge_values[k3+2] = stage_centroid_values[k];
    11781188
    1179               dk=max(stage_centroid_values[k]-elevation_centroid_values[k],0.);
     1189              dk=height_centroid_values[k]; //max(stage_centroid_values[k]-elevation_centroid_values[k],0.);
    11801190              height_edge_values[k3] = dk;
    11811191              height_edge_values[k3+1] = dk;
     
    12051215          h2 = stage_centroid_values[k2] - elevation_centroid_values[k2];
    12061216          hmin = min(min(h0, min(h1, h2)), hc);
     1217          hmax = max(max(h0, max(h1, h2)), hc);
    12071218          //// GD FIXME: No longer needed?
    12081219          //hfactor = 0.0;
     
    12141225            //hfactor=hmin/(hmin + 0.004);
    12151226          //}
    1216           //hfactor= min(2.0*max(hmin,0.0)/max(hc,max(0.5*(bedmax-bedmin),minimum_allowed_height*10.)), 1.0);
    1217           hfactor= min(2.0*max(hmin,0.0)/max(hc,minimum_allowed_height), 1.0);
     1227          //hfactor= min(2.0*max(hmin,0.0)/max(hc,max(1.0*(max_elevation_edgevalue[k]-min_elevation_edgevalue[k]),minimum_allowed_height*1.)), 1.0);
     1228
     1229          // Look for strong changes in cell wetness as an indicator of near-wet-dry
     1230          hfactor= min(2.0*max(hmin,0.0)/max(hc,minimum_allowed_height),
     1231                       min(2.0*max(hc,0.)/max(hmax,minimum_allowed_height), 1.0));
     1232
     1233          //hfactor=1.0;
     1234          //hfactor=max(hmin,0.)/(max(hmin,0.)+10.*minimum_allowed_height);
     1235          //if(hc<minimum_allowed_height*10.) hfactor=0.;
    12181236          //if(cell_wetness_scale[k0]==0 | cell_wetness_scale[k1]==0 | cell_wetness_scale[k2]==0) hfactor=0;
     1237          //hfactor=1.0;
    12191238         
    12201239          //-----------------------------------
     
    12501269          beta_tmp = beta_w_dry + (beta_w - beta_w_dry) * hfactor;
    12511270          //beta_tmp = beta_w_dry*0. + (beta_w - beta_w_dry*0.) * hfactor;
     1271          //beta_tmp=1.0;
    12521272       
    12531273         
     
    12911311       
    12921312          beta_tmp = beta_w_dry + (beta_w - beta_w_dry) * hfactor;
    1293        
     1313          //beta_tmp=beta_w;
    12941314         
    12951315          // Limit the gradient
  • trunk/anuga_work/development/gareth/tests/shallow_steep_slope/channel_SU_sparse.py

    r9008 r9010  
    3636#------------------------------------------------------------------------------
    3737def topography(x, y):
    38         return -x/10.  + 1.*(numpy.sin(x/10.) +abs(y-50.)/10.) -0.*(x>80.) # linear bed slope
     38        return -x/10.  #+ 1.*(numpy.sin(x/10.) +abs(y-50.)/10.) -0.*(x>80.) # linear bed slope
    3939
    4040def stagetopo(x,y):
Note: See TracChangeset for help on using the changeset viewer.