inline static void lb_init_droplet() { int x, y, i; double rho, cs2, w[lbmodel.n_vel]; double dx, dy, rc, re, a, b, iw, cos; double *f = lbf; iw = 0.1;//*lblattice.grid[0]/20.0; a = 5.0;//*lblattice.grid[0]/20.0; b = 5.0;//*lblattice.grid[0]/20.0; for (x=0; x<lblattice.halo_grid[0]; ++x) { for (y=0; y<lblattice.halo_grid[1]; ++y, f+=lbmodel.n_vel) { dx = (double)(x - lblattice.halo_grid[0]/2); dy = (double)(y - lblattice.halo_grid[1]/2); rc = sqrt(dx*dx + dy*dy); if (rc==0.) { cos = 1.; } else { cos = dx/rc; } re = a*b/sqrt(a*a + (b*b-a*a)*cos*cos); rho = 0.5*(RHO_HIGH-RHO_LOW)*tanh((re-rc)/iw) + (RHO_HIGH+RHO_LOW)/2; for (i=0; i<lbmodel.n_vel; ++i) { cs2 = eq_state(rho); lb_weights(w, cs2); f[i] = w[i]*rho; } lb_calc_local_moments(f); } } }
void star2dR::solve_definitions(solver *op) { star2d::solve_definitions(op); matrix rho0,xi0,eps0; double rhoc0,Xc0; rho0=rho;xi0=opa.xi;eps0=nuc.eps;rhoc0=rhoc;Xc0=Xc; double dXc=1e-8; Xc+=dXc; init_comp(); nuclear(); opacity(); eq_state(); matrix drho_dXc,dxi_dXc,deps_dXc,dlnrhoc_dXc; dlnrhoc_dXc=(rhoc-rhoc0)/rhoc0/dXc*ones(1,1); drho_dXc=(rho-rho0)/dXc+rho0*dlnrhoc_dXc; dxi_dXc=(opa.xi-xi0)/dXc; deps_dXc=(nuc.eps-eps0)/dXc; Xc=Xc0; fill(); for(int n=0;n<ndomains;n++) op->add_d(n,"log_rhoc","Xc",dlnrhoc_dXc); op->add_d("rho","Xc",drho_dXc); op->add_d("opa.xi","Xc",dxi_dXc); op->add_d("nuc.eps","Xc",deps_dXc); }
void star2dR::fill() { init_comp(); eq_state(); m=2*PI*(map.gl.I,rho*r*r*map.rz,map.leg.I_00)(0); M=m*rhoc*R*R*R; double R0=R; star2d::fill(); R=R0; Omega_bk=Omega/Omegac; if(Teff_obj==-1) Teff_obj=map.leg.eval_00(Teff(),0)(0); if(Re_obj==-1) Re_obj=map.leg.eval_00(r.row(-1),PI/2)(0)*R; }
static void lb_calc_local_moments(double *f) { int i; double *m = f + lblattice.halo_grid_volume*lbmodel.n_vel; double rho, p, dp, d2p; for (i=0; i<lbmodel.n_vel; ++i) { m[i] = 0.0; } for (i=0; i<lbmodel.n_vel; ++i) { m[0] += f[i]; m[1] += f[i]*lbmodel.c[i][0]; m[2] += f[i]*lbmodel.c[i][1]; m[3] += f[i]*lbmodel.c[i][0]*lbmodel.c[i][0]; m[4] += f[i]*lbmodel.c[i][1]*lbmodel.c[i][1]; m[5] += f[i]*lbmodel.c[i][0]*lbmodel.c[i][1]; } /* evaluate equation of state */ rho = m[0]; p = rho*eq_state(rho); dp = derP(rho); d2p = der2P(rho); LB_Moments *lbmom = (LB_Moments *)m; /* pressure and derivatives */ lbmom->p = p; lbmom->dp = dp; lbmom->pmrdp = p - rho*dp; lbmom->rd2p = rho*d2p; /* force */ lbmom->force[0] = 0.0; lbmom->force[1] = 0.0; /* velocity */ lbmom->u[0] = m[1]/m[0]; lbmom->u[1] = m[2]/m[0]; /* correction current */ //lbmom->jcorr[0] = 0.0; //lbmom->jcorr[1] = 0.0; }
static void lb_init_interface() { int x, y, i; double rho, cs2, w[lbmodel.n_vel]; double dx; double *f = lbf; for (x=0; x<lblattice.halo_grid[0]; ++x) { for (y=0; y<lblattice.halo_grid[1]; ++y, f+=lbmodel.n_vel) { dx = (double)(x - lblattice.halo_grid[0]/2); rho = 0.5*(RHO_HIGH-RHO_LOW)*(cos(2.*M_PI/lblattice.grid[0]*dx)) + RHO_MEAN; for (i=0; i<lbmodel.n_vel; ++i) { cs2 = eq_state(rho); lb_weights(w, cs2); f[i] = w[i]*rho; } lb_calc_local_moments(f); } } }
static void lb_collisions(double *f, int x, int y) { lb_bulk_collisions(f); mlb_interface_collisions(f); mlb_correction_collisions(f); int i; double rho, w[lbmodel.n_vel]; for (i=0; i<lbmodel.n_vel; ++i) { if (f[i] < 0.) { rho = (f+lbmodel.n_vel*lblattice.halo_grid_volume)[0]; lb_weights(w, eq_state(rho)); fprintf(stderr, "Negative populations at (%d,%d) f[%d] = %f rho = %f w[%d] = %f\n", x, y, i, f[i], rho, i, w[i]); exit(-1); } } }
static void lb_calc_equilibrium(double *f_eq, double *f) { int i; double w[lbmodel.n_vel]; double rho, *u, uc, u2, cs2; LB_Moments *m = (LB_Moments *)(f + lblattice.halo_grid_volume*lbmodel.n_vel); rho = m->rho; //u[0] = (m[1] + 0.5*force[0])/rho; //u[1] = (m[2] + 0.5*force[1])/rho; u = m->u; // m + 12 cs2 = eq_state(rho); lb_weights(w, cs2); u2 = (u[0]*u[0] + u[1]*u[1])/cs2; for (i=0; i<lbmodel.n_vel; ++i) { uc = (u[0]*lbmodel.c[i][0] + u[1]*lbmodel.c[i][1])/cs2; f_eq[i] = w[i]*rho*(1.0 + uc + 0.5*uc*uc - 0.5*u2); } }
HIGHLIGHT_STATE lattr_get(struct lattr_db *db, struct high_syntax *y, P *p, ptrdiff_t line) { /* Past end of file? */ if (line > p->b->eof->line) { HIGHLIGHT_STATE x; clear_state(&x); return x; } /* Check if we need to expand */ if (line >= lattr_size(db)) { /* Expand by this amount */ ptrdiff_t amnt = line - lattr_size(db) + 1; /* Set position to end */ lattr_hole(db, lattr_size(db)); lattr_check(db, amnt); db->ehole -= amnt; /* Set invalid window to cover new space */ if (db->invalid_window == -1) { db->first_invalid = lattr_size(db) - amnt; db->invalid_window = amnt; } else { db->invalid_window = lattr_size(db) - db->first_invalid; } } /* Check if we need to shrink */ /* if (p->b->eof->line + 1 < lattr_size(db)) { lattr_hole(db, p->b->eof->line + 1); db->ehole = db->end; if (db->first_invalid > lattr_size(db)) { db->first_invalid = lattr_size(db); db->invalid_window = -1; } if (db->invalid_window != -1 && db->first_invalid + db->invalid_window > lattr_size(db)) { db->invalid_window = lattr_size(db) - db->first_invalid; } } */ /* Check if we are pointing to a valid record */ if (line >= db->first_invalid) { ptrdiff_t ln; P *tmp = 0; HIGHLIGHT_STATE state; tmp = pdup(p, "lattr_get"); ln = db->first_invalid; /* First line with known good state */ state = lattr_lvalue(db, ln - 1); /* Known good state */ /* Compute up to requested line */ pline(tmp, ln - 1); /* Recompute everything in invalid window */ while (ln < db->first_invalid + db->invalid_window) { state = parse(y, tmp, state, p->b->o.charmap); lattr_st(db, ln, &state); ++ln; } /* Update invalid window: hopefully we did the whole window */ db->invalid_window -= ln - db->first_invalid; db->first_invalid = ln; /* Recompute until match found. If match is found, we can assume rest is valid */ while (ln < lattr_size(db)) { HIGHLIGHT_STATE *prev; state = parse(y, tmp, state, p->b->o.charmap); prev = lattr_gt(db, ln); if (!eq_state(prev, &state)) lattr_st(db, ln, &state); else { db->first_invalid = lattr_size(db); db->invalid_window = -1; ++ln; break; } ++ln; } /* Update invalid pointer */ if (ln > db->first_invalid) { db->first_invalid = ln; db->invalid_window = 0; } if (ln == lattr_size(db)) { db->first_invalid = ln; db->invalid_window = -1; } prm(tmp); } /* Check it */ #ifdef junk { HIGHLIGHT_STATE st; P *tmp =pdup(p, "lattr_get"); pline(tmp, 0); clear_state(&st); for (z = 0; z != db->first_invalid; ++z) { HIGHLIGHT_STATE *prev; prev = lattr_gt(db, z); if (prev->state != st.state) { printf("** Mismatch!! %d %d %d %d **\n",z,tmp->line,prev->state,st.state); abort(); } st = parse(y, tmp, st, p->b->o.charmap); } prm(tmp); } #endif /* Return with attribute */ return lattr_lvalue(db, line); }