Beispiel #1
0
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);
    }
  }

}
Beispiel #2
0
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);

}
Beispiel #3
0
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;
}
Beispiel #4
0
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;

}
Beispiel #5
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);
    }
  }

}
Beispiel #6
0
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);
    }
  }

}
Beispiel #7
0
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);
  }

}
Beispiel #8
0
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);
}