示例#1
0
void DUAL_ELLIPTIC_SOLVER::get_dual_D(
	int *dual_ic,
	double *D_nb)
{
	int l,i,ii,jj,index;
	int icl[MAXD],icu[MAXD],ic[MAXD];
	double denom;
	COMPONENT comp;

	for (i = 0; i < dim; ++i)
	{
	    icl[i] = dual_ic[i] + offset[i] - 1;
	    icu[i] = dual_ic[i] + offset[i];
	}
	switch (dim)
	{
	case 2:
	    for (l = 0; l < 4; ++l)
	    {
		i = l/2;
		ic[i] = (l%2 == 0) ? icl[i] : icu[i];
		D_nb[l] = denom = 0.0;
		for (ii = icl[(i+1)%dim]; ii <= icu[(i+1)%dim]; ++ii)
		{
		    ic[(i+1)%dim] = ii;
		    index = d_index(ic,top_gmax,dim);
		    if (ij_to_I[ic[0]][ic[1]] != -1)
		    {
			D_nb[l] += D[index];
			denom += 1.0;
		    }
		}
		if (denom != 0.0)
		    D_nb[l] /= denom;
	    }
	    break;
	case 3:
	    for (l = 0; l < 6; ++l)
	    {
		i = l/2;
		ic[i] = (l%2 == 0) ? icl[i] : icu[i];
		D_nb[l] = denom = 0.0;
		for (ii = icl[(i+1)%dim]; ii <= icu[(i+1)%dim]; ++ii)
		for (jj = icl[(i+2)%dim]; jj <= icu[(i+2)%dim]; ++jj)
		{
		    ic[(i+1)%dim] = ii;
		    ic[(i+2)%dim] = jj;
		    index = d_index(ic,top_gmax,dim);
		    if (ijk_to_I[ic[0]][ic[1]][ic[2]] != -1)
		    {
			D_nb[l] += D[index];
			denom += 1.0;
		    }
		}
		if (denom != 0.0)
		    D_nb[l] /= denom;
	    }
	    break;
	}
}	/* end get_dual_D */
示例#2
0
SideIterator&
SideIterator::operator ++ ()
{
   ++d_index(0);
   for (tbox::Dimension::dir_t i = 0; i < d_box.getDim().getValue() - 1; ++i) {
      if (d_index(i) > d_box.upper(i)) {
         d_index(i) = d_box.lower(i);
         ++d_index(i + 1);
      } else {
         break;
      }
   }
   return *this;
}
示例#3
0
ArrayDataIterator&
ArrayDataIterator::operator ++ ()
{
   const tbox::Dimension& dim(d_box.getDim());
   ++d_index(0);
   for (tbox::Dimension::dir_t i = 0; i < dim.getValue() - 1; ++i) {
      if (d_index(i) > d_box.upper(i)) {
         d_index(i) = d_box.lower(i);
         ++d_index(i + 1);
      } else {
         break;
      }
   }
   return *this;
}
示例#4
0
ArrayDataIterator::ArrayDataIterator(
   const hier::Box& box,
   bool begin):
   d_index(box.lower()),
   d_box(box)
{
   if (!d_box.empty() && !begin) {
      d_index(d_box.getDim().getValue() - 1) =
         d_box.upper(static_cast<tbox::Dimension::dir_t>(d_box.getDim().getValue() - 1)) + 1;
   }
}
示例#5
0
NodeIterator::NodeIterator(
   const hier::Box& box,
   bool begin):
   d_index(box.lower(), hier::IntVector::getZero(box.getDim())),
   d_box(NodeGeometry::toNodeBox(box))
{
   if (!d_box.empty() && !begin) {
      d_index(d_box.getDim().getValue() - 1) =
         d_box.upper(static_cast<tbox::Dimension::dir_t>(d_box.getDim().getValue() - 1)) + 1;
   }
}
示例#6
0
SideIterator::SideIterator(
   const hier::Box& box,
   const tbox::Dimension::dir_t axis,
   bool begin):
   d_index(box.lower(), axis, SideIndex::Lower),
   d_box(SideGeometry::toSideBox(box, axis))
{
   if (!d_box.empty() && !begin) {
      d_index(d_box.getDim().getValue() - 1) =
         d_box.upper(static_cast<tbox::Dimension::dir_t>(d_box.getDim().getValue() - 1)) + 1;
   }
}
示例#7
0
double DUAL_ELLIPTIC_SOLVER::checkSolver(
	int *icoords,
	boolean print_details)
{
	int i,l,m;
	int comp;
	double w[2];
	int id0,index_nb;
	double dw[2],coefs[2],lhs,rhs;
	GRID_DIRECTION dir[3][2] = {{WEST,EAST},{SOUTH,NORTH},{LOWER,UPPER}};
	HYPER_SURF *hs;
        double crx_coords[MAXD];
        int status;
        POINTER intfc_state;
	int icnb[MAXD];
	double denom = 0.0;
	double D_nb[6];

	if (print_details)
	{
	    (void) printf("\nEntering checkSolver()\n");
	    (void) printf("icoords = ");
	    for (i = 0; i < dim; ++i)
	    	(void) printf("%d ",icoords[i]);
	    (void) printf("\n");
	}

	id0 = d_index(icoords,ctop_gmax,dim);
	comp = ctop_comp[id0];
	lhs = 0;
	get_dual_D(icoords,D_nb);
	for (l = 0; l < dim; ++l)
	{
	    if (print_details)
	    	(void) printf("Direction %d:\n",l);
	    for (i = 0; i < dim; ++i)
		icnb[i] = icoords[i];
	    for (m = 0; m < 2; ++m)
	    {
		status = (*findStateAtCrossing)(front,icoords,dir[l][m],comp,
                                &intfc_state,&hs,crx_coords);
		icnb[l] = (m == 0) ? icoords[l] - 1 : icoords[l] + 1;
		index_nb = d_index(icnb,ctop_gmax,dim);
		coefs[m] = D_nb[l*2+m];

		switch(status)
		{
		case NO_PDE_BOUNDARY:
	    	    if (print_details)
		    	(void) printf("Side %d NO_PDE_BOUNDARY\n",m);
		    w[0] = soln[id0];
		    w[1] = soln[index_nb];
		    break;
		case CONST_V_PDE_BOUNDARY:
	    	    if (print_details)
		    	(void) printf("Side %d CONST_V_PDE_BOUNDARY\n",m);
		    w[0] = soln[id0];
		    w[1] = soln[id0];
		    break;
		case CONST_P_PDE_BOUNDARY:
	    	    if (print_details)
		    	(void) printf("Side %d CONST_P_PDE_BOUNDARY\n",m);
		    w[0] = soln[id0];
		    w[1] = getStateVar(intfc_state);
		    break;
		default:
		    (void) printf("Side %d Unknown BOUNDARY\n",m);
		    clean_up(ERROR);
		}
		dw[m] = (w[1] - w[0])/top_h[l];
		if (denom < fabs(coefs[m]*dw[m]/2.0/top_h[l]))
		    denom = fabs(coefs[m]*dw[m]/2.0/top_h[l]);
	    }
	    if (print_details)
	    {
	    	(void) printf("Coefs: %f %f\n",coefs[0],coefs[1]);
	    	(void) printf("C*dw: %f %f\n",coefs[0]*dw[0],coefs[1]*dw[1]);
	    }
	    lhs += (coefs[1]*dw[1] + coefs[0]*dw[0])/top_h[l];
	}
	rhs = source[id0];
	if (print_details)
	{
	    (void) printf("Solution = %20.14f\n",soln[id0]);
	    (void) printf("LHS = %20.14f  RHS = %20.14f\n",lhs,rhs);
	    (void) printf("LHS - RHS = %20.14f\n",lhs-rhs);
	    (void) printf("Relative error = %20.14g\n",fabs(lhs-rhs)/denom);
	    (void) printf("Leaving checkSolver()\n\n");
	}
	return fabs(lhs-rhs)/denom;
}	/* end checkSolver */