Changeset 8549
- Timestamp:
- Sep 1, 2012, 7:44:08 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/anuga_core/source/anuga/structures/inlet_operator.py
r8506 r8549 62 62 volume = Q*timestep 63 63 64 #print Q, volume 65 64 66 assert current_volume + volume >= 0.0, 'Requesting too much water to be removed from an inlet!' 65 67 -
trunk/anuga_work/development/gareth/experimental/balanced_dev/swb2_domain_ext.c
r8547 r8549 196 196 // Flux formulas 197 197 flux_left[0] = u_left*h_left; 198 flux_left[1] = u_left*uh_left + 0.0*g*h_left*h_left;198 flux_left[1] = u_left*uh_left ; //+ 0.5*g*h_left*h_left; 199 199 flux_left[2] = u_left*vh_left; 200 200 201 201 flux_right[0] = u_right*h_right; 202 flux_right[1] = u_right*uh_right + 0.0*g*h_right*h_right;202 flux_right[1] = u_right*uh_right ; //+ 0.5*g*h_right*h_right; 203 203 flux_right[2] = u_right*vh_right; 204 204 … … 221 221 edgeflux[i] *= inverse_denominator; 222 222 } 223 223 // Separate pressure flux, so we can apply different wet-dry hacks to it 224 224 *pressure_flux = 0.5*g*( s_max*h_left*h_left -s_min*h_right*h_right)*inverse_denominator; 225 225 … … 288 288 289 289 max_bed_edgevalue = malloc(number_of_elements*sizeof(double)); 290 min_bed_edgevalue = malloc(number_of_elements*sizeof(double));290 //min_bed_edgevalue = malloc(number_of_elements*sizeof(double)); 291 291 // Start computation 292 292 call++; // Flag 'id' of flux calculation for this timestep … … 304 304 max(bed_edge_values[3*k+1], bed_edge_values[3*k+2])); 305 305 //max_bed_edgevalue[k]= 0.5*(max_bed_edgevalue[j]+bed_centroid_values[k]); 306 min_bed_edgevalue[k] = min(bed_edge_values[3*k],307 min(bed_edge_values[3*k+1], bed_edge_values[3*k+2]));306 //min_bed_edgevalue[k] = min(bed_edge_values[3*k], 307 // min(bed_edge_values[3*k+1], bed_edge_values[3*k+2])); 308 308 309 309 } … … 408 408 // Prevent outflow from 'seriously' dry cells 409 409 // Idea: The cell will not go dry if: 410 // mass_flux = edgeflux[0]*(dt*edgelength) <= Area_triangle*hc410 // mass_flux = edgeflux[0]*(dt*edgelength) <= (1/3)Area_triangle*hc 411 411 if((stage_centroid_values[k]<=max_bed_edgevalue[k])| 412 412 (ql[0]<=zl)){ … … 469 469 ymom_explicit_update[k] -= normals[ki2+1]*bedslope_work; 470 470 }else{ 471 bedslope_work = 0.;//-pressure_flux*length ;//g*length*( 0.*(ql[0])-0.5*max(ql[0]-zl,0.)*(ql[0]-zl) );471 //bedslope_work = 0.;//-pressure_flux*length ;//g*length*( 0.*(ql[0])-0.5*max(ql[0]-zl,0.)*(ql[0]-zl) ); 472 472 xmom_explicit_update[k] *= 0.; 473 473 ymom_explicit_update[k] *= 0.; … … 524 524 ymom_explicit_update[n] += normals[ki2+1]*bedslope_work; 525 525 }else{ 526 bedslope_work = 0.;//-pressure_flux*length;//g*length*(0.*(qr[0])-0.5*max(qr[0]-zr,0.)*(qr[0]-zr));526 //bedslope_work = 0.;//-pressure_flux*length;//g*length*(0.*(qr[0])-0.5*max(qr[0]-zr,0.)*(qr[0]-zr)); 527 527 xmom_explicit_update[n] *= 0.; 528 528 ymom_explicit_update[n] *= 0.; … … 633 633 // 634 634 free(max_bed_edgevalue); 635 free(min_bed_edgevalue);635 //free(min_bed_edgevalue); 636 636 637 637 return timestep; … … 671 671 672 672 if (hc < max(minimum_relative_height*(bmax-zc[k]), minimum_allowed_height)) { 673 674 673 // Set momentum to zero and ensure h is non negative 675 // NOTE: THIS IS IMPORTANT -- WE ARE SETTING MOMENTUM TO ZERO676 //if(hc<=epsilon){677 674 xmomc[k] = 0.0; 678 675 ymomc[k] = 0.0; 679 //}680 676 681 677 if (hc <= 0.0){ 682 678 // Definine the minimum bed edge value on triangle k. 683 // Setting = minimum edge value can lead to mass conservation problems684 679 //bmin = 0.5*min((zv[3*k]+zv[3*k+1]),min((zv[3*k+1]+zv[3*k+2]),(zv[3*k+2]+zv[3*k]))); 685 680 //bmin =0.5*bmin + 0.5*min(zv[3*k],min(zv[3*k+1],zv[3*k+2])); 686 // Setting = minimum vertex value seems better, but might tend to be less smooth687 681 //bmin =min(zv[3*k],min(zv[3*k+1],zv[3*k+2])) -minimum_allowed_height; 688 682 bmin=zc[k]-minimum_allowed_height; 689 683 // Minimum allowed stage = bmin 684 690 685 // WARNING: ADDING MASS if wc[k]<bmin 691 686 if(wc[k]<bmin){ … … 697 692 698 693 699 // Set vertex values as well. Seems that this shouldn't be700 // needed. However from memory this is important at the first694 // FIXME: Set vertex values as well. Seems that this shouldn't be 695 // needed. However, from memory this is important at the first 701 696 // time step, for 'dry' areas where the designated stage is 702 697 // less than the bed centroid value … … 813 808 814 809 double *xmom_centroid_store, *ymom_centroid_store, *stage_centroid_store, *min_elevation_edgevalue, *max_elevation_edgevalue; 815 double * neighbour_wetness_scale;810 double *cell_wetness_scale; 816 811 int *count_wet_neighbours; 817 812 … … 821 816 ymom_centroid_store = malloc(number_of_elements*sizeof(double)); 822 817 stage_centroid_store = malloc(number_of_elements*sizeof(double)); 823 min_elevation_edgevalue = malloc(number_of_elements*sizeof(double));818 //min_elevation_edgevalue = malloc(number_of_elements*sizeof(double)); 824 819 max_elevation_edgevalue = malloc(number_of_elements*sizeof(double)); 825 neighbour_wetness_scale = malloc(number_of_elements*sizeof(double));820 cell_wetness_scale = malloc(number_of_elements*sizeof(double)); 826 821 count_wet_neighbours = malloc(number_of_elements*sizeof(int)); 827 822 … … 838 833 ymom_centroid_values[k] = ymom_centroid_values[k]/dk; 839 834 840 min_elevation_edgevalue[k] = min(elevation_edge_values[3*k],841 min(elevation_edge_values[3*k+1],842 elevation_edge_values[3*k+2]));835 //min_elevation_edgevalue[k] = min(elevation_edge_values[3*k], 836 // min(elevation_edge_values[3*k+1], 837 // elevation_edge_values[3*k+2])); 843 838 max_elevation_edgevalue[k] = max(elevation_edge_values[3*k], 844 839 max(elevation_edge_values[3*k+1], … … 852 847 for(k=0; k<number_of_elements;k++){ 853 848 count_wet_neighbours[k]=0; 854 neighbour_wetness_scale[k] = 0.;855 // C ell k is wet856 if(stage_centroid_values[k] > max_elevation_edgevalue[k] + minimum_allowed_height+epsilon){857 neighbour_wetness_scale[k] = 1.;849 cell_wetness_scale[k] = 0.; 850 // Check if cell k is wet 851 if(stage_centroid_values[k] > elevation_centroid_values[k] + minimum_allowed_height+epsilon){ 852 cell_wetness_scale[k] = 1.; 858 853 } 859 854 // Count the wet neighbours … … 871 866 for(k_wetdry=0; k_wetdry<2; k_wetdry++){ 872 867 //if(((stage_centroid_values[k] > max_elevation_edgevalue[k]))==k_wetdry){ 873 if(((stage_centroid_values[k] < elevation_centroid_values[k]+minimum_allowed_height))==k_wetdry){ 874 continue; 875 } 868 //if(((stage_centroid_values[k] < elevation_centroid_values[k]+minimum_allowed_height))==k_wetdry){ 876 869 // For partially wet cells, we now know that the edges of neighbouring 877 870 // fully wet cells have been defined … … 880 873 for (k = 0; k < number_of_elements; k++) 881 874 { 875 876 // First treat all 'fully wet' cells, then treat 'partially dry' cells 877 // For partially wet cells, we now know that the edges of neighbouring 878 // fully wet cells have been defined 879 if( cell_wetness_scale[k]==(1.0*k_wetdry) ){ 880 continue; 881 } 882 883 // Useful indices 882 884 k3=k*3; 883 885 k6=k*6; … … 950 952 // used 951 953 //if(stage_centroid_values[k2]<=max_elevation_edgevalue[k2]+epsilon){ 952 if(stage_centroid_values[k2]<=elevation_centroid_values[k2]+minimum_allowed_height+epsilon){ 954 //if(stage_centroid_values[k2]<=elevation_centroid_values[k2]+minimum_allowed_height+epsilon){ 955 if(cell_wetness_scale[k2]==0.0){ 953 956 k2 = k ; 954 957 } 955 958 //if(stage_centroid_values[k0]<=max_elevation_edgevalue[k0]+epsilon){ 956 if(stage_centroid_values[k0]<=elevation_centroid_values[k0]+minimum_allowed_height+epsilon){ 959 //if(stage_centroid_values[k0]<=elevation_centroid_values[k0]+minimum_allowed_height+epsilon){ 960 if(cell_wetness_scale[k0]==0.0){ 957 961 k0 = k ; 958 962 } 959 963 //if(stage_centroid_values[k1]<=max_elevation_edgevalue[k1]+epsilon){ 960 if(stage_centroid_values[k1]<=elevation_centroid_values[k1]+minimum_allowed_height+epsilon){ 964 //if(stage_centroid_values[k1]<=elevation_centroid_values[k1]+minimum_allowed_height+epsilon){ 965 if(cell_wetness_scale[k1]==0.0){ 961 966 k1 = k ; 962 967 } … … 999 1004 1000 1005 // Treat triangles with zero or 1 wet neighbours. 1001 if ((area2 <= 0) ) //|(count_wet_neighbours[k]==0))1006 if ((area2 <= 0)|(cell_wetness_scale[k]==0.)) //|(count_wet_neighbours[k]==0)) 1002 1007 { 1003 if( ((k==k0) & (k==k1) & (k==k2))){ 1004 // Isolated wet cell -- use constant depth extrapolation for stage 1005 //stage_edge_values[k3] = stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3]; 1006 //stage_edge_values[k3+1] = stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3+1]; 1007 //stage_edge_values[k3+2] = stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3+2]; 1008 1009 // Isolated wet cell -- constant depth extrapolation, but don't let water flow uphill 1010 //stage_edge_values[k3] = min(stage_centroid_values[k], stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3]); 1011 //stage_edge_values[k3+1] = min(stage_centroid_values[k], stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3+1]); 1012 //stage_edge_values[k3+2] = min(stage_centroid_values[k], stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3+2]); 1013 // Isolated wet cell -- constant stage extrapolation 1014 stage_edge_values[k3] = stage_centroid_values[k]; 1015 stage_edge_values[k3+1] = stage_centroid_values[k]; 1016 stage_edge_values[k3+2] = stage_centroid_values[k]; 1017 }else{ 1018 // Cell with one wet neighbour. 1019 // Find which neighbour is wet [if k!=k0, then k0 is wet] 1020 if(k!=k0){ 1021 ktmp=k0; 1022 ii=0; 1023 xtmp = x0; 1024 ytmp = y0; 1025 }else if(k!=k1){ 1026 ktmp=k1; 1027 ii=1; 1028 xtmp = x1; 1029 ytmp = y1; 1030 }else if(k!=k2){ 1031 ktmp=k2; 1032 ii=2; 1033 xtmp = x2; 1034 ytmp = y2; 1035 }else{ 1036 printf("ERROR in extrapolation routine: Should have had one ki == k \n"); 1037 report_python_error(AT, "Negative triangle area"); 1038 return -1; 1039 } 1040 1041 //if(stage_centroid_values[k]>elevation_centroid_values[k]+minimum_allowed_height){ 1042 if(k_wetdry==0){ 1043 // // Cell is wet 1044 // //if(count_wet_neighbours[ktmp]>0){ 1045 // // stage_edge_values[k3]= stage_centroid_values[k]; 1046 // // stage_edge_values[k3+1]= stage_centroid_values[k]; 1047 // // stage_edge_values[k3+2]= stage_centroid_values[k]; 1048 // //}else{ 1049 // // Constant depth extrapolation 1050 //if(stage_centroid_values[k]<stage_centroid_values[ktmp]){ 1051 //stage_edge_values[k3]= stage_centroid_values[k]-elevation_centroid_values[k]+elevation_edge_values[k3]; 1052 //stage_edge_values[k3+1]= stage_centroid_values[k] -elevation_centroid_values[k]+elevation_edge_values[k3+1]; 1053 //stage_edge_values[k3+2]= stage_centroid_values[k] -elevation_centroid_values[k]+elevation_edge_values[k3+2]; 1054 stage_edge_values[k3] = stage_centroid_values[k]; 1055 stage_edge_values[k3+1] = stage_centroid_values[k]; 1056 stage_edge_values[k3+2] = stage_centroid_values[k]; 1057 //}else{ 1058 // stage_edge_values[k3] = stage_centroid_values[ktmp]; 1059 // stage_edge_values[k3+1] = stage_centroid_values[ktmp]; 1060 // stage_edge_values[k3+2] = stage_centroid_values[ktmp]; 1061 // //stage_edge_values[k3]= max(stage_centroid_values[k]-elevation_centroid_values[k]+elevation_edge_values[k3], stage_centroid_values[ktmp]); 1062 // //stage_edge_values[k3+1]= max(stage_centroid_values[k] -elevation_centroid_values[k]+elevation_edge_values[k3+1],stage_centroid_values[ktmp]); 1063 // //stage_edge_values[k3+2]= max(stage_centroid_values[k] -elevation_centroid_values[k]+elevation_edge_values[k3+2], stage_centroid_values[ktmp]); 1064 //} 1065 1066 }else{ 1067 1068 // // This cell is 'dry'. 1069 // // Extrapolate using the neighbouring wet cell if appropriate 1070 // // This needs to preserve a wet-dry interface 1071 stage_edge_values[k3]= stage_edge_values[3*ktmp+neighbour_edges[3*ktmp+ii]];//max(stage_edge_values[3*ktmp+neighbour_edges[3*ktmp+i]], elevation_edge_values[k3]) ; 1072 stage_edge_values[k3+1]= stage_edge_values[3*ktmp+neighbour_edges[3*ktmp+ii]];//max(stage_edge_values[3*ktmp+neighbour_edges[3*ktmp+i]], elevation_edge_values[k3+1]); 1073 stage_edge_values[k3+2]= stage_edge_values[3*ktmp+neighbour_edges[3*ktmp+ii]];//max(stage_edge_values[3*ktmp+neighbour_edges[3*ktmp +i]], elevation_edge_values[k3+2]); 1074 // stage_edge_values[k3]= stage_centroid_values[ktmp] ; 1075 // stage_edge_values[k3+1]= stage_centroid_values[ktmp]; 1076 // stage_edge_values[k3+2]= stage_centroid_values[ktmp]; 1077 // stage_edge_values[k3]= stage_centroid_values[k] ; 1078 // stage_edge_values[k3+1]= stage_centroid_values[k]; 1079 // stage_edge_values[k3+2]= stage_centroid_values[k]; 1080 } 1081 1082 } 1008 //if((cell_wetness_scale[k]==1.0) | (k==k0)&&(k==k1)&&(k==k2)){ 1009 stage_edge_values[k3] = stage_centroid_values[k]; 1010 stage_edge_values[k3+1] = stage_centroid_values[k]; 1011 stage_edge_values[k3+2] = stage_centroid_values[k]; 1012 //}else{ 1013 // Dry cell with a single 'wet' neighbour 1014 1015 // Compute indices of neighbouring wet cell / edge 1016 //ktmp = k0*(1-(k0==k)) + k1*(1-(k1==k)) + k2*(1-(k2==k)); 1017 //ii = 0*(1-(k0==k)) + 1*(1-(k1==k)) + 2*(1-(k2==k)); 1018 //if((ii<0)|(ii>2)){ 1019 // printf("Invalid ii value \n"); 1020 //} 1021 1022 //ktmp = 3*ktmp+neighbour_edges[3*k+ii]; 1023 //stage_edge_values[k3]= stage_edge_values[ktmp];//max(stage_edge_values[3*ktmp+neighbour_edges[3*ktmp+i]], elevation_edge_values[k3]) ; 1024 //stage_edge_values[k3+1]= stage_edge_values[ktmp];//max(stage_edge_values[3*ktmp+neighbour_edges[3*ktmp+i]], elevation_edge_values[k3+1]); 1025 //stage_edge_values[k3+2]= stage_edge_values[ktmp];//max(stage_edge_values[3*ktmp+neighbour_edges[3*ktmp +i]], elevation_edge_values[k3+2]); 1026 1027 //} 1028 //if( (k==k0) & (k==k1) & (k==k2)){ 1029 // // Isolated wet cell -- use constant depth extrapolation for stage 1030 // //stage_edge_values[k3] = stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3]; 1031 // //stage_edge_values[k3+1] = stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3+1]; 1032 // //stage_edge_values[k3+2] = stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3+2]; 1033 1034 // // Isolated wet cell -- constant depth extrapolation, but don't let water flow uphill 1035 // //stage_edge_values[k3] = min(stage_centroid_values[k], stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3]); 1036 // //stage_edge_values[k3+1] = min(stage_centroid_values[k], stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3+1]); 1037 // //stage_edge_values[k3+2] = min(stage_centroid_values[k], stage_centroid_values[k]- elevation_centroid_values[k] + elevation_edge_values[k3+2]); 1038 // // Isolated wet cell -- constant stage extrapolation 1039 // stage_edge_values[k3] = stage_centroid_values[k]; 1040 // stage_edge_values[k3+1] = stage_centroid_values[k]; 1041 // stage_edge_values[k3+2] = stage_centroid_values[k]; 1042 //}else{ 1043 // // Cell with one wet neighbour. 1044 // // Find which neighbour is wet [if k!=k0, then k0 is wet] 1045 // if(k!=k0){ 1046 // ktmp=k0; 1047 // ii=0; 1048 // xtmp = x0; 1049 // ytmp = y0; 1050 // }else if(k!=k1){ 1051 // ktmp=k1; 1052 // ii=1; 1053 // xtmp = x1; 1054 // ytmp = y1; 1055 // }else if(k!=k2){ 1056 // ktmp=k2; 1057 // ii=2; 1058 // xtmp = x2; 1059 // ytmp = y2; 1060 // }else{ 1061 // printf("ERROR in extrapolation routine: Should have had one ki == k \n"); 1062 // report_python_error(AT, "Negative triangle area"); 1063 // return -1; 1064 // } 1065 1066 // //if(stage_centroid_values[k]>elevation_centroid_values[k]+minimum_allowed_height){ 1067 // if(k_wetdry==0){ 1068 // // // Cell is wet 1069 // // //if(count_wet_neighbours[ktmp]>0){ 1070 // // // stage_edge_values[k3]= stage_centroid_values[k]; 1071 // // // stage_edge_values[k3+1]= stage_centroid_values[k]; 1072 // // // stage_edge_values[k3+2]= stage_centroid_values[k]; 1073 // // //}else{ 1074 // // // Constant depth extrapolation 1075 // //if(stage_centroid_values[k]<stage_centroid_values[ktmp]){ 1076 // // stage_edge_values[k3]= stage_centroid_values[k]-elevation_centroid_values[k]+elevation_edge_values[k3]; 1077 // // stage_edge_values[k3+1]= stage_centroid_values[k] -elevation_centroid_values[k]+elevation_edge_values[k3+1]; 1078 // // stage_edge_values[k3+2]= stage_centroid_values[k] -elevation_centroid_values[k]+elevation_edge_values[k3+2]; 1079 // stage_edge_values[k3] = stage_centroid_values[k]; 1080 // stage_edge_values[k3+1] = stage_centroid_values[k]; 1081 // stage_edge_values[k3+2] = stage_centroid_values[k]; 1082 // //}else{ 1083 // // stage_edge_values[k3] = stage_centroid_values[ktmp]; 1084 // // stage_edge_values[k3+1] = stage_centroid_values[ktmp]; 1085 // // stage_edge_values[k3+2] = stage_centroid_values[ktmp]; 1086 // // //stage_edge_values[k3]= max(stage_centroid_values[k]-elevation_centroid_values[k]+elevation_edge_values[k3], stage_centroid_values[ktmp]); 1087 // // //stage_edge_values[k3+1]= max(stage_centroid_values[k] -elevation_centroid_values[k]+elevation_edge_values[k3+1],stage_centroid_values[ktmp]); 1088 // // //stage_edge_values[k3+2]= max(stage_centroid_values[k] -elevation_centroid_values[k]+elevation_edge_values[k3+2], stage_centroid_values[ktmp]); 1089 // //} 1090 1091 // }else{ 1092 // 1093 // // // This cell is 'dry'. 1094 // // // Extrapolate using the neighbouring wet cell if appropriate 1095 // // // This needs to preserve a wet-dry interface 1096 // //ktmp = 3*ktmp+neighbour_edges[3*k+ii]; 1097 // //stage_edge_values[k3]= stage_edge_values[ktmp];//max(stage_edge_values[3*ktmp+neighbour_edges[3*ktmp+i]], elevation_edge_values[k3]) ; 1098 // //stage_edge_values[k3+1]= stage_edge_values[ktmp];//max(stage_edge_values[3*ktmp+neighbour_edges[3*ktmp+i]], elevation_edge_values[k3+1]); 1099 // //stage_edge_values[k3+2]= stage_edge_values[ktmp];//max(stage_edge_values[3*ktmp+neighbour_edges[3*ktmp +i]], elevation_edge_values[k3+2]); 1100 // // stage_edge_values[k3]= stage_centroid_values[ktmp] ; 1101 // // stage_edge_values[k3+1]= stage_centroid_values[ktmp]; 1102 // // stage_edge_values[k3+2]= stage_centroid_values[ktmp]; 1103 // stage_edge_values[k3]= stage_centroid_values[k] ; 1104 // stage_edge_values[k3+1]= stage_centroid_values[k]; 1105 // stage_edge_values[k3+2]= stage_centroid_values[k]; 1106 // } 1107 // 1108 //} 1083 1109 // First order momentum / velocity extrapolation 1084 1110 //stage_edge_values[k3] = stage_centroid_values[k]; … … 1147 1173 // Limit the gradient 1148 1174 // This is more complex for stage than other quantities 1149 if((count_wet_neighbours[k]>0)){ //&&(stage_centroid_values[k] > elevation_centroid_values[k])){1175 if((count_wet_neighbours[k]>0)){//&&(k_wetdry==0)){ 1150 1176 limit_gradient(dqv, qmin, qmax, beta_tmp); 1151 1177 stage_edge_values[k3+0] = stage_centroid_values[k] + dqv[0]; … … 1153 1179 stage_edge_values[k3+2] = stage_centroid_values[k] + dqv[2]; 1154 1180 }else{ 1155 //if(count_wet_neighbours[k]==0){ 1156 //weight=max(neighbour_wetness_scale[k] - (stage_centroid_values[k]-elevation_centroid_values[k]), 0.); 1157 //weight/=(max_elevation_edgevalue[k] - elevation_centroid_values[k]); 1158 //weight=min(weight, 1.0); 1159 //weight==0; 1160 //weight=0.; 1161 // 'Shallow flow on steep slope' 1181 ////if(count_wet_neighbours[k]==0){ 1182 // //weight=max(cell_wetness_scale[k] - (stage_centroid_values[k]-elevation_centroid_values[k]), 0.); 1183 // //weight/=(max_elevation_edgevalue[k] - elevation_centroid_values[k]); 1184 // //weight=min(weight, 1.0); 1185 // //weight==0; 1186 // //weight=0.; 1187 // // 'Shallow flow on steep slope' 1188 // //limit_gradient(dqv, qmin, qmax, beta_tmp); 1162 1189 stage_edge_values[k3+0] =stage_centroid_values[k] + dqv[0]; 1163 1190 stage_edge_values[k3+1] =stage_centroid_values[k] + dqv[1]; 1164 1191 stage_edge_values[k3+2] =stage_centroid_values[k] + dqv[2]; 1165 1192 1166 // There exists a neighbouring bed cell with elevation > minimum1167 // neighbouring stage value1168 1169 // We have to be careful in this situation. Limiting the stage gradient can1170 // cause problems for shallow flows down steep slopes (rainfall-runoff type problems)1171 // Previously 'balance_deep_and_shallow' was used to deal with this issue1172 //for(i=0; i<3; i++){1173 // stage_edge_values[k3+i] = weight*stage_edge_values[k3+i] +1174 // (1.0-weight)*(stage_centroid_values[k] -elevation_centroid_values[k]1175 // +elevation_edge_values[k3+i]);1176 //}1193 // // There exists a neighbouring bed cell with elevation > minimum 1194 // // neighbouring stage value 1195 1196 // // We have to be careful in this situation. Limiting the stage gradient can 1197 // // cause problems for shallow flows down steep slopes (rainfall-runoff type problems) 1198 // // Previously 'balance_deep_and_shallow' was used to deal with this issue 1199 // //for(i=0; i<3; i++){ 1200 // // stage_edge_values[k3+i] = weight*stage_edge_values[k3+i] + 1201 // // (1.0-weight)*(stage_centroid_values[k] -elevation_centroid_values[k] 1202 // // +elevation_edge_values[k3+i]); 1203 // //} 1177 1204 } 1178 1205 … … 1214 1241 //if(stagemin>=bedmax){ 1215 1242 if((count_wet_neighbours[k]>0) && 1216 (stage_centroid_values[k]>(minimum_allowed_height+elevation_centroid_values[k]))){ 1243 (cell_wetness_scale[k]==1.0)){ 1244 //(stage_centroid_values[k]>(minimum_allowed_height+elevation_centroid_values[k]))){ 1217 1245 limit_gradient(dqv, qmin, qmax, beta_tmp); 1218 1246 }else{ … … 1266 1294 //if(stagemin>=bedmax){ 1267 1295 if((count_wet_neighbours[k]>0)&& 1268 (stage_centroid_values[k]>(minimum_allowed_height+elevation_centroid_values[k]))){ 1296 (cell_wetness_scale[k]==1.0)){ 1297 //(stage_centroid_values[k]>(minimum_allowed_height+elevation_centroid_values[k]))){ 1269 1298 limit_gradient(dqv, qmin, qmax, beta_tmp); 1270 1299 }else{ … … 1457 1486 // // Hack for 'dry' cells 1458 1487 // // Make sure edge value is not greater than neighbour edge value 1459 // if(stage_centroid_values[k] - elevation_centroid_values[k] < minimum_allowed_height+epsilon){ 1488 // //if(stage_centroid_values[k] - elevation_centroid_values[k] < minimum_allowed_height+epsilon){ 1489 // if(cell_wetness_scale[k]==0.0){ 1460 1490 // for(i=0; i<3;i++){ 1461 1491 // if(surrogate_neighbours[3*k+i] >= 0){ 1462 1492 // ktmp=3*surrogate_neighbours[3*k+i] + neighbour_edges[3*k+i]; 1463 // //if( neighbour_wetness_scale[surrogate_neighbours[3*k+i]]>0.){1464 // stage_edge_values[3*k+i] = m ax(stage_edge_values[3*k+i], stage_edge_values[ktmp]);1493 // //if(cell_wetness_scale[surrogate_neighbours[3*k+i]]>0.){ 1494 // stage_edge_values[3*k+i] = min(stage_edge_values[3*k+i], stage_edge_values[ktmp]); 1465 1495 // } 1466 1496 // } … … 1518 1548 free(ymom_centroid_store); 1519 1549 free(stage_centroid_store); 1520 free(min_elevation_edgevalue);1550 //free(min_elevation_edgevalue); 1521 1551 free(max_elevation_edgevalue); 1522 free( neighbour_wetness_scale);1552 free(cell_wetness_scale); 1523 1553 free(count_wet_neighbours); 1524 1554 -
trunk/anuga_work/development/gareth/tests/runup_sinusoid/runup_sinusoid.py
r8547 r8549 37 37 38 38 def stagefun(x,y): 39 stge=-0.2*scale_me # 39 stge=-0.2*scale_me #+0.01*(x>0.9) 40 40 #topo=topography(x,y) 41 41 return stge#*(stge>topo) + (topo)*(stge<=topo) … … 72 72 # Associate boundary tags with boundary objects 73 73 #---------------------------------------------- 74 domain.set_boundary({'left': Br, 'right': B r, 'top': Br, 'bottom':Br})74 domain.set_boundary({'left': Br, 'right': Bd, 'top': Br, 'bottom':Br}) 75 75 76 76 #------------------------------ … … 78 78 #------------------------------ 79 79 80 for t in domain.evolve(yieldstep=0.2,finaltime= 20.0):80 for t in domain.evolve(yieldstep=0.2,finaltime=40.0): 81 81 print domain.timestepping_statistics() 82 82 xx = domain.quantities['xmomentum'].centroid_values -
trunk/anuga_work/development/gareth/tests/shallow_steep_slope/channel_SU_sparse.py
r8547 r8549 30 30 #------------------------------------------------------------------------------ 31 31 points, vertices, boundary = rectangular_cross(10, 10, 32 len1=100.0, len2=100.0) # Mesh32 len1=100.0, len2=100.0) # Mesh 33 33 domain = Domain(points, vertices, boundary) # Create domain 34 34 domain.set_name('channel_SU_2_v2') # Output name 35 domain.set_store_vertices_uniquely(True)36 domain.CFL=1.035 #domain.set_store_vertices_uniquely(True) 36 #domain.CFL=1.0 37 37 #------------------------------------------------------------------------------ 38 38 # Setup initial conditions 39 39 #------------------------------------------------------------------------------ 40 40 def topography(x, y): 41 return -x/10. + numpy.sin(x/10.) +abs(y-50.)/100. # linear bed slope41 return -x/10. #+ numpy.sin(x/10.) +abs(y-50.)/100. # linear bed slope 42 42 43 43 def stagetopo(x,y): … … 53 53 domain.set_quantity('friction', 0.03) # Constant friction 54 54 domain.set_quantity('stage', stagetopo) 55 55 56 #------------------------------------------------------------------------------ 56 57 # Setup boundary conditions … … 69 70 domain.set_boundary({'left': Br, 'right': Bo, 'top': Br, 'bottom': Br}) 70 71 72 73 myindex=((domain.centroid_coordinates[:,0] - 50.)**2 + (domain.centroid_coordinates[:,1] - 50.)**2).argmin() 74 71 75 #------------------------------------------------------------------------------ 72 76 # Evolve system through time 73 77 #------------------------------------------------------------------------------ 74 78 for t in domain.evolve(yieldstep=4.0, finaltime=400.0): 75 print domain.timestepping_statistics() 79 print domain.timestepping_statistics() 80 #print domain.quantities['stage'].centroid_values[myindex] - domain.quantities['elevation'].centroid_values[myindex] 81 s3 = domain.get_flow_through_cross_section([[30., 0.0], [30., 100.]]) 82 s4 = domain.get_flow_through_cross_section([[32., 0.0], [32., 100.]]) 83 s5 = domain.get_flow_through_cross_section([[34., 0.0], [34., 100.]]) 84 s2 = domain.get_flow_through_cross_section([[45., 0.0], [45., 100.]]) 85 s1 = domain.get_flow_through_cross_section([[53., 0.0], [53., 100.]]) 86 s0 = domain.get_flow_through_cross_section([[60., 0.0], [60., 100.]]) 87 print 'Xsectional flow:', s0, s1, s2, s3, s4, s5 88
Note: See TracChangeset
for help on using the changeset viewer.