void FluidSim::project(float dt) { //Compute finite-volume type face area weight for each velocity sample. compute_weights(); //Set up and solve the variational pressure solve. solve_pressure(dt); }
void lspjvm_quantise(float *x, float *xq, int ndim) { int i, n1, n2, n3; float err[LPC_ORD], err2[LPC_ORD], err3[LPC_ORD]; float w[LPC_ORD], w2[LPC_ORD], w3[LPC_ORD]; const float *codebook1 = lsp_cbjvm[0].cb; const float *codebook2 = lsp_cbjvm[1].cb; const float *codebook3 = lsp_cbjvm[2].cb; w[0] = MIN(x[0], x[1]-x[0]); for (i=1;i<ndim-1;i++) w[i] = MIN(x[i]-x[i-1], x[i+1]-x[i]); w[ndim-1] = MIN(x[ndim-1]-x[ndim-2], PI-x[ndim-1]); compute_weights(x, w, ndim); n1 = find_nearest(codebook1, lsp_cbjvm[0].m, x, ndim); for (i=0;i<ndim;i++) { xq[i] = codebook1[ndim*n1+i]; err[i] = x[i] - xq[i]; } for (i=0;i<ndim/2;i++) { err2[i] = err[2*i]; err3[i] = err[2*i+1]; w2[i] = w[2*i]; w3[i] = w[2*i+1]; } n2 = find_nearest_weighted(codebook2, lsp_cbjvm[1].m, err2, w2, ndim/2); n3 = find_nearest_weighted(codebook3, lsp_cbjvm[2].m, err3, w3, ndim/2); for (i=0;i<ndim/2;i++) { xq[2*i] += codebook2[ndim*n2/2+i]; xq[2*i+1] += codebook3[ndim*n3/2+i]; } }
void encode_lsps_vq(int *indexes, float *x, float *xq, int ndim) { int i, n1, n2, n3; float err[LPC_ORD], err2[LPC_ORD], err3[LPC_ORD]; float w[LPC_ORD], w2[LPC_ORD], w3[LPC_ORD]; const float *codebook1 = lsp_cbjvm[0].cb; const float *codebook2 = lsp_cbjvm[1].cb; const float *codebook3 = lsp_cbjvm[2].cb; assert(ndim <= LPC_ORD); w[0] = MIN(x[0], x[1]-x[0]); for (i=1;i<ndim-1;i++) w[i] = MIN(x[i]-x[i-1], x[i+1]-x[i]); w[ndim-1] = MIN(x[ndim-1]-x[ndim-2], PI-x[ndim-1]); compute_weights(x, w, ndim); n1 = find_nearest(codebook1, lsp_cbjvm[0].m, x, ndim); for (i=0;i<ndim;i++) { xq[i] = codebook1[ndim*n1+i]; err[i] = x[i] - xq[i]; } for (i=0;i<ndim/2;i++) { err2[i] = err[2*i]; err3[i] = err[2*i+1]; w2[i] = w[2*i]; w3[i] = w[2*i+1]; } n2 = find_nearest_weighted(codebook2, lsp_cbjvm[1].m, err2, w2, ndim/2); n3 = find_nearest_weighted(codebook3, lsp_cbjvm[2].m, err3, w3, ndim/2); indexes[0] = n1; indexes[1] = n2; indexes[2] = n3; }
static int bsimp_step_local (void *vstate, size_t dim, const double t0, const double h_total, const unsigned int n_step, const double y[], const double yp[], const double dfdt[], const gsl_matrix * dfdy, double y_out[], const gsl_odeiv2_system * sys) { bsimp_state_t *state = (bsimp_state_t *) vstate; gsl_matrix *const a_mat = state->a_mat; gsl_permutation *const p_vec = state->p_vec; double *const delta = state->delta; double *const y_temp = state->y_temp; double *const delta_temp = state->delta_temp; double *const rhs_temp = state->rhs_temp; double *const w = state->weight; gsl_vector_view y_temp_vec = gsl_vector_view_array (y_temp, dim); gsl_vector_view delta_temp_vec = gsl_vector_view_array (delta_temp, dim); gsl_vector_view rhs_temp_vec = gsl_vector_view_array (rhs_temp, dim); const double h = h_total / n_step; double t = t0 + h; double sum; /* This is the factor sigma referred to in equation 3.4 of the paper. A relative change in y exceeding sigma indicates a runaway behavior. According to the authors suitable values for sigma are >>1. I have chosen a value of 100*dim. BJG */ const double max_sum = 100.0 * dim; int signum, status; size_t i, j; size_t n_inter; /* Calculate the matrix for the linear system. */ for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++) { gsl_matrix_set (a_mat, i, j, -h * gsl_matrix_get (dfdy, i, j)); } gsl_matrix_set (a_mat, i, i, gsl_matrix_get (a_mat, i, i) + 1.0); } /* LU decomposition for the linear system. */ gsl_linalg_LU_decomp (a_mat, p_vec, &signum); /* Compute weighting factors */ compute_weights (y, w, dim); /* Initial step. */ for (i = 0; i < dim; i++) { y_temp[i] = h * (yp[i] + h * dfdt[i]); } gsl_linalg_LU_solve (a_mat, p_vec, &y_temp_vec.vector, &delta_temp_vec.vector); sum = 0.0; for (i = 0; i < dim; i++) { const double di = delta_temp[i]; delta[i] = di; y_temp[i] = y[i] + di; sum += fabs (di) / w[i]; } if (sum > max_sum) { return GSL_EFAILED; } /* Intermediate steps. */ status = GSL_ODEIV_FN_EVAL (sys, t, y_temp, y_out); if (status) { return status; } for (n_inter = 1; n_inter < n_step; n_inter++) { for (i = 0; i < dim; i++) { rhs_temp[i] = h * y_out[i] - delta[i]; } gsl_linalg_LU_solve (a_mat, p_vec, &rhs_temp_vec.vector, &delta_temp_vec.vector); sum = 0.0; for (i = 0; i < dim; i++) { delta[i] += 2.0 * delta_temp[i]; y_temp[i] += delta[i]; sum += fabs (delta[i]) / w[i]; } if (sum > max_sum) { return GSL_EFAILED; } t += h; status = GSL_ODEIV_FN_EVAL (sys, t, y_temp, y_out); if (status) { return status; } } /* Final step. */ for (i = 0; i < dim; i++) { rhs_temp[i] = h * y_out[i] - delta[i]; } gsl_linalg_LU_solve (a_mat, p_vec, &rhs_temp_vec.vector, &delta_temp_vec.vector); sum = 0.0; for (i = 0; i < dim; i++) { y_out[i] = y_temp[i] + delta_temp[i]; sum += fabs (delta_temp[i]) / w[i]; } if (sum > max_sum) { return GSL_EFAILED; } return GSL_SUCCESS; }