//The main fluid simulation step void FluidSim::advance(float dt) { float t = 0; while(t < dt) { float substep = cfl(); if(t + substep > dt) substep = dt - t; //Passively advect particles advect_particles(substep); //Estimate the liquid signed distance compute_phi(); //Advance the velocity advect(substep); add_force(substep); apply_viscosity(substep); apply_projection(substep); //Pressure projection only produces valid velocities in faces with non-zero associated face area. //Because the advection step may interpolate from these invalid faces, //we must extrapolate velocities from the fluid domain into these zero-area faces. extrapolate(u, u_valid); extrapolate(v, v_valid); //For extrapolated velocities, replace the normal component with //that of the object. constrain_velocity(); t+=substep; } }
void FluidSim::project(float dt) { //Estimate the liquid signed distance compute_phi(); //Compute finite-volume type face area weight for each velocity sample. compute_weights(); //Set up and solve the variational pressure solve. solve_pressure(dt); }
int main() { char pattern[30]; char text[200]; int i; int ch; pattern[0] = '0'; printf("Pattern = "); scanf("%s\n", &pattern[1]); arr = (int *)malloc(sizeof(char) * (strlen(pattern) + 1) ); compute_phi(pattern); text[0] = '0'; scanf("%s", &text[1]); for( i = 1; i<=strlen(&text[1]); i++) printf("%2d ",i); printf("\n"); for( i = 1; i<=strlen(&text[1]); i++) printf("%2c ", text[i]); printf("\n"); for( i = 1; i<=strlen(&pattern[1]); i++) printf("%2c ", pattern[i]); printf("\n"); while(1) { match(text, pattern); printf("\n\n\n "); int retval; int i=1; int ch; ch = getc(stdin); if( ch == EOF) break; while(ch!='\n' && ch != EOF ){ text[i++] = ch; ch = getc(stdin); } text[i]='\0'; printf("%s\n", &text[1]); if( retval < 0 ){ printf("finished\n"); break; } } }
static gboolean process (GeglOperation *operation, GeglBuffer *input, GeglBuffer *output, const GeglRectangle *roi, gint level) { GeglOperationAreaFilter *op_area = GEGL_OPERATION_AREA_FILTER (operation); GeglProperties *o = GEGL_PROPERTIES (operation); gfloat *in_buf, *out_buf, *out_pixel; gint x, y; GeglRectangle src_rect; GeglRectangle *whole_region; gdouble angle; gdouble center_x, center_y; whole_region = gegl_operation_source_get_bounding_box (operation, "input"); center_x = gegl_coordinate_relative_to_pixel ( o->center_x, whole_region->width); center_y = gegl_coordinate_relative_to_pixel ( o->center_y, whole_region->height); src_rect = *roi; src_rect.x -= op_area->left; src_rect.y -= op_area->top; src_rect.width += op_area->left + op_area->right; src_rect.height += op_area->top + op_area->bottom; in_buf = g_new (gfloat, src_rect.width * src_rect.height * 4); out_buf = g_new0 (gfloat, roi->width * roi->height * 4); out_pixel = out_buf; gegl_buffer_get (input, &src_rect, 1.0, babl_format ("RaGaBaA float"), in_buf, GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE); angle = o->angle * G_PI / 180.0; while (angle < 0.0) angle += 2 * G_PI; for (y = roi->y; y < roi->height + roi->y; ++y) { for (x = roi->x; x < roi->width + roi->x; ++x) { gint c, i; gdouble phi_base, phi_start, phi_step; gfloat sum[] = {0, 0, 0, 0}; gint count = 0; gdouble xr = x - center_x; gdouble yr = y - center_y; gdouble radius = sqrt (SQR (xr) + SQR (yr)); /* This is not the "real" length, a bit shorter */ gdouble arc_length = radius * angle * SQRT_2; /* ensure quality with small angles */ gint n = MAX (ceil (arc_length), 3); /* performance concern */ if (n > NOMINAL_NUM_IT) n = NOMINAL_NUM_IT + (gint) sqrt (n - NOMINAL_NUM_IT); phi_base = compute_phi (xr, yr); phi_start = phi_base + angle / 2.0; phi_step = angle / (gdouble) n; /* Iterate other the arc */ for (i = 0; i < n; i++) { gfloat s_val = sin (phi_start - i * phi_step); gfloat c_val = cos (phi_start - i * phi_step); gfloat ix = center_x + radius * c_val; gfloat iy = center_y + radius * s_val; if (ix >= whole_region->x && ix < whole_region->x + whole_region->width && iy >= whole_region->y && iy < whole_region->y + whole_region->height) { /* do bilinear interpolation to get a nice smooth result */ gfloat dx = ix - floor (ix); gfloat dy = iy - floor (iy); gfloat *pix0, *pix1, *pix2, *pix3; gfloat mixy0[4]; gfloat mixy1[4]; pix0 = get_pixel_color (in_buf, &src_rect, ix, iy); pix1 = get_pixel_color (in_buf, &src_rect, ix+1, iy); pix2 = get_pixel_color (in_buf, &src_rect, ix, iy+1); pix3 = get_pixel_color (in_buf, &src_rect, ix+1, iy+1); for (c = 0; c < 4; ++c) { mixy0[c] = dy * (pix2[c] - pix0[c]) + pix0[c]; mixy1[c] = dy * (pix3[c] - pix1[c]) + pix1[c]; sum[c] += dx * (mixy1[c] - mixy0[c]) + mixy0[c]; } count++; } } if (count == 0) { gfloat *pix = get_pixel_color (in_buf, &src_rect, x, y); for (c = 0; c < 4; ++c) *out_pixel++ = pix[c]; } else { for (c = 0; c < 4; ++c) *out_pixel++ = sum[c] / (gfloat) count; } } } gegl_buffer_set (output, roi, 0, babl_format ("RaGaBaA float"), out_buf, GEGL_AUTO_ROWSTRIDE); g_free (in_buf); g_free (out_buf); return TRUE; }