示例#1
0
void Scanner::AtOperation()        //运算符的判断
{
	bool match = false;
	if (!in.eof() && !isalnum(c) && c != '_'&&!isspace(c))
	{
		AddToBuffer(c);
		if (TryToIdentify())   //判断关系操作符   for example   <=此时为真
		{
			match = true;
			ExtractChar();
		}
		else
			ReduceBuffer();

	}
	if (!match && !TryToIdentify())
		throw "illegal expression";
}
示例#2
0
void IterateKeff()
{
  long ptr, mode, skip, ncyc, idx, fix;
  double nsf, fiss, capt, nuxn, leak, L0, L1, val, f, keff, val0;
  
  /* Check mode */

  if ((mode = (long)RDB[DATA_ITER_MODE]) == ITER_MODE_NONE)
    return;

  /* Get fix mode */

  fix = (long)RDB[DATA_ITER_FIX];

  /* Number of cycles and actual number of skip cycles (setoptimization.c) */

  ncyc = (long)RDB[DATA_ITER_NCYC];
  idx = (long)RDB[DATA_CYCLE_IDX];

  if (fix == YES)
    skip = (long)((RDB[DATA_CRIT_SKIP] - RDB[DATA_ITER_NCYC])/2.0);
  else
    skip = (long)(RDB[DATA_CRIT_SKIP] - RDB[DATA_ITER_NCYC]);

  /* Check cycles */

  if ((idx < skip) || ((fix == YES) && (idx > skip + ncyc)))
    return;

  /* Reduce scoring buffer */

  ReduceBuffer();

  /* Collect MPI parallel data */

  CollectBuf();

  /* Check mode */

  if (mode == ITER_MODE_ALBEDO)
    {
      /***********************************************************************/

      /***** Albedo iteration ************************************************/

      /* Get k-eff */

      keff = RDB[DATA_ITER_KEFF];
      CheckValue(FUNCTION_NAME, "keff", "", keff, 0.1, 2.5);

      /* Fission nubar */
      
      ptr = (long)RDB[RES_TOT_NSF];
      CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);
      nsf = BufVal(ptr, 0);
      
      /* Fission term */
      
      ptr = (long)RDB[RES_TOT_FISSRATE];
      CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);
      fiss = BufVal(ptr, 0);
      
      /* Total capture rate */
      
      ptr = (long)RDB[RES_TOT_CAPTRATE];
      CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);
      capt = BufVal(ptr, 0);
      
      /* Scattering production rate */
      
      ptr = (long)RDB[RES_TOT_INLPRODRATE];
      CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);
      nuxn = BufVal(ptr, 0);

      /* Physical leakage rate */

      ptr = (long)RDB[RES_TOT_NEUTRON_LEAKRATE];
      CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);
      leak = BufVal(ptr, 0);

      /* Get previous albedo leakage rate */
      
      ptr = (long)RDB[RES_ALB_NEUTRON_LEAKRATE];
      CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);
      L0 = BufVal(ptr, 0);
     
      /* Calculate estimate for new albedo leakage rate */
      
      L1 = nsf/keff - capt - fiss - leak + nuxn;

      /* Avoid compiler warning */

      val = -1.0;

      /* Get previous value */

      if ((val0 = RDB[DATA_ITER_VAL]) < 0.0)
	{
	  /* Not set, use initial guess */

	  ptr = (long)RDB[RES_ANA_KEFF];
	  CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);

	  if (Mean(ptr, 0) > 1.0)
	    val = 0.999;
	  else
	    val = 1.001;
	}
      else if (L0 != 0.0)
	{
	  /* Calculate new */

	  val = (val0 - 1.0)*L1/L0 + 1.0;

	  /* Add to statistics */

	  ptr = (long)RDB[RES_ITER_VAL];
	  CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);
	  AddStat(val, ptr, 0);
	  
	  /* Fix value for last iteration */
	  
	  if ((fix == YES) && (idx > skip + ncyc))
	    val = Mean(ptr, 0);
	}    
      else
	Die(FUNCTION_NAME, "L0 == 0");

      /* Put value */

      WDB[DATA_ITER_VAL] = val;

      /* Put albedos */

      if ((f = RDB[DATA_ITER_ALB_F1]) > 0.0)
	WDB[DATA_GEOM_ALBEDO1] = val*f;

      if ((f = RDB[DATA_ITER_ALB_F2]) > 0.0)
	WDB[DATA_GEOM_ALBEDO2] = val*f;
      
      if ((f = RDB[DATA_ITER_ALB_F3]) > 0.0)
	WDB[DATA_GEOM_ALBEDO3] = val*f;
      
      /***********************************************************************/
    }
  else
    Die(FUNCTION_NAME, "Invalid iteration mode");
}
void ApplyGCSymmetries(long gcu)
{
  long ng, adf, ptr, surf, type, ns, nc, nmax, n, m, i, sym, mode;
  double *f, *f0, val, max;

  /* Check pointer to group constant universe */

  CheckPointer(FUNCTION_NAME, "(gcu)", DATA_ARRAY, gcu);

  /***************************************************************************/

  /***** Fluxes and currents in ADF's ****************************************/

  /* Reset maximum difference */

  max = 0.0;

  /* Get pointer to ADF structure and symmetry */
  
  if ((adf = (long)RDB[gcu + GCU_PTR_ADF]) > VALID_PTR)
    if ((sym = (long)RDB[adf + ADF_SYM]) > 0)
      {
	/* Get pointer to outer boundary surface */
	
	surf = (long)RDB[adf + ADF_PTR_SURF];
	CheckPointer(FUNCTION_NAME, "(surf)", DATA_ARRAY, surf);
	
	/* Get surface type */
	
	type = (long)RDB[surf + SURFACE_TYPE];
	
	/* Get number of surfaces and corners */
	
	ns = (long)RDB[adf + ADF_NSURF];
	CheckValue(FUNCTION_NAME, "ns", "", ns, 1, 6);
	
	nc = (long)RDB[adf + ADF_NCORN];
	CheckValue(FUNCTION_NAME, "nc", "", nc, 0, 6);
	
	/* Get number of energy groups */
	
	ng = (long)RDB[DATA_ERG_FG_NG];
	CheckValue(FUNCTION_NAME, "ng", "", ng, 1, 100000);
	
	/* Allocate memory for temporary arrays  */
	
	if (ns > nc)
	  {
	    f0 = (double *)Mem(MEM_ALLOC, ns, sizeof(double));
	    f = (double *)Mem(MEM_ALLOC, ns, sizeof(double));
	  }
	else
	  {
	    f0 = (double *)Mem(MEM_ALLOC, nc, sizeof(double));
	    f = (double *)Mem(MEM_ALLOC, nc, sizeof(double));
	  }

	/* Loop over parameters */
	
	for (i = 0; i < 11; i++)
	  {
	    /* Avoid compiler warning */
	    
	    ptr = -1;
	    nmax = 0;
	    mode = 0;
	    
	    /* Get pointer and set number of values */
	    
	    if (i == 0)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_HET_SURF_FLUX];
		nmax = ns;
		mode = 1;
	      }
	    else if (i == 1)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_HET_CORN_FLUX];
		nmax = nc;
		mode = 2;
	      }
	    else if (i == 2)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_SURF_IN_CURR];
		nmax = ns;
		mode = 1;
	      }
	    else if (i == 3)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_SURF_OUT_CURR];
		nmax = ns;
		mode = 1;
	      }
	    else if (i == 4)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_SURF_NET_CURR];
		nmax = ns;
		mode = 1;
	      }
	    else if (i == 5)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_MID_IN_CURR];
		nmax = ns;
		mode = 1;
	      }
	    else if (i == 6)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_MID_OUT_CURR];
		nmax = ns;
		mode = 1;
	      }
	    else if (i == 7)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_MID_NET_CURR];
		nmax = ns;
		mode = 1;
	      }
	    else if (i == 8)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_CORN_IN_CURR];
		nmax = nc;
		mode = 2;
	      }
	    else if (i == 9)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_CORN_OUT_CURR];
		nmax = nc;
		mode = 2;
	      }
	    else if (i == 10)
	      {
		ptr = RDB[gcu + GCU_RES_FG_DF_CORN_NET_CURR];
		nmax = nc;
		mode = 2;
	      }
	    else
	      Die(FUNCTION_NAME, "Overflow");
	    
	    /* Check pointer */
	    
	    if (ptr < VALID_PTR)
	      continue;
	    
	    /* Loop over energy groups */
	    
	    for (n = 0; n < ng; n++)
	      {
		/* Read data */
		
		for (m = 0; m < nmax; m++)
		  f0[m] = BufVal(ptr, m, n);
		
		/* Check geometry type */
		
		switch (type)
		  {
		  case SURF_SQC:
		  case SURF_RECT:
		    {
		      /* Infinite square prism (2D case) */
		      
		      if (sym == 1)
			{
			  /* Full symmetry */
			  
			  if (type == SURF_SQC)
			    {
			      /* Average over all values if sqc */

			      val = (f0[0] + f0[1] + f0[2] + f0[3])/4.0;
			      f[0] = val - f0[0];
			      f[1] = val - f0[1];
			      f[2] = val - f0[2];
			      f[3] = val - f0[3];
			    }
			  else
			    {
			      /* Average over NS and EW and all corners */
			      /* if rect */

			      if (mode == 1)
				{
				  val = (f0[S] + f0[N])/2.0;
				  f[S] = val - f0[S];
				  f[N] = val - f0[N];
				  val = (f0[W] + f0[E])/2.0;
				  f[W] = val - f0[W];
				  f[E] = val - f0[E];
				}
			      else
				{
				  val = (f0[0] + f0[1] + f0[2] + f0[3])/4.0;
				  f[0] = val - f0[0];
				  f[1] = val - f0[1];
				  f[2] = val - f0[2];
				  f[3] = val - f0[3];
				}
			    }
			}
		      else if (sym == 2)
			{
			  /* S1 / NS symmetry */
			  
			  if (mode == 1)
			    {
			      val = (f0[S] + f0[N])/2.0;
			      f[W] = 0.0;
			      f[S] = val - f0[S];
			      f[E] = 0.0;
			      f[N] = val - f0[N];
			    }
			  else
			    {
			      val = (f0[NW] + f0[SW])/2.0;
			      f[NW] = val - f0[NW];
			      f[SW] = val - f0[SW];
			      val = (f0[NE] + f0[SE])/2.0;
			      f[NE] = val - f0[NE];
			      f[SE] = val - f0[SE];
			    }
			}
		      else if (sym == 3)
			{
			  /* C1 / SENW symmetry */
			  
			  if (mode == 1)
			    {
			      val = (f0[W] + f0[S])/2.0;
			      f[W] = val - f0[W];
			      f[S] = val - f0[S];
			      val = (f0[E] + f0[N])/2.0;
			      f[E] = val - f0[E];
			      f[N] = val - f0[N];
			    }
			  else
			    {
			      val = (f0[SE] + f0[NW])/2.0;
			      f[SW] = 0.0;
			      f[SE] = val - f0[SE];
			      f[NW] = val - f0[NW];
			      f[NE] = 0.0;
			    }
			}
		      else if (sym == 4)
			{
			  /* S2 / EW symmetry */
			  
			  if (mode == 1)
			    {
			      val = (f0[W] + f0[E])/2.0;
			      f[W] = val - f0[W];
			      f[S] = 0.0;
			      f[E] = val - f0[E];
			      f[N] = 0.0;
			    }
			  else
			    {
			      val = (f0[SW] + f0[SE])/2.0;
			      f[SW] = val - f0[SW];
			      f[SE] = val - f0[SE];
			      val = (f0[NW] + f0[NE])/2.0;
			      f[NW] = val - f0[NW];
			      f[NE] = val - f0[NE];
			    }
			}
		      else if (sym == 5)
			{
			  /* C2 / SWNE symmetry */
			  
			  if (mode == 1)
			    {
			      val = (f0[W] + f0[N])/2.0;
			      f[W] = val - f0[W];
			      f[N] = val - f0[N];
			      val = (f0[E] + f0[S])/2.0;
			      f[E] = val - f0[E];
			      f[S] = val - f0[S];
			    }
			  else
			    {
			      val = (f0[SW] + f0[NE])/2.0;
			      f[SW] = val - f0[SW];
			      f[SE] = 0.0;
			      f[NW] = 0.0;
			      f[NE] = val - f0[NE];
			    }
			}
		      else if (sym != 0)
			Die(FUNCTION_NAME, "Invalid symmetry");
		      
		      /* Break case */
		      
		      break;
		    }
		  case SURF_HEXYC:
		  case SURF_HEXXC:
		    {
		      /* Infinite hexagonal prism (2D case) */
		      
		      if (sym == 1)
			{
			  /* Full symmetry */
			  
			  val = (f0[0] + f0[1] + f0[2] + 
				 f0[3] + f0[4] + f0[5])/6.0;
			  f[0] = val - f0[0];
			  f[1] = val - f0[1];
			  f[2] = val - f0[2];
			  f[3] = val - f0[3];
			  f[4] = val - f0[4];
			  f[5] = val - f0[5];
			}
		      else if (sym == 2)
			{
			  /* S1-symmetry */
			  
			  if (mode == 1)
			    {
			      f[0] = 0.0;
			      f[3] = 0.0;
			      val = (f0[1] + f0[5])/2.0;
			      f[1] = val - f0[1];
			      f[5] = val - f0[5];
			      val = (f0[2] + f0[4])/2.0;
			      f[2] = val - f0[2];
			      f[4] = val - f0[4];
			    }
			  else
			    {
			      val = (f0[0] + f0[5])/2.0;
			      f[0] = val - f0[0];
			      f[5] = val - f0[5];
			      val = (f0[1] + f0[4])/2.0;
			      f[1] = val - f0[1];
			      f[4] = val - f0[4];
			      val = (f0[2] + f0[3])/2.0;
			      f[2] = val - f0[2];
			      f[3] = val - f0[3];
			    }
			}
		      else if (sym == 3)
			{
			  /* C1-symmetry */
			  
			  if (mode == 1)
			    {
			      val = (f0[0] + f0[1])/2.0;
			      f[0] = val - f0[0];
			      f[1] = val - f0[1];
			      val = (f0[2] + f0[5])/2.0;
			      f[2] = val - f0[2];
			      f[5] = val - f0[5];
			      val = (f0[3] + f0[4])/2.0;
			      f[3] = val - f0[3];
			      f[4] = val - f0[4];
			    }
			  else
			    {
			      f[0] = 0.0;
			      f[3] = 0.0;
			      val = (f0[1] + f0[5])/2.0;
			      f[1] = val - f0[1];
			      f[5] = val - f0[5];
			      val = (f0[2] + f0[4])/2.0;
			      f[2] = val - f0[2];
			      f[4] = val - f0[4];
			    }
			}
		      else if (sym == 4)
			{
			  /* S2-symmetry */
			  
			  if (mode == 1)
			    {
			      f[1] = 0.0;
			      f[4] = 0.0;
			      val = (f0[0] + f0[2])/2.0;
			      f[0] = val - f0[0];
			      f[2] = val - f0[2];
			      val = (f0[3] + f0[5])/2.0;
			      f[3] = val - f0[3];
			      f[5] = val - f0[5];
			    }
			  else
			    {
			      val = (f0[0] + f0[1])/2.0;
			      f[0] = val - f0[0];
			      f[1] = val - f0[1];
			      val = (f0[2] + f0[5])/2.0;
			      f[2] = val - f0[2];
			      f[5] = val - f0[5];
			      val = (f0[3] + f0[4])/2.0;
			      f[3] = val - f0[3];
			      f[4] = val - f0[4];
			    }
			}
		      else if (sym == 5)
			{
			  /* C2-symmetry */
			  
			  if (mode == 1)
			    {
			      val = (f0[0] + f0[3])/2.0;
			      f[0] = val - f0[0];
			      f[3] = val - f0[3];
			      val = (f0[1] + f0[2])/2.0;
			      f[1] = val - f0[1];
			      f[2] = val - f0[2];
			      val = (f0[4] + f0[5])/2.0;
			      f[4] = val - f0[4];
			      f[5] = val - f0[5];
			    }
			  else
			    {
			      f[1] = 0.0;
			      f[4] = 0.0;
			      val = (f0[0] + f0[2])/2.0;
			      f[0] = val - f0[0];
			      f[2] = val - f0[2];
			      val = (f0[3] + f0[5])/2.0;
			      f[3] = val - f0[3];
			      f[5] = val - f0[5];
			    }
			}
		      else if (sym == 6)
			{
			  /* S3-symmetry */
			  
			  if (mode == 1)
			    {
			      f[2] = 0.0;
			      f[5] = 0.0;
			      val = (f0[1] + f0[3])/2.0;
			      f[1] = val - f0[1];
			      f[3] = val - f0[3];
			      val = (f0[0] + f0[4])/2.0;
			      f[0] = val - f0[0];
			      f[4] = val - f0[4];
			    }
			  else
			    {
			      val = (f0[0] + f0[3])/2.0;
			      f[0] = val - f0[0];
			      f[3] = val - f0[3];
			      val = (f0[1] + f0[2])/2.0;
			      f[1] = val - f0[1];
			      f[2] = val - f0[2];
			      val = (f0[4] + f0[5])/2.0;
			      f[4] = val - f0[4];
			      f[5] = val - f0[5];
			    }
			}
		      else if (sym == 7)
			{
			  /* C3-symmetry */
			  
			  if (mode == 1)
			    {
			      val = (f0[0] + f0[5])/2.0;
			      f[0] = val - f0[0];
			      f[5] = val - f0[5];
			      val = (f0[1] + f0[4])/2.0;
			      f[1] = val - f0[1];
			      f[4] = val - f0[4];
			      val = (f0[2] + f0[3])/2.0;
			      f[2] = val - f0[2];
			      f[3] = val - f0[3];
			    }
			  else
			    {
			      f[2] = 0.0;
			      f[5] = 0.0;
			      val = (f0[1] + f0[3])/2.0;
			      f[1] = val - f0[1];
			      f[3] = val - f0[3];
			      val = (f0[0] + f0[4])/2.0;
			      f[0] = val - f0[0];
			      f[4] = val - f0[4];
			    }
			}
		      else if (sym != 0)
			Die(FUNCTION_NAME, "Invalid symmetry");

		      /* Break case */
		      
		      break;
		    }
		  }

		/* Mark scoring buffer unreduced */

		WDB[DATA_BUF_REDUCED] = (double)NO;

		/* Get maximum difference for error checking */
		/* (surface flux and currents) */

		if ((i == 0) || (i == 2) || (i == 3))
		  for (m = 0; m < nmax; m++)
		    if (fabs(f[m]/f0[m]) > max)
		      max = fabs(f[m]/f0[m]);
		
		/* Put data */
		
		for (m = 0; m < nmax; m++)
		  AddBuf(f[m], 1.0, ptr, 0, -1, m, n);
		
		/* Reduce buffer */
		
		ReduceBuffer();
	      }
	  }
	
	/* Free temporary arrays */
  
	Mem(MEM_FREE, f0);
	Mem(MEM_FREE, f);
      }
  
  /* Print warning if statistics is good enough */
  
  if ((long)(RDB[DATA_MICRO_CALC_BATCH_SIZE]*RDB[DATA_CYCLE_BATCH_SIZE]) >
      1000*20)      
    if (max > 0.1)
      Note(0, "ADF symmetry option may be wrong");
  
  /***************************************************************************/
}