示例#1
0
static int f(realtype t, N_Vector u, N_Vector udot, void *user_data)
{
  realtype *udata, *udotdata;
  UserData data;
  HYPRE_ParVector uhyp;
  HYPRE_ParVector udothyp;
  
  /* Extract hypre vectors */  
  uhyp  = N_VGetVector_ParHyp(u);
  udothyp  = N_VGetVector_ParHyp(udot);
  
  /* Access hypre vectors local data */
  udata = hypre_VectorData(hypre_ParVectorLocalVector(uhyp));
  udotdata = hypre_VectorData(hypre_ParVectorLocalVector(udothyp));

  data = (UserData) user_data;

  /* Call ucomm to do inter-processor communication */
  ucomm(t, u, data);

  /* Call fcalc to calculate all right-hand sides */
  fcalc(t, udata, udotdata, data);

  return(0);
}
示例#2
0
文件: test.c 项目: tomolt/fcalc
void test(const char *name, const char *str, double er, int ee)
{
	total++;
	int e;
	double r = fcalc(&str, &e, 0);
	double dr = r - er;
	if ((dr > 0.0 ? dr : -dr) > EPSILON || e != ee)
	{
		printf("Test '%s' failed; Expected %f/%d, got %f/%d\n", name, er, ee, r, e);
		fails++;
	}
}
static int f(realtype t, N_Vector u, N_Vector udot, void *f_data)
{
  realtype *udata, *dudata;
  UserData data;

  udata = NV_DATA_P(u);
  dudata = NV_DATA_P(udot);
  data = (UserData) f_data;

  /* Call ucomm to do inter-processor communication */
  ucomm(t, u, data);

  /* Call fcalc to calculate all right-hand sides */
  fcalc(t, udata, dudata, data);

  return(0);
}
示例#4
0
文件: fcalc.c 项目: tomolt/fcalc
/* fcalc - a basic, fully self-contained one-function calculator, *\
\* released into the public domain. written by Thomas Oltmann.    */
double fcalc(const char **str, int *err, int _)
{
	switch (_)
	{
		case 0: ; /* Parse full expression */
			const char *str1 = *str;
			int err1 = 0;
			double ret = fcalc(&str1, &err1, 1);
			while (*str1 != 0)
			{
				if (*str1 != ' ' && *str1 != '\n')
					err1 = 1;
				str1++;
			}
			if (err != 0) *err = err1;
			return ret;
		case -1: /* Parse primitive */
			while (**str == ' ') (*str)++; /* Skip whitespace */
			switch (**str)
			{
				case '-': /* Parse unary minus (negation) */
					(*str)++;
					return -fcalc(str, err, -1);
				case '(': /* Parse subexpression in parentheses */
					(*str)++;
					double ret = fcalc(str, err, 1);
					if (**str != ')')
					{
						*err = -1;
						return 0.0;
					}
					(*str)++;
					return ret;
				case '0': case '1': case '2': case '3': case '4': /* Parse number */
				case '5': case '6': case '7': case '8': case '9': case '.':
					_ = 0;
					double dig = 0.0, bak = 1.0;
					for (;;)
					{
						if (**str == '.')
						{
							_ = 1;
							(*str)++;
						}
						if (!(**str >= '0' && **str <= '9'))
							break;
						if (_ == 1) bak /= 10.0;
						dig = dig * 10.0 + (**str - '0');
						(*str)++;
					}
					return dig * bak;
				case 'p': case 'P': /* Parse 'pi' */
					(*str)++;
					if (**str != 'i' && **str != 'I')
					{
						*err = -1;
						return 0.0;
					}
					(*str)++;
					return 3.14159265358979;
				default:
					*err = -1;
					return 0.0;
			}
		default: ; /* Parse binary operation */
			double lhs = fcalc(str, err, -1);
			if (*err) return 0.0;
			for (;;)
			{
				while (**str == ' ') (*str)++;  /* Skip whitespace */
#define fcalc_BINOP(sym, prec, op) \
	if (prec >= _ && **str == sym) \
	{ \
		(*str)++; \
		double rhs = fcalc(str, err, (prec + 1)); \
		if (*err) return 0.0; \
		op; \
	}
				     fcalc_BINOP('+', 1, lhs = lhs + rhs)
				else fcalc_BINOP('-', 1, lhs = lhs - rhs)
				else fcalc_BINOP('*', 2, lhs = lhs * rhs)
				else fcalc_BINOP('/', 2, lhs = lhs / rhs)
				else return lhs;
#undef fcalc_BINOP
			}
	}
}