//transition function void sciddicaT_transition_function(struct CALModel2D* sciddicaT, int i, int j) { CALbyte eliminated_cells[5]= {CAL_FALSE,CAL_FALSE,CAL_FALSE,CAL_FALSE,CAL_FALSE}; CALbyte again; CALint cells_count; CALreal average; CALreal m; CALreal u[5]; CALint n; CALreal z, h; CALreal f; m = calGet2Dr(sciddicaT, Q.h, i, j) - P.epsilon; u[0] = calGet2Dr(sciddicaT, Q.z, i, j) + P.epsilon; for (n=1; n<sciddicaT->sizeof_X; n++) { z = calGetX2Dr(sciddicaT, Q.z, i, j, n); h = calGetX2Dr(sciddicaT, Q.h, i, j, n); u[n] = z + h; } //computes outflows do { again = CAL_FALSE; average = m; cells_count = 0; for (n=0; n<sciddicaT->sizeof_X; n++) if (!eliminated_cells[n]) { average += u[n]; cells_count++; } if (cells_count != 0) average /= cells_count; for (n=0; n<sciddicaT->sizeof_X; n++) if( (average<=u[n]) && (!eliminated_cells[n]) ) { eliminated_cells[n]=CAL_TRUE; again=CAL_TRUE; } } while (again); for (n=1; n<sciddicaT->sizeof_X; n++) if (!eliminated_cells[n]) { f = (average-u[n])*P.r; calSet2Dr (sciddicaT,Q.h,i,j, calGetNext2Dr (sciddicaT,Q.h,i,j) - f ); calSetX2Dr(sciddicaT,Q.h,i,j,n, calGetNextX2Dr(sciddicaT,Q.h,i,j,n) + f ); #ifdef ACTIVE_CELLS //adds the cell (i, j, n) to the set of active ones calAddActiveCellX2D(sciddicaT, i, j, n); #endif } }
void s3hexFlowsComputation(struct CALModel2D* s3hex, int i, int j) { CALbyte eliminated_cells[7]={CAL_FALSE,CAL_FALSE,CAL_FALSE,CAL_FALSE,CAL_FALSE, CAL_FALSE, CAL_FALSE}; CALbyte again; CALint cells_count; CALreal average; CALreal m; CALreal u[7], delta_H[7], delta_z[7]; CALint n; CALreal z_0, h_0, z_n, h_n, runup_0, z_0_plus_runup_0, sum; CALreal f; if (calGet2Dr(s3hex,Q.h,i,j) <= P.adh) return; z_0 = calGet2Dr(s3hex, Q.z, i, j); h_0 = calGet2Dr(s3hex, Q.h, i, j); runup_0 = calGet2Dr(s3hex, Q.p, i, j) / h_0; z_0_plus_runup_0 = z_0 + runup_0; m = runup_0; u[0] = z_0; delta_z[0] = 0; delta_H[0] = 0; for (n=1; n<s3hex->sizeof_X; n++) { z_n = calGetX2Dr(s3hex, Q.z, i, j, n); h_n = calGetX2Dr(s3hex, Q.h, i, j, n); u[n] = z_n + h_n; delta_z[n] = z_0 - z_n; delta_H[n] = z_0_plus_runup_0 - u[n]; } for (n=1; n<s3hex->sizeof_X; n++) eliminated_cells[n] = (delta_H[n] < P.f); //computes outflows do{ again = CAL_FALSE; average = m; cells_count = 0; for (n=0; n<s3hex->sizeof_X; n++) if (!eliminated_cells[n]){ average += u[n]; cells_count++; } if (cells_count != 0) average /= cells_count; for (n=0; n<s3hex->sizeof_X; n++) if( (average<=u[n]) && (!eliminated_cells[n]) ){ eliminated_cells[n]=CAL_TRUE; again=CAL_TRUE; } }while (again); sum = 0; for (n=0; n<s3hex->sizeof_X; n++) if (!eliminated_cells[n]) sum += average - u[n]; for (n=1; n<s3hex->sizeof_X; n++) if (!eliminated_cells[n]) { //f = (h_0 - P.adh) * ((average-u[n])/sum) * P.r; f = h_0 * ((average-u[n])/sum) * P.r; calSet2Dr (s3hex,Q.h,i,j, calGetNext2Dr (s3hex,Q.h,i,j) - f ); calSetX2Dr(s3hex,Q.h,i,j,n, calGetNextX2Dr(s3hex,Q.h,i,j,n) + f ); calSet2Dr (s3hex,Q.p,i,j, calGetNext2Dr (s3hex,Q.p,i,j) - runup_0 * f ); calSetX2Dr(s3hex,Q.p,i,j,n, calGetNextX2Dr(s3hex,Q.p,i,j,n) + (z_0_plus_runup_0 - u[n]) * f ); #ifdef ACTIVE_CELLS //adds the cell (i, j, n) to the set of active ones calAddActiveCellX2D(s3hex, i, j, n); #endif } }