/* see gfs_face_velocity_advection_flux() for the initial implementation with static boundaries */ static void moving_face_velocity_advection_flux (const FttCellFace * face, const GfsAdvectionParams * par) { gdouble flux; FttComponent c = par->v->component; g_return_if_fail (c >= 0 && c < FTT_DIMENSION); /* fixme: what's up with face mapping? */ flux = face_fraction_half (face, par)*GFS_FACE_NORMAL_VELOCITY (face)* par->dt/ftt_cell_size (face->cell); #if 0 if (c == face->d/2) /* normal component */ flux *= GFS_FACE_NORMAL_VELOCITY (face); else /* tangential component */ #else flux *= gfs_face_upwinded_value (face, par->upwinding, par->u) /* pressure correction */ - gfs_face_interpolated_value (face, par->g[c]->i)*par->dt/2.; #endif if (!FTT_FACE_DIRECT (face)) flux = - flux; GFS_VALUE (face->cell, par->fv) -= flux; switch (ftt_face_type (face)) { case FTT_FINE_FINE: GFS_VALUE (face->neighbor, par->fv) += flux; break; case FTT_FINE_COARSE: GFS_VALUE (face->neighbor, par->fv) += flux/FTT_CELLS; break; default: g_assert_not_reached (); } }
static void poisson_coeff_por (FttCellFace * face, PoissonCoeff_por * p) { gdouble alpha = p->alpha ? (gfs_function_face_value (p->alpha, face)*gfs_function_face_value (p->phi, face)) : gfs_function_face_value (p->phi, face); gdouble v = p->lambda2[face->d/2]*alpha*gfs_domain_face_fraction (p->domain, face)/ gfs_domain_face_scale_metric (p->domain, face, face->d/2); if (alpha <= 0. && p->positive) { FttVector p; ftt_face_pos (face, &p); g_log (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, "alpha is negative (%g) at face (%g,%g,%g).\n" "Please check your definition.", alpha, p.x, p.y, p.z); } GFS_STATE (face->cell)->f[face->d].v += v; switch (ftt_face_type (face)) { case FTT_FINE_FINE: GFS_STATE (face->neighbor)->f[FTT_OPPOSITE_DIRECTION (face->d)].v += v; break; case FTT_FINE_COARSE: GFS_STATE (face->neighbor)->f[FTT_OPPOSITE_DIRECTION (face->d)].v += v/FTT_CELLS_DIRECTION (face->d); break; default: g_assert_not_reached (); } }
static void correct_face_velocity (FttCell * cell) { FttDirection d; for (d = 0; d < FTT_NEIGHBORS; d++) { FttCellFace face = gfs_cell_face(cell, d); if (GFS_FACE_FRACTION_RIGHT (&face) != 0. && face.neighbor) { switch (ftt_face_type (&face)) { case FTT_FINE_FINE: GFS_STATE (face.neighbor)->f[FTT_OPPOSITE_DIRECTION(face.d)].un = GFS_STATE (cell)->f[face.d].un; break; case FTT_FINE_COARSE: GFS_STATE (cell)->f[face.d].un = GFS_STATE (face.neighbor)->f[FTT_OPPOSITE_DIRECTION(face.d)].un; break; default: g_assert_not_reached (); } } } }
/* see gfs_face_advection_flux() for the initial implementation with static boundaries */ static void moving_face_advection_flux (const FttCellFace * face, const GfsAdvectionParams * par) { gdouble flux; /* fixme: what's up with face mapping? */ flux = face_fraction_half (face, par)*GFS_FACE_NORMAL_VELOCITY (face)*par->dt* gfs_face_upwinded_value (face, GFS_FACE_UPWINDING, NULL)/ftt_cell_size (face->cell); if (!FTT_FACE_DIRECT (face)) flux = - flux; GFS_VALUE (face->cell, par->fv) -= flux; switch (ftt_face_type (face)) { case FTT_FINE_FINE: GFS_VALUE (face->neighbor, par->fv) += flux; break; case FTT_FINE_COARSE: GFS_VALUE (face->neighbor, par->fv) += flux/FTT_CELLS; break; default: g_assert_not_reached (); } }