Example #1
0
int DEC_FIXP_LDPC_BIN::Activate(DECODING *ptDec)
{
    int ErrorFlag = IN_ERROR;

    // ---------------------------------------
    // Get the module configuration parameters
    // ---------------------------------------
    GetParam(ptDec);

    // --------------------
    // Allocation of memory
    // --------------------
    if ( Mem() == IN_ERROR ) goto end;

    // ----------------------
    // Initialization actions
    // ----------------------
    if ( Init() == IN_ERROR ) goto end;

    // --------------------
    // sucessful activation
    // --------------------
    ErrorFlag = NO_ERROR;
end:

    return ErrorFlag;
}
void TWebNetClt::OnNetMem(const PNetObj& NetObj){
  TNetMem& NetMem=*(TNetMem*)NetObj();
  const TMem& Mem=NetMem.GetMem();
  IAssert("Screwed NetMem"&&!memchr(Mem(),0,Mem.Len()));
  PSIn MemIn=TMemIn::New(Mem);
  PHttpResp HttpResp=THttpResp::New(MemIn);
  OnHttpResp(HttpResp);
}
Example #3
0
t_stat WritePB(t_addr a, uint32 val)
{
    uint8* mem;
    
    t_stat rc = Mem(a&addrmask,&mem);
    switch (rc) {
    default:
        return rc;
    case SCPE_OK:
        *mem = val & BMASK;
        /*fallthru*/
    case SIM_NOMEM:
        return SCPE_OK;
    }
}
Example #4
0
/* memory access routines 
 * The Motorola CPU is big endian, whereas others like the i386 is
 * little endian. The memory uses the natural order of the emulating CPU.
 *
 * addressing uses all bits but LSB to access the memory cell
 * 
 * Memorybits 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
 *            ------68K Byte0-(MSB)-- ---68K Byte1-----------
 *            ------68K Byte2-------- ---68K Byte3-(LSB)-----
 */
t_stat ReadPB(t_addr a, uint32* val)
{
    uint8* mem;

    t_stat rc = Mem(a & addrmask,&mem);
    switch (rc) {
    default:
        return rc;
    case SIM_NOMEM:
        *val = 0xff;
        return SCPE_OK;
    case SCPE_OK:
        *val = *mem & BMASK;
        return SCPE_OK;
    }
}
Example #5
0
t_stat WritePW(t_addr a, uint32 val)
{
    uint8* mem;
    t_stat rc = Mem((a+1)&addrmask,&mem);
    switch (rc) {
    default:
        return rc;
    case SCPE_OK:
        /* 68000/08/10 do not like unaligned access */
        if (cputype < 3 && (a & 1)) return STOP_ERRADR;
        *(mem-1) = (val >> 8) & BMASK;
        *mem     =  val       & BMASK;
        /*fallthru*/
    case SIM_NOMEM:
        return SCPE_OK;
    }
}
Example #6
0
t_stat ReadPW(t_addr a, uint32* val)
{
    uint8* mem;
    uint32 dat1,dat2;

    t_stat rc = Mem((a+1)&addrmask,&mem);
    switch (rc) {
    default:
        return rc;
    case SIM_NOMEM:
        *val = 0xffff;
        return SCPE_OK;
    case SCPE_OK:
        /* 68000/08/10 do not like unaligned access */
        if (cputype < 3 && (a & 1)) return STOP_ERRADR;
        dat1 = (*(mem-1) & BMASK) << 8;
        dat2 = *mem & BMASK;
        *val = (dat1 | dat2) & WMASK;
        return SCPE_OK;
    }
}
Example #7
0
///////////////////////////////////////////////////////////////////////////////////////////////////
//应用程序向设备写数据时的操作
NTSTATUS KadyUsbTestDevice::Write(KIrp I)
{
    NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;

	//声明变量,存放实际发送的字节数
    ULONG dwBytesSent = 0;
	
	//URB
	PURB pUrb = NULL;
	
	//获取应用程序内存对象
	KMemory Mem(I.Mdl());
	
	//检查缓冲区长度
	ULONG dwTotalSize = I.WriteSize(CURRENT);				//应用程序要写的数据长度
	ULONG dwMaxSize = EndPoint2Out.MaximumTransferSize();	//端点允许传输的最大数据长度
	if ( dwTotalSize > dwMaxSize )
	{
		//如果超过允许的最大数据长度,则传输最大允许数据长度个字节数
		ASSERT(dwMaxSize);
		dwTotalSize = dwMaxSize;
	}
	
	if(UsbdPipeTypeBulk == EndPoint2Out.Type())
	{
		pUrb = EndPoint2Out.BuildBulkTransfer(
			Mem,          //数据缓冲区
			dwTotalSize,  //需要传输的字节数
			FALSE,        //写数据
			NULL          //下一个URB(无)
							);
	}
	else if(UsbdPipeTypeInterrupt == EndPoint2Out.Type())
	{
		//创建URB
		pUrb = EndPoint2Out.BuildInterruptTransfer(
			Mem,		  //数据缓冲区
			dwTotalSize,  //需要传输的字节数
			TRUE,         //允许实际传输的字节数小于需要传输的字节数
			NULL,	      //下一个URB(无)
			NULL,		  //当前URB(无,创建新的)
			FALSE		  //写数据
													);
	}
	
    //判断URB创建是否成功
    if (pUrb != NULL) 
    {
		//提交URB
        status = EndPoint2Out.SubmitUrb(pUrb, NULL, NULL,1000);
		
		//获取实际写入的字节数
        if ( NT_SUCCESS(status) ) 
        {
            dwBytesSent = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;
        }
		
		delete pUrb;
    }
	
	//向应用程序返回实际写入的字节数
    I.Information() = dwBytesSent;

	//完成IRP
    return I.PnpComplete(this, status, IO_NO_INCREMENT);
}
void ReadMaterialComp()
{
  char *input, fname[MAX_STR], word[MAX_STR], pname[MAX_STR], **params;
  long loc0, loc1, mat, mat0, iso, iso0, nuc, i0, i, np, j, n, line, r, g, b;
  double val, sum;
  FILE *fp;

  /* Get pointer to file list */

  if ((loc0 = (long)RDB[DATA_PTR_COMP_FILE]) < VALID_PTR)
    return;

  fprintf(out, "Overriding initial material compositions...\n");

  /* Reset previous pointer */

  mat0 = -1;

  /* Reset counters for line number calculation */

  WDB[DATA_LINE_NUM_N0] = 0.0;
  WDB[DATA_LINE_NUM_NL0] = 1.0;

  /* Loop over list */

  while (RDB[loc0] > VALID_PTR)
    {
      /* Get file name */

      sprintf(fname, "%s", GetText(loc0));

      /* Check that file exists */

      if ((fp = fopen(fname, "r")) != NULL)
	fclose(fp);
      else
	{
	  /* File not found */
	  
	  Error(0, "Material composition file \"%s\" does not exist", fname);
	}

      /* Read input file */
  
      input = ReadTextFile(fname);

      /* Avoid compiler warning */
      
      params = NULL;

      /* Loop over file */
      
      i0 = 0;
      while ((i = NextWord(&input[i0], word)) > 0)
	{
	  /* update pointer */
	  
	  i0 = i0 + i;

	  /* Get line number for error messages */
	  
	  line = GetLineNumber(input, i0);

	  /* Look for material definition */

	  if (!strcasecmp(word, "mat"))
	    {
	      /* Copy parameter name */

	      strcpy (pname, word);

	      /* Read parameters */

	      params = GetParams(word, input, &np, &i0, 4, 4*MAX_ISOTOPES + 8, 
				 fname);

	      /* Read data */

	      j = 0;

	      /* Find material (try starting from previous) */

	      mat = mat0;
	      while (mat > VALID_PTR)
		{
		  /* Compare */

		  if (!strcmp(params[j], GetText(mat + MATERIAL_PTR_NAME)))
		    break;

		  /* Next */

		  mat = NextItem(mat);
		}

	      /* Find material (start from beginning) */

	      if (mat < VALID_PTR)
		{
		  mat = (long)RDB[DATA_PTR_M0];
		  while (mat > VALID_PTR)
		    {
		      /* Compare */
		      
		      if (!strcmp(params[j], GetText(mat + MATERIAL_PTR_NAME)))
			break;
		      
		      /* Next */
		      
		      mat = NextItem(mat);
		    }
		}

	      /* Check */

	      if (mat < VALID_PTR)
		Error(-1, pname, fname, line, "Material %s is not defined",
		      params[j]);
	      else
		j++;

	      /* Remember previous */

	      mat0 = NextItem(mat);
	      
	      /* Material density */

	      if (!strcmp(params[j], "sum"))
		{
		  /* Set value to -inf to calculate sum from composition */
		  
		  WDB[mat + MATERIAL_ADENS] = -INFTY;
		  
		  j++;
		}
	      else
		{
		  /* Read value */
		  
		  WDB[mat + MATERIAL_ADENS] = 
		    TestParam(pname, fname, line, params[j++], PTYPE_REAL,
			      -1000.0, 1000.0);
		}

	      /* Reset sum */

	      sum = 0.0;

	      /* Reset previous pointer */

	      iso0 = -1;

	      /* Loop over parameters */
	  
	      while (j < np)
		{
		  /* Check parameter */
		  
		  if (!strcmp(params[j], "tmp"))
		    {
		      /***** Temperature for Doppler-breadening **************/
		  
		      j++;
		      
		      /* Get temperature */
		      
		      WDB[mat + MATERIAL_DOPPLER_TEMP] = 
			TestParam(pname, fname, line, params[j++], 
				  PTYPE_REAL, 0.0, 100000.0);

		      /* Set option */
		      
		      WDB[DATA_USE_DOPPLER_PREPROCESSOR] = (double)YES;
		      
		      /*******************************************************/
		    }
		  if (!strcmp(params[j], "tms") || !strcmp(params[j], "ettm"))
		    {
		      /***** Temperature for TMS *****************************/
		  
		      j++;
		      
		      /* Get temperature */
		      
		      WDB[mat + MATERIAL_TMS_TMIN] = 
			TestParam(pname, fname, line, params[j++], 
				  PTYPE_REAL, 0.0, 100000.0);
		      
		      /* Copy to maximum */
		      
		      WDB[mat + MATERIAL_TMS_TMAX] = 
			RDB[mat + MATERIAL_TMS_TMIN];
		      
		      /* Set mode */
		      
		      WDB[DATA_TMS_MODE] = (double)TMS_MODE_CE;
		      WDB[mat + MATERIAL_TMS_MODE] = (double)YES;
		      
		      /*******************************************************/
		    }
		  else if (!strcmp(params[j], "rgb"))
		    {
		      /***** Material colour *********************************/

		      j++;
		      
		      /* Get r, b and g */
		      
		      r = TestParam(pname, fname, line, params[j++], 
				    PTYPE_INT, 0, 255);
		      
		      g = TestParam(pname, fname, line, params[j++], 
				    PTYPE_INT, 0, 255);

		      b = TestParam(pname, fname, line, params[j++], 
				    PTYPE_INT, 0, 255);

		      /* Set color */
		      
		      WDB[mat + MATERIAL_RGB] = b + 1000.0*g + 1000000.0*r;
		      
		      /*******************************************************/
		    }
		  else if (!strcmp(params[j], "vol"))
		    {
		      /***** Material volume *********************************/
		      
		      j++;
		      
		      /* Get volume */
		      
		      WDB[mat + MATERIAL_VOLUME_GIVEN] =
			TestParam(pname, fname, line, params[j++], PTYPE_REAL, 
				  0.0, INFTY);
		      
		      /*******************************************************/
		    }
		  else if (!strcmp(params[j], "fix"))
		    {
		      /***** Default library ID and temperature***************/

		      j++;
		  
		      /* Get default ID and temperature */
		      
		      WDB[mat + MATERIAL_DEFAULT_PTR_LIB_ID] = 
			PutText(params[j++]);
		      WDB[mat + MATERIAL_DEFAULT_TMP] = 
			TestParam(pname, fname, line, params[j++], PTYPE_REAL, 
				  0.0, INFTY);
		      
		      /*******************************************************/
		    }
		  else if (!strcmp(params[j], "mass"))
		    {
		      /***** Material mass ***********************************/

		      j++;
		      
		      /* Get mass */
		      
		      WDB[mat + MATERIAL_MASS_GIVEN] = 
			TestParam(pname, fname, line, params[j++], PTYPE_REAL, 
				  0.0, INFTY);

		      /*******************************************************/
		    }
		  else if (!strcmp(params[j], "burn"))
		    {
		      /***** Burnable material *******************************/
		      
		      j++;
		      
		      /* Set burn flag */
		      
		      SetOption(mat + MATERIAL_OPTIONS, OPT_BURN_MAT);
		      
		      /* Set burn sort flag and materials flag */
		      
		      WDB[mat + MATERIAL_BURN_SORT_FLAG] = 1.0;
		      WDB[DATA_BURN_MATERIALS_FLAG] = (double)YES;
		      
		      /* Get number of rings */
		      
		      WDB[mat + MATERIAL_BURN_RINGS] = 
			(double)TestParam(pname, fname, line, params[j++], 
					  PTYPE_INT, 0, 10000000);
		  
		      /*******************************************************/
		    }
		  else if (!strcmp(params[j], "moder"))
		    {
		      /***** Thermal scattering data *************************/

		      j++;
		      
		      /* Check number of parameters */
		      
		      if (j > np - 3)
			Error(mat, "Invalid number of parameters");
		      
		      /* Create new item (use the same structure as with */
		      /* the therm card) */
		      
		      WDB[mat + MATERIAL_PTR_SAB] = NULLPTR;
		      loc1 = NewItem(mat + MATERIAL_PTR_SAB, 
				     THERM_BLOCK_SIZE);

		      /* Read name */
		      
		      WDB[loc1 + THERM_PTR_ALIAS] = 
			(double)PutText(params[j++]);
		      
		      /* Read ZA */
		      
		      WDB[loc1 + THERM_ZA] =  
			(double)TestParam(pname, fname, line, params[j++], 
					  PTYPE_INT, 1001, 120000);
		      
		      /*******************************************************/
		    }
		  else if (!strcmp(params[j], "tft"))
		    {
		      /***** Minimum and maximum temperatures for TMS ********/

		      j++;
		      
		      /* Get minimum temperature */
		      
		      WDB[mat + MATERIAL_TMS_TMIN] = 
			TestParam(pname, fname, line, params[j++], 
				  PTYPE_REAL, 0.0, 100000.0);
		      
		      /* Get maximum temperature */
		      
		      WDB[mat + MATERIAL_TMS_TMAX] = 
			TestParam(pname, fname, line, params[j++], 
				  PTYPE_REAL, RDB[mat + MATERIAL_TMS_TMIN],
				  100000.0);
		      
		      /* Set mode */
		      
		      WDB[DATA_TMS_MODE] = (double)TMS_MODE_CE;
		      WDB[mat + MATERIAL_TMS_MODE] = (double)YES;
		      
		      /*******************************************************/
		    }
		  else 
		    {
		      /***** Composition *************************************/

		      /* Find nuclide in composition (start from previous) */

		      iso = iso0;
		      while (iso > VALID_PTR)
			{
			  /* Pointer to nuclide data */

			  nuc = (long)RDB[iso + COMPOSITION_PTR_NUCLIDE];
			  CheckPointer(FUNCTION_NAME, "(nuc)", DATA_ARRAY,nuc);

			  /* Compare */
			  
			  if (!strcmp(GetText(nuc + NUCLIDE_PTR_NAME),
				      params[j]))
			    break;

			  /* Next */

			  iso = NextItem(iso);
			}

		      /* Find nuclide in composition (start from beginning) */

		      if (iso < VALID_PTR)
			{			  
			  iso = (long)RDB[mat + MATERIAL_PTR_COMP];
			  while (iso > VALID_PTR)
			    {
			      /* Pointer to nuclide data */
			      
			      nuc = (long)RDB[iso + COMPOSITION_PTR_NUCLIDE];
			      CheckPointer(FUNCTION_NAME, "(nuc)", 
					   DATA_ARRAY,nuc);

			      /* Compare */
			  
			      if (!strcmp(GetText(nuc + NUCLIDE_PTR_NAME),
					  params[j]))
				break;
			      
			      /* Next */
			      
			      iso = NextItem(iso);
			    }
			}

		      /* Check pointer */
		      
		      if (iso < VALID_PTR)
			Error(-1, pname, fname, line, 
			      "Material %s has no nuclide %s in composition",
			      GetText(mat + MATERIAL_PTR_NAME), params[j]);
		      else
			j++;

		      /* Remember pointer */

		      iso0 = iso;
			      
		      /* Read fraction */
		  
		      val = TestParam(pname, fname, line, params[j++], 
				      PTYPE_REAL, -100.0, 1E+25);
		  
		      /* Put value */

		      WDB[iso + COMPOSITION_ADENS] = val;

		      /* Add to sum */
		      
		      sum = sum + val;
		      
		      /*******************************************************/
		    }
		}
	      
	      /* Set density if sum */

	      if (RDB[mat + MATERIAL_ADENS] == -INFTY)
		WDB[mat + MATERIAL_ADENS] = sum;

	      /* Calculate normalized fractions */
	      
	      IsotopeFractions(mat);
  	    }

	  /* Free parameter list */
      
	  if (np > 0)
	    for (n = 0; n < np + 1; n++)
	      Mem(MEM_FREE, params[n]);
	}

      /* Free memory */
  
      Mem(MEM_FREE, input);

      /* Next file */

      loc0++;
    }

  /* This must be called to get the divided compositions into material */
  /* structures */

  SumDivCompositions();
  
  fprintf(out, "OK.\n\n");
}
void schurFactorization(long n, complex **A, complex **T, complex **U)
{

  /* Schur factorization: A = U*T*U', T = upper triangular, U = unitary */
            
  long i,j,iter,maxIter;
  double tol, diff1,diff2; 
  complex T11, T12, T21, T22; 
  complex sigma1, sigma2, sigma; 
  complex z, z1, z2; 
  complex **P, **Q, **R;


  /* Allocate auxiliary matrices */

  P     = (complex **)Mem(MEM_ALLOC,n, sizeof(complex *)); 
  Q     = (complex **)Mem(MEM_ALLOC,n, sizeof(complex *)); 
  R     = (complex **)Mem(MEM_ALLOC,n, sizeof(complex *)); 

  for (i=0; i<n; i++){
    P[i]     = (complex *)Mem(MEM_ALLOC,n, sizeof(complex)); 
    Q[i]     = (complex *)Mem(MEM_ALLOC,n, sizeof(complex)); 
    R[i]     = (complex *)Mem(MEM_ALLOC,n, sizeof(complex)); 
  }

  /* ------------------------------------------------------------*/

  /* Parameters for iteration */

   maxIter = 500;
   tol     = 1E-30; 

  /* ------------------------------------------------------------*/

  /* Init U = eye(n) (identity matrix) */

  for (i=0; i<n; i++){
    U[i][i].re = 1.0; 
    U[i][i].im = 0.0; 
  }  
  
  /* ------------------------------------------------------------*/

  /* Reduce A to Hessenberg form */

  hessFactorization(n,A,P,T); 

  /* ------------------------------------------------------------*/

  /* Compute Schur factorization of Hessenberg matrix T */


   for (j=n-1; j>0; j--){ /* Main loop */

     for (iter=0; iter<maxIter; iter++){ /* Iteration loop */

       sigma.re = T[j][j].re;
       sigma.im = T[j][j].im; 


       /* -- Use Wilkinson shift -- */

       /* submatrix considered in the shift */

       T11 = T[j-1][j-1];
       T12 = T[j-1][j];
       T21 = T[j][j-1];
       T22 = T[j][j];

       /* Compute eigenvalues of submatrix */

       z.re  = 0.0;
       z.im  = 0.0;
       z2.re = 0.0;
       z2.im = 0.0;

       /* z = T11*T11 + T22*T22 - 2*T11*T22 + 4*T12*T21 */

       z1 = c_mul(T11,T11);

       z  = c_add(z ,z1);
       z2 = c_add(z2,z1);
       
       z1 = c_mul(T22,T22);

       z  = c_add(z ,z1);
       z2 = c_add(z2,z1);

       z1 = c_mul(T11,T22);

       z1.re = -2.0 * z1.re;
       z1.im = -2.0 * z1.im;

       z  = c_add(z,z1);

       z1 = c_mul(T12,T21);
       z1.re = 4.0 * z1.re;
       z1.im = 4.0 * z1.im;
       z = c_add(z,z1);

       /* Square root*/

       z = c_sqrt(z);

       /* Eigenvalues */
       
       sigma1 = c_add(z2,z);
       sigma2 = c_sub(z2,z);

/*        printf("sigma1 = %e %e\n", sigma1.re, sigma1.im); */
/*        printf("sigma2 = %e %e\n", sigma2.re, sigma2.im); */

       /* Select eigenvalue for shift*/

       diff1 = c_norm( c_sub(T[j][j], sigma1) );
       diff2 = c_norm( c_sub(T[j][j], sigma2) );

       if (diff1 < diff2){
	 sigma.re = sigma1.re;
	 sigma.im = sigma1.im;
       }else{
	 sigma.re = sigma2.re;
	 sigma.im = sigma2.im;
       }

       /* --- QR step with Wilkinson shift --- */

       /* Shift: T(1:j,1:j) = T(1:j,1:j) - sigma * eye(j) */

       for (i=0; i<j+1; i++){

	 CheckValue(FUNCTION_NAME, "T[i][i].re","", T[i][i].re, -INFTY, INFTY);
	 CheckValue(FUNCTION_NAME, "T[i][i].im","", T[i][i].im, -INFTY, INFTY);	 

	 T[i][i].re = T[i][i].re - sigma.re;   
	 T[i][i].im = T[i][i].im - sigma.im;   
	 
       }

       /* Compute QR factorization of shifted Hessenberg matrix */

       for (i=0; i<n; i++){
	 memset(Q[i], 0, n*sizeof(complex));
	 memset(R[i], 0, n*sizeof(complex));
       }

       QRfactorization(n,T,Q,R); 

       /* T = T_new = R * Q  */

       for (i=0; i<n; i++){
	 memset(T[i], 0, n*sizeof(complex));
       }
       matProduct(n, n, n, R, Q, T);

       /* T(1:j,1:j) = T(1:j,1:j) + sigma * eye(j) */
       for (i=0; i<j+1; i++){
	 T[i][i].re = T[i][i].re + sigma.re;   
	 T[i][i].im = T[i][i].im + sigma.im;   
       }


       /* R =  U_new = U * Q */

       for (i=0; i<n; i++){
	 memset(R[i], 0, n*sizeof(complex));
       }       
       matProduct(n,n,n,U,Q,R); 

       /* U = R */

       for (i=0; i<n; i++){
	 memcpy(U[i],R[i], n*sizeof(complex));
       } 

       /* Check convergence */

       if (c_norm( T[j][j-1] ) <= tol * (c_norm(T[j-1][j-1]) + c_norm(T[j][j]))){
	 T[j][j-1].re = 0.0;
	 T[j][j-1].im = 0.0;
	 break; 
       }
       
   
     }	/* end of iter loop */  
    
   } /* end of main loop */


  /* -------------------------------------------------------------*/

   /* U = P*U */

   for (i=0; i<n; i++){
     memset(U[i], 0, n*sizeof(complex));
   }
   matProduct(n,n,n,P,R,U);
   

  /* -------------------------------------------------------------*/
  /* Free auxiliary variables */

   for (i=0; i<n; i++){
     Mem(MEM_FREE,P[i]); 
     Mem(MEM_FREE,Q[i]); 
     Mem(MEM_FREE,R[i]); 
   }

   Mem(MEM_FREE,P); 
   Mem(MEM_FREE,Q); 
   Mem(MEM_FREE,R); 

  /* Return */

  return;   
    
  
}
void ProcessPhotonAtt()
{
  long mat, iso, nuc, Z, ne, n, N, i0, i, ptr;
  double Ei[100], fi[100], *E, *f, mdens, mfrac, val;

  /* Avoid compiler warning (photon_attenuation.h sisältää dataa jota */
  /* käytetään useammassa aliohjelmassa) */

  n = idx1[0][0];
  val = dat1[0][0];

  /* Adjust coincident points */

  ne = (long)idx0[91][0] + (long)idx0[91][1];
  
  for (n = 1; n < ne; n++)
    if (dat0[n][1] == dat0[n - 1][1])
      dat0[n][1] = dat0[n][1] + 1E-11;

  fprintf(out, "Processing reponse functions for photon dose rates...\n");

  /* Loop over materials */

  mat = (long)RDB[DATA_PTR_M0];
  while (mat > VALID_PTR)
    {
      /***********************************************************************/

      /***** Unionize energy grid ********************************************/

      /* Reset pointer */

      E = NULL;
      N = 0;

      /* Get mass density */

      if ((mdens = RDB[mat + MATERIAL_MDENS]) == 0.0)
	{
	  /* Skip zero-density material */

	  mat = NextItem(mat);

	  /* Cycle loop */

	  continue;
	}

      /* Loop over composition */

      iso = (long)RDB[mat + MATERIAL_PTR_COMP];
      while (iso > VALID_PTR)
	{
	  /* Pointer to nuclide */

	  nuc = (long)RDB[iso + COMPOSITION_PTR_NUCLIDE];
	  CheckPointer(FUNCTION_NAME, "(nuc)", DATA_ARRAY, nuc);

	  /* Get Z */

	  Z = (long)RDB[nuc + NUCLIDE_Z];

	  /* Data only goes up to 92 */

	  if (Z > 92)
	    {
	      /* Skip */

	      iso = NextItem(iso);

	      /* Cycle loop */

	      continue;
	    }

	  /* Get index to data array and number of points */

	  i0 = (long)idx0[Z - 1][0];
	  ne = (long)idx0[Z - 1][1];

	  /* Check first and last energy point */

	  if (dat0[i0][1] != 1E-3)
	    Die(FUNCTION_NAME, "Mismatch in first energy point");
	  else if (dat0[i0 + ne - 1][1] != 20.0)
	    Die(FUNCTION_NAME, "Mismatch in last energy point");
	  
	  /* Read data */

	  for (n = 0; n < ne; n++)
	    {
	      /* Check Z and read value */

	      if (dat0[i0 + n][0] != Z)
		Die(FUNCTION_NAME, "Mismatch in Z");
	      else
		Ei[n] = dat0[i0 + n][1];
	    }

	  /* Add points to main array */

	  E = AddPts(E, &N, Ei, ne);

	  /* Next */

	  iso = NextItem(iso);
	}

      /* Check order */

      for (n = 1; n < N; n++)
	if (E[n] <= E[n - 1])
	  Die(FUNCTION_NAME, "Error in order");

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

      /***** Reconstruct data ************************************************/

      /* Put number of points */

      WDB[mat + MATERIAL_PHOTON_ATT_NE] = (double)N;

      /* Put energy array in material structure */

      ptr = ReallocMem(DATA_ARRAY, N);
      WDB[mat + MATERIAL_PTR_PHOTON_ATT_E] = (double)ptr;

      for (n = 0; n < N; n++)
	WDB[ptr++] = E[n];

      /* Allocate memory for data array */

      ptr = ReallocMem(DATA_ARRAY, N);
      WDB[mat + MATERIAL_PTR_PHOTON_ATT_F] = (double)ptr;
      f = &WDB[ptr];

      /* Reset vector (just to be safe) */

      memset(f, 0.0, N*sizeof(double));

      /* Loop over composition */

      iso = (long)RDB[mat + MATERIAL_PTR_COMP];
      while (iso > VALID_PTR)
	{
	  /* Pointer to nuclide */

	  nuc = (long)RDB[iso + COMPOSITION_PTR_NUCLIDE];
	  CheckPointer(FUNCTION_NAME, "(nuc)", DATA_ARRAY, nuc);

	  /* Calculate mass fraction */

	  mfrac = RDB[nuc + NUCLIDE_AW]*RDB[iso + COMPOSITION_ADENS]/
	    mdens/N_AVOGADRO;

	  /* Get Z */

	  Z = (long)RDB[nuc + NUCLIDE_Z];

	  /* Data only goes up to 92 */

	  if (Z > 92)
	    {
	      /* Skip */

	      iso = NextItem(iso);

	      /* Cycle loop */

	      continue;
	    }

	  /* Get index to data array and number of points */

	  i0 = (long)idx0[Z - 1][0];
	  ne = (long)idx0[Z - 1][1];
	  
	  /* Read data */

	  for (n = 0; n < ne; n++)
	    {
	      Ei[n] = dat0[i0 + n][1];
	      fi[n] = dat0[i0 + n][3];
	    }

	  /* Loop over unionized grid */

	  for (n = 0; n < N - 1; n++)
	    {
	      /* Find index */

	      if ((i = SearchArray(Ei, E[n], ne)) < 0)
		Die(FUNCTION_NAME, "Point not in grid: %ld %E", n, E[n]);

	      /* Interpolate */

	      val = ENDFInterp(5, E[n], Ei[i], Ei[i + 1], fi[i], fi[i + 1]);

	      /* Add to data */

	      f[n] = f[n] + val*mfrac;
	    }
	  
	  /* Add last point */

	  f[N - 1] = f[N -1] + fi[ne - 1]*mfrac;

	  /* Next */

	  iso = NextItem(iso);
	}

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

      /* Free memory */

      if (E != NULL)
	Mem(MEM_FREE, E);

      /* Next material */

      mat = NextItem(mat);
    }

  /* Exit OK */

  fprintf(out, "OK.\n\n");
}
double *GetImportantPts(long ace, long *NXS, long *JXS, long *ni)
{
  long NES, n0, i, itot, ptr, xss, n, nr, mt, ne, loc0, loc1, add;
  double *tmp, *Ei;

  /* Get maximum number of energy points */
		  
  NES = NXS[2];

  /* Allocate memory for data */

  tmp = (double *)Mem(MEM_ALLOC, NES, sizeof(double));

  /* Reset values */

  for (n = 0; n < NES; n++)
    tmp[n] = 0.0;

  /* Reset total number of important points */

  itot = 0;

  /* Pointer to XSS array */
	  
  xss = (long)ACE[ace + ACE_PTR_XSS];
	
  /* Loop over reaction channels */
	  
  for (nr = -1; nr < NXS[3]; nr++)
    {
      /* Reset pointers to energy array and xs data */

      loc0 = -1;
      loc1 = -1;

      /* Reset indexes */

      n0 = -1;
      ne = -1;

      if (nr == -1)
	{
	  /* Elastic scattering. Set mt */

	  mt = 2;

	  /* Set number of energy points */
	  
	  ne = NES;
	  
	  /* Set index to first point */

	  n0 = 0;

	  /* Pointer to energy array */

	  loc0 = xss + JXS[0] - 1;

	  /* Get pointer to xs data */

	  loc1 = xss + JXS[0] - 1 + 3*NES;
	}
      else
	{
	  /* Other reactions, get mt */

	  ptr = xss + JXS[2] - 1 + nr;
	  mt = (long)ACE[ptr];

	  /* Check mt and specials flag (tää on vähän tarpeeton) */
	  
	  if (((mt > 15) && (mt < 100)) || ((mt > 101) && (mt < 200)) ||
	      ((long)RDB[DATA_OPTI_INCLUDE_SPECIALS] == YES))
	    {
	      /* Get pointer to SIG-block (Table F-10, page F-17) */
	      
	      ptr = xss + JXS[5] - 1 + nr;
	      ptr = xss + (long)ACE[ptr] + JXS[6] - 1;

	      /* Get number of energy points */
		      
	      ne = (long)ACE[ptr];	      
	      
	      /* Get index to first point */
		      
	      n0 = NXS[2] - (long)ACE[ptr];

	      /* Pointer to energy array */

	      loc0 = xss + JXS[0] - 1 + n0;
	      
	      /* Get pointer to xs data */
	      
	      loc1 = ptr + 1;
	    }
	}

      /* Find important points */

      if (loc0 > 0)
	{
	  /* Check indexes */

	  CheckValue(FUNCTION_NAME, "n0", "", n0, 0, NES);
	  CheckValue(FUNCTION_NAME, "ne", "", n0, 0, NES);
	  CheckValue(FUNCTION_NAME, "n0 + ne", "", n0 + ne, 0, NES);

	  /* Reset number of important points */

	  i = 0;

	  /* Loop over grid */

	  for (n = 0; n < ne; n++)
	    {
	      /* Reset add flag */

	      add = NO;

	      /* First two points */

	      if (n < 2)
		add = YES;

	      /* Last two points */

	      else if (n > ne - 3)
		add = YES;

	      /* Local minimum */

	      else if ((ACE[loc1 + n] < ACE[loc1 + n - 1]) &&
		       (ACE[loc1 + n] < ACE[loc1 + n + 1]))
		add = YES;

	      /* Local maximum */

	      else if ((ACE[loc1 + n] > ACE[loc1 + n - 1]) &&
		       (ACE[loc1 + n] > ACE[loc1 + n + 1]))
		add = YES;

	      /* Check add-flag */

	      if (add == YES)
		{
		  /* Add new or compare to existing value */

		  if (tmp[n0 + n] == 0.0)
		    {
		      tmp[n0 + n] = ACE[loc0 + n];
		      itot++;
		    }
		  else if (tmp[n0 + n] != ACE[loc0 + n])
		    {
		      fprintf(err, "%s Mismatch in energy data.\n", 
			      FUNCTION_NAME);
		      exit(-1);
		    }

		  i++;
		}
	    }
	}
    }
  
  /* Allocate memory for final important data */

  Ei = (double *)Mem(MEM_ALLOC, itot, sizeof(double));

  /* Clean data (remove zeros) */
  
  i = 0;

  for (n = 0; n < NES; n++)
    if (tmp[n] > 0.0)
      Ei[i++] = tmp[n];

  /* Check pointer */

  if (i != itot)
    {
      fprintf(err, "%s i != itot.\n", FUNCTION_NAME);
      exit(-1);
    }

  /* Free temporary array */

  if (tmp != NULL)
    Mem(MEM_FREE, tmp);

  /* Set array size */

  *ni = itot;

  /* Return pointer */

  return Ei;
}
Example #12
0
struct ccsMatrix *SymbolicLU(struct ccsMatrix *cmat){

  /* Palauttaa ccs-matriisin A, joka sisältää myös Gaussissa tulevan fill-inin (E u F) */

  long k,l,i,j,ind,n, m, nnz, rs, len, nnzi; /* len = listan pituus, nnzi = nollasta eroavien lkm rivillä i*/
  long *col, *row, *list, *colA, *rowA, *fill, count; 
  complex *val, *valA; 
  struct ccsMatrix *A; 

  /* Aseta muuttujat matriisien kenttiin */

  n = cmat->n; 
  m = cmat->m; 
  if (n != m)
    Die(FUNCTION_NAME, "burnup matrix not square");
  nnz = cmat->nnz; 

  /* Varaa tila uusille suureille  */

  /* pidä listaa vierekkäisistä solmuista    */
  
  list = (long *)Mem(MEM_ALLOC, n, sizeof(long));

 /* pidä kirjaa jokaisen sarakkeen nz:oista */

  fill = (long *)Mem(MEM_ALLOC, n, sizeof(long));
  
  /* Varaa tilaa joka riviltä (sarakkeesta) fill-iniä varten */
  rs  = 0.1*n;  

/*  rs = 1.0; */
  nnz = nnz + rs*n; /* rs uutta paikkaa joka rivillä   */

  A = ccsMatrixNew(n,n,nnz);
  if (A == NULL)
    Die(FUNCTION_NAME, "Failed to allocate space"); 
  
  row     = cmat->rowind; 
  col     = cmat->colptr;
  val     = cmat->values;

  rowA = A->rowind; /* fill-in tähän matriisiin */
  colA = A->colptr;
  valA = A->values;

  /* Init. */

  for (i=0 ; i < n; i++){ 

    CheckValue(FUNCTION_NAME, "i", "", i, 0, cmat->n - 1);
    CheckValue(FUNCTION_NAME, "i", "", i, 0, A->n);

    nnzi    = col[i+1]-col[i];  /* nz tässä sarakkeessa          */
    colA[i] = col[i] + i*rs;    /* aseta sarakepointterit oikein */

    /* JLE (1.6.2011): mitä jos nnzi == 0? */

    /* (Huomaa, että 1. kierroksella i = 0, eli i*rs = 0... )    */

    /* copy: memcpy(dest, src, size) */
    memcpy(valA + colA[i], val + col[i], nnzi * sizeof(complex));
    memcpy(rowA + colA[i], row + col[i], nnzi * sizeof(long));
    memset(valA + colA[i] + nnzi,  0, rs * sizeof(complex)); 
    memset(rowA + colA[i] + nnzi, -1, rs * sizeof(long));
  }
  colA[n] = nnz; /* aseta vielä viimeisen sarakkeen pointteri */

  /*------------------------------------------------------------------*/
  /* symbolinen hajotelma                                             */
  /*------------------------------------------------------------------*/

  /* Algoritmi perustuu seuraavaan lemmaan: 

     kaari (i,j) kuuluu täytetyn matriisin (A u F) graafiin jos 
     solmusta i on polku solmuun j s.e. kaikki välissä olevan solmut 
     ovat pienempiä kuin min(i,j). 

     Kaikki kaaret (*,j) lasketaan etsimällä ne solmut, joista polku solmuun j s.e. 
     edellinen ehto toteutuu */

  for (i = 1 ; i < n ; i++) { /* aloita toisesta sarakkeesta */

    len = -1; /* tyhjä joukko */

    CheckValue(FUNCTION_NAME, "i", "", i, 0, cmat->n - 1);

    nnzi = col[i+1]-col[i];  /* alkuperäinen nollasta eroavien lkm tässä sarakkeessa */
    
    for (j=col[i] ; j < col[i+1] ; j++){ /* käy läpi nollasta eroavat sarakkeessa i */

    /* 2015/03/30: muutettu A->nnz -1 => A->nnz eli sallii nyt nollasarakkeet matriisin oikeassa reunassa (MPu)*/
    CheckValue(FUNCTION_NAME, "j", "", j, 0, cmat->nnz);

      k       = row[j]; /* a_ki ~= 0 eli k -> i       */ 

      CheckValue(FUNCTION_NAME, "k", "", k, 0, cmat->n - 1);

      fill[k] = 1;      /* otetaan tieto talteen      */
      
      if (k < i){      /* Nyt siis k -> i s.e. k < i  */
	len = len + 1; 

	CheckValue(FUNCTION_NAME, "len", "", len, 0, cmat->n - 1);

	/* lisää k listalle            */

	list[len] = k;
      }
    }

    /*----------------------------------------------------------------*/

    /* Se on tää luuppi johon jumittaa (JLe) */

    count = 0;

    while (len >= 0){   /* Etsitään löytyykö m s.e. m ->... ->k -> i ja k < min(m,i) */

      CheckValue(FUNCTION_NAME, "len", "", len, 0, cmat->n - 1);

      k   = list[len];  /* poista edellinen solmu listalta*/
      len = len - 1;

      /* Testataan ikuinen luuppi (JLe) */

      if (count++ > 100000000)
	Die(FUNCTION_NAME, "Infinite loop?");

      CheckValue(FUNCTION_NAME, "k", "", k, 0, A->n - 1);

      /* Käy läpi listaa vastaavat sarakkeet eli etsi m -> k */
      for (l = colA[k]; l < colA[k+1] ; l++) {

	m = rowA[l]; /* a_mk ~= 0 */

	if (m < 0){
	  break;
	}

	if (m > k){
	  /* Nyt siis m -> k -> i s.e. k < min(m,i) eli (m,i) lisätään täytettyyn matriisin */
	CheckValue(FUNCTION_NAME, "m", "", m, 0, cmat->n - 1);

	  if (fill[m] == 0){ /* Ei ollut siellä valmiiksi */
	    /* lisää kaari (m,i)  A:han */

	    CheckValue(FUNCTION_NAME, "i", "", i, 0, A->n - 1);

	    ind = colA[i] + nnzi;
	    if (ind >= colA[i+1]){ /* varaa lisää tilaa */

	      /* Tässä nyt uusi funktio */
	      ccsMatrixColSpace(A,i,rs); 

	      colA = A->colptr;
	      rowA = A->rowind;
	      valA = A->values;
	      nnz  = A->nnz;
	    }
	    
        /*2015/03/30: Tähän muutettu A->nnz-1 => A->nnz (MPu)*/
	    CheckValue(FUNCTION_NAME, "ind", "", ind, 0, A->nnz);

	    rowA[ind] = m; /* Nyt matriisissa */
	    nnzi = nnzi + 1;

	    CheckValue(FUNCTION_NAME, "m", "", m, 0, cmat->n - 1);

	    fill[m] = 1;

       /* Seuraava if-osio oli aikaisemmin tämän if-osion ulkopuolella vaikka pitäisi olla sisällä! 
       => selitys päättymättömään luuppiin...? */

        if (m < i){ /* HUOM! edelleen m > k */
	    /* Nyt siis m -> k -> i s.e. m & k < i                        */ 
	    /* => lisätään m listalle, koska voi löytyä j -> m -> k -> i  */
	       len = len + 1;

	       CheckValue(FUNCTION_NAME, "len", "", len, 0, cmat->n - 1);

	       list[len] = m;
	  }
	  }
	}	 	

	CheckValue(FUNCTION_NAME, "k", "", k, 0, A->n - 1);
      }
    }
    /*-----------------------------------------------------------------*/

    CheckValue(FUNCTION_NAME, "i", "", i, 0, A->n - 1);

    for (l = colA[i] ; l < colA[i] + nnzi ; l++) { /* nollaa fill seuraava kierrosta varten */

      CheckValue(FUNCTION_NAME, "l", "", l, 0, A->nnz - 1);

      k = rowA[l];

      CheckValue(FUNCTION_NAME, "k", "", k, 0, cmat->n - 1);

      fill[k] = 0;

      CheckValue(FUNCTION_NAME, "i", "", i, 0, A->n - 1);
    }
  } /* i silmukka loppuu tähän */
  /*-------------------------------------------------------------------------*/

  ccsMatrixIsort(A);   /* lisäyssorttaus */ 

  Mem(MEM_FREE, list);  
  Mem(MEM_FREE, fill); 
  
  return A;

}
Example #13
0
 Mem MemMgrItf :: make_mem_ref ( Refcount * obj, MemoryItf * itf, caps_t caps )
 {
     // TBD - can set max capabilities here
     return Mem ( obj, itf, caps );
 }
void LUdecomposition(long n, complex **A, complex *b, complex *x)
{

  long i,j,k,*p;
  complex akk, bk, z, sum; 
  complex *Ak; 


  /* Allocate auxiliary variables */

  p = (long *)Mem(MEM_ALLOC, n, sizeof(long)); 


  /* Gaussian elimination with partial pivoting */

  for (k=0; k<n-1; k++){ /* columns of A */


    /* --- Pivoting --- */

    akk.re = 0.0; 
    akk.im = 0.0; 
    j = k; 
    for (i=k; i<n; i++){
      if ( c_norm(A[i][k]) > c_norm(akk)){
	akk = A[i][k]; 

	CheckValue(FUNCTION_NAME, "A[i][k].re","", A[i][k].re, -INFTY, INFTY);
	CheckValue(FUNCTION_NAME, "A[i][k].im","", A[i][k].im, -INFTY, INFTY);

	j = i; 
      }
    }

    if (j != k){ /* swap rows j and k*/


      Ak   = A[k];  
      A[k] = A[j]; /* swap pointers*/
      A[j] = Ak; 

      bk   = b[k]; 
      b[k] = b[j]; 
      b[j] = bk; 

    }

    p[k] = j;  /* Keep list of permutations */

    /* Sanity check */

    if (akk.re != A[k][k].re && akk.im != A[k][k].im){
      Die(FUNCTION_NAME, "Something went wrong with pivoting?"); 
      return; 
    }

    if (akk.re == 0.0 && akk.im == 0.0){
      Die(FUNCTION_NAME, "Matrix singular?"); 
      return; 
    }

    /* Store L part */

    for (i=k+1;i<n; i++){
      A[i][k] = c_div(A[i][k],A[k][k]); 

      CheckValue(FUNCTION_NAME, "A[i][k].re","", A[i][k].re, -INFTY, INFTY);
      CheckValue(FUNCTION_NAME, "A[i][k].im","", A[i][k].im, -INFTY, INFTY);

    }

    /* Update */

    for (i=k+1; i<n; i++){

      /* update b */

      z = c_mul(A[i][k], b[k]);  
      b[i] = c_sub(b[i], z); 

      CheckValue(FUNCTION_NAME, "b[i].re","", b[i].re, -INFTY, INFTY);
      CheckValue(FUNCTION_NAME, "b[i].im","", b[i].im, -INFTY, INFTY);

      for (j=k+1;  j<n; j++){
	
	/* Update U part of A */
	
	z = c_mul( A[i][k], A[k][j]);
	A[i][j] = c_sub(A[i][j],z);  

	CheckValue(FUNCTION_NAME, "A[i][j].re","", A[i][j].re, -INFTY, INFTY);
	CheckValue(FUNCTION_NAME, "A[i][j].im","", A[i][j].im, -INFTY, INFTY);
      }
    }        
  }


  /* Solve x */

  x[n-1] = c_div(b[n-1],A[n-1][n-1]);

  for (i=n-2; i>=0; i--){
    sum.re = 0.0;
    sum.im = 0.0;
    for (j=i+1; j<n; j++){
      z   = c_mul(A[i][j], x[j]);
      sum = c_add(sum, z);
    }
    z    = c_sub(b[i], sum);
    x[i] = c_div(z, A[i][i]);
  }

  Mem(MEM_FREE, p); 

  /* Return */

  return;   
    
  
}
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");
  
  /***************************************************************************/
}
Example #16
0
/*
 * Read the message from the rtdServer and call a virtual method to
 * display the image and evaluate the tcl event scripts.
 */
int RtdCamera::fileEvent()
{
    Mem mem;
    rtdIMAGE_INFO info;
    int stat;

    memset(&info, '\0', sizeof(rtdIMAGE_INFO));
    info.semId = info.shmNum = -1;

    stat = rtdRecvImageInfo(eventHndl_, &info, verbose_, buffer_);

    semId_  = info.semId;
    shmNum_ = info.shmNum;

    if (stat != RTD_OK || checkType(info.dataType) != RTD_OK || 
	info.xPixels <=0 || info.yPixels <= 0) {
	checkStat();
	return TCL_ERROR;
    }
    
    if ( ! attached()) {
	semDecr();
	return TCL_OK;
    }

    /*
     * class Mem takes care of possible reusing previous shared memory areas 
     * and cleanup. Choose the constructor depending on whether the 
     * semaphore fields of the image info have been set.
     */
    int bytes = info.xPixels * info.yPixels * (abs(info.dataType) / 8);
    if (semId_ > 0)
	mem = Mem(bytes, info.shmId, 0, verbose_, shmNum_, semId_);
    else
	mem = Mem(bytes, info.shmId, 0, verbose_);
    
    if (mem.status() != 0) {
	checkStat();
	return TCL_ERROR;
    }

    dbl_->log("image event: Id=%d, x=%d, y=%d, width=%d, height=%d, "
	      "shmId=%d shmNum=%d semId=%d\n",
	      info.frameId, info.frameX, info.frameY, info.xPixels, info.yPixels, 
	      info.shmId, shmNum_, semId_);

    /*
     * before displaying the image delete the file handler. This blocks
     * new image events which must not be handled between camera pre/post commands.
     */
    fileHandler(0);

    // call the virtual method in a derived class to display the image
    int disperr = display(info, mem);

    // re-install the file handler
    fileHandler(1);

    // finally decrement the semaphore
    semDecr();
    return disperr;
}
Example #17
0
void Rendezvous(long *nsrc0, double *wgt0)
{
#ifdef OLD_HIST
#ifdef MPI

  long n, ntot, *ntsk, *buf, ptr, i, i0, sz1, sz2, nhist, pth, id;
  double totwgt, *src1, *src2;

  /* Check mode */

  if ((long)RDB[DATA_OPTI_MPI_REPRODUCIBILITY] == NO)
    return;

  Die(FUNCTION_NAME, "Tää ei toimi uuden historiarakenteen kanssa");

  /* Check number of mpi tasks */

  if (mpitasks == 1)
    return;

  /* Start timers */

  StartTimer(TIMER_MPI_OVERHEAD);
  StartTimer(TIMER_MPI_OVERHEAD_TOTAL);

  /* Allocate memory for task-wise sizes */

  ntsk = (long *)Mem(MEM_ALLOC, mpitasks, sizeof(long));
  buf = (long *)Mem(MEM_ALLOC, mpitasks, sizeof(long));

  /* Put task-wise value */

  buf[mpiid] = *nsrc0;

  /* Reduce data */

  MPI_Barrier(MPI_COMM_WORLD);
  if (MPI_Reduce(buf, ntsk, mpitasks, MPI_LONG, MPI_SUM, 0, MPI_COMM_WORLD)
      != MPI_SUCCESS)
    Die(FUNCTION_NAME, "MPI Error");

  /* Broadcast data */

  MPI_Barrier(MPI_COMM_WORLD);
  if (MPI_Bcast(ntsk, mpitasks, MPI_LONG, 0, MPI_COMM_WORLD) != MPI_SUCCESS)
    Die(FUNCTION_NAME, "MPI Error");    

  /* Calculate total size */
      
  ntot = 0;
  for (n = 0; n < mpitasks; n++)
    ntot = ntot + ntsk[n];
    
  /* Free buffer */

  Mem(MEM_FREE, buf);

  /* Get size of particle and history data blocks */

  sz1 = PARTICLE_BLOCK_SIZE - LIST_DATA_SIZE;
  sz2 = HIST_BLOCK_SIZE - LIST_DATA_SIZE;

  /* Get size of history array */

  if ((nhist = (long)RDB[DATA_HIST_LIST_SIZE]) < 0)
    nhist = 0;

  /* Allocate memory for histories */

  src1 = Mem(MEM_ALLOC, (sz1 + nhist*sz2)*ntot, sizeof(double));
  
  /* Calculate starting point */

  i0 = 0;
  for (i = 0; i < mpiid; i++)
    i0 = i0 + ntsk[i]*(sz1 + nhist*sz2);

  /* Reset OpenMP id */

  id = 0;

  /* Loop over distribution and read data into block */
  
  while (1 != 2)
    {
      /* Pointer to source distribution */

      ptr = (long)RDB[DATA_PART_PTR_SOURCE];
      CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);
      
      /* Pointer to first after dummy */
      
      if ((ptr = NextItem(ptr)) < VALID_PTR)
	break;

      /* Remove particle from source */

      RemoveItem(ptr);

      /* Copy particle data */

      memcpy(&src1[i0], &RDB[ptr + LIST_DATA_SIZE], sz1*sizeof(double));

      /* Update pointer */

      i0 = i0 + sz1;

      /* Pointer to history data */

      pth = (long)RDB[ptr + PARTICLE_PTR_HIST];

      /* Loop over histories */

      for (i = 0; i < nhist; i++)
	{
	  /* Check pointer */

	  CheckPointer(FUNCTION_NAME, "(pth1)", DATA_ARRAY, pth);

	  /* Copy history data */

	  memcpy(&src1[i0], &RDB[pth + LIST_DATA_SIZE], sz2*sizeof(double));

	  /* Update pointer */

	  i0 = i0 + sz2;

	  /* Next */

	  pth = NextItem(pth);
	}

      /* Put particle in stack */

      ToStack(ptr, id++);

      /* Check OpenMP id */

      if (id > (long)RDB[DATA_OMP_MAX_THREADS] - 1)
	id = 0;
    }

  /* Allocate memory for temporary data */

  if (mpiid == 0)
    src2 = Mem(MEM_ALLOC, (sz1 + nhist*sz2)*ntot, sizeof(double));
  else
    src2 = NULL;

  /* Reduce data */

  MPI_Barrier(MPI_COMM_WORLD);
  MPITransfer(src1, src2, (sz1 + nhist*sz2)*ntot, 0, MPI_METH_RED);

  /* Move data back to original */

  if (mpiid == 0)
    memcpy(src1, src2, (sz1 + nhist*sz2)*ntot*sizeof(double));

  /* Free temporary array */

  if (mpiid == 0)
    Mem(MEM_FREE, src2);

  /* Broadcast data */

  MPI_Barrier(MPI_COMM_WORLD);
  MPITransfer(src1, NULL, (sz1 + nhist*sz2)*ntot, 0, MPI_METH_BC);

  /* Reset pointer and  OpenMP id */

  i0 = 0;
  id = 0;

  /* Read data back to source */

  for (n = 0; n < ntot; n++)
    {
      /* Get new particle from stack */

      ptr = FromStack(PARTICLE_TYPE_NEUTRON, id++);

      /* Check OpenMP id */

      if (id > (long)RDB[DATA_OMP_MAX_THREADS] - 1)
	id = 0;

      /* Get pointer to history data (done here to avoid overwrite) */

      pth = (long)RDB[ptr + PARTICLE_PTR_HIST];      

      /* Copy particle data */

      memcpy(&WDB[ptr + LIST_DATA_SIZE], &src1[i0], sz1*sizeof(double));

      /* Put pointer to history data */

      WDB[ptr + PARTICLE_PTR_HIST] = (double)pth;

      /* Update pointer */

      i0 = i0 + sz1;

      /* Loop over histories */

      for (i = 0; i < nhist; i++)
	{
	  /* Check pointer */

	  CheckPointer(FUNCTION_NAME, "(pth2)", DATA_ARRAY, pth);

	  /* Copy history data */

	  memcpy(&WDB[pth + LIST_DATA_SIZE], &src1[i0], sz2*sizeof(double));

	  /* Update pointer */

	  i0 = i0 + sz2;

	  /* Next */

	  pth = NextItem(pth);
	}      

      /* Put particle back to source */
      
      AddItem(DATA_PART_PTR_SOURCE, ptr);
    }

  /* Free memory */

  Mem(MEM_FREE, src1);
  Mem(MEM_FREE, ntsk);

  /* Calculate number of particles and total weight */
  
  totwgt = 0.0;
  n = 0;

  /* Pointer to first after dummy */

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

  /* Loop over remaining */

  while (ptr > VALID_PTR)
    {
      /* Add to counter and weight */

      n++;
      totwgt = totwgt + RDB[ptr + PARTICLE_WGT];

      /* Next */

      ptr = NextItem(ptr);
    }

  /* Check */

  if (n != ntot)
    Die(FUNCTION_NAME, "Error in count");

  /* Put values */

  *nsrc0 = ntot;
  *wgt0 = totwgt;

  MPI_Barrier(MPI_COMM_WORLD);

  /* Stop timers */

  StopTimer(TIMER_MPI_OVERHEAD);
  StopTimer(TIMER_MPI_OVERHEAD_TOTAL);

#endif
#endif
}
void QRfactorization(long n, complex **A, complex **Q, complex **R)
{

  /* QR factorization based on Householder transformations */
            
  long i,j,k,m;
  double nrm; 
  complex z,z1,z2;  
  complex *vj;

 /* Init. Q = eye(n) (identity matrix) */

  for (i=0; i<n; i++){
    Q[i][i].re = 1.0; 
    Q[i][i].im = 0.0; 
  }


  /* Init. R = A  */

  for(j=0; j<n; j++){
    for (i=0; i<n; i++){
      R[i][j].re = A[i][j].re;
      R[i][j].im = A[i][j].im;

      CheckValue(FUNCTION_NAME, "A[i][j].re","", A[i][j].re, -INFTY, INFTY);
      CheckValue(FUNCTION_NAME, "A[i][j].im","", A[i][j].im, -INFTY, INFTY);

    }
  }

  /* Allocate auxiliary variables*/

  vj = (complex *)Mem(MEM_ALLOC, n, sizeof(complex));

 /*  printf("begin calc, n = %d\n", n);  */

    /* ------------------------------------------------------------*/

  for (j=0; j<n; j++){ /* Main loop */

    /* R(j:end, j)  */

    for (i=j; i<n; i++){
      vj[i-j].re = R[i][j].re;
      vj[i-j].im = R[i][j].im;
    }
    
    nrm = vectorNorm(n-j, vj); 

    /* v(1) = v(1) + sign(R(j,j)) * norm(v) */

    vj[0].re = vj[0].re + R[j][j].re / c_norm(R[j][j]) * nrm; 
    vj[0].im = vj[0].im + R[j][j].im / c_norm(R[j][j]) * nrm;


    /* Update norm */

    nrm = vectorNorm(n-j, vj);  

    /* v = v./norm(v) */

    for (i=0; i<n-j; i++){
      vj[i].re = vj[i].re / nrm; 
      vj[i].im = vj[i].im / nrm; 
    }

    /* Update */

    /* R(j:end, :) = R(j:end,:) - 2 * vj * vj' * R(j:end,:), : */

    /* Q(:,j:end)  = Q(:,j:end) - 2 * Q(:,j:end) * vj * vj^T */

    for (k=0; k<n; k++){

	/* (v * v' * A)_ik = v_i SUM_m Conj(v_m) A_mk */

	z.re = 0.0; 
	z.im = 0.0; 

	for (m=j; m<n; m++){

	  z1 = c_con(vj[m-j]); 
	  z1 = c_mul(z1, R[m][k]); 	  
	  z  = c_add(z,z1); 
	}

	for (i=j; i<n; i++){ 

	  z2    = c_mul(vj[i-j],z);

	  /* Update R(i,k) */
	  
	  R[i][k].re = R[i][k].re - 2.0 * z2.re; 
	  R[i][k].im = R[i][k].im - 2.0 * z2.im; 

	  CheckValue(FUNCTION_NAME, "R[i][k].re","", R[i][k].re, -INFTY, INFTY);
	  CheckValue(FUNCTION_NAME, "R[i][k].im","", R[i][k].im, -INFTY, INFTY);

	} 

	/* (A * v * v^')_ki = v_i * SUM_m Conj(v_m) A_km */

	z.re = 0.0;
	z.im = 0.0;

	for (m=j; m<n; m++){

	  z1 = vj[m-j]; 
	  z1 = c_mul(z1, Q[k][m]);
	  z  = c_add(z,z1);
	}

	for (i=j; i<n; i++){

	  z1 = c_con(vj[i-j]); 
	  z2 = c_mul(z1,z);

	  /* Update Q(k,i)*/

	  Q[k][i].re = Q[k][i].re - 2.0 * z2.re; 
	  Q[k][i].im = Q[k][i].im - 2.0 * z2.im; 

	  CheckValue(FUNCTION_NAME, "Q[k][i].re","", Q[k][i].re, -INFTY, INFTY);
	  CheckValue(FUNCTION_NAME, "Q[k][i].im","", Q[k][i].im, -INFTY, INFTY);
	}	      
    }
  } /* End of main loop (j) */

  /* -------------------------------------------------------------*/

  /* Free auxiliary variables */

  Mem(MEM_FREE, vj); 
  return;   

    
  
}
Example #19
0
void XSPlotter()
{
  double Emin, Emax, *E;
  long nuc, mat, rea, ne, n, i, ptr, rea1, ncol;
  char tmpstr[MAX_STR];
  FILE *fp;
  unsigned long seed;

  /* Check if plot is defined */

  if ((long)RDB[DATA_XSPLOT_NE] < 1)
    return;

  /* Check mpi task */

  if (mpiid > 0)
    return;

  /* Init random number sequence */
	      
  seed = ReInitRNG(0);
  SEED[0] = seed;
  
  /* Set filename */

  sprintf(tmpstr, "%s_xs%ld.m", GetText(DATA_PTR_INPUT_FNAME),
	  (long)RDB[DATA_BURN_STEP]);

  fprintf(out, "Creating XS plot file \"%s\"...\n", tmpstr);

  /* Open file for writing */

  if ((fp = fopen(tmpstr, "w")) == NULL)
    Die(FUNCTION_NAME, "Unable to open file for writing");
    
  /* Remember collision count */

  ptr = (long)RDB[DATA_PTR_COLLISION_COUNT];
  ncol = GetPrivateData(ptr, 0);
  
  /***************************************************************************/

  /***** Generate energy grid ************************************************/

  /* Boundaries and grid size */

  if (RDB[DATA_XSPLOT_EMIN] > 0.0)
    Emin = RDB[DATA_XSPLOT_EMIN];
  else
    Emin = RDB[DATA_NEUTRON_EMIN];

  if (RDB[DATA_XSPLOT_EMAX] > 0.0)
    Emax = RDB[DATA_XSPLOT_EMAX];
  else
    Emax = RDB[DATA_NEUTRON_EMAX];
  
  ne = (long)RDB[DATA_XSPLOT_NE];

  /* Generate array */

  E = MakeArray(Emin, Emax, ne, 2);

  /* Print array */

  fprintf(fp, "E = [\n");

  for (n = 0; n < ne; n++)
    fprintf(fp, "%1.5E\n", E[n]);

  fprintf(fp, "];\n\n");

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

  /***** Print microscopic cross sections ************************************/

  /* Loop over nuclides */

  nuc = (long)RDB[DATA_PTR_NUC0];
  while(nuc > VALID_PTR)
    {
      /* Check type */

      if ((long)RDB[nuc + NUCLIDE_TYPE] == NUCLIDE_TYPE_DOSIMETRY)
	{
	  /* Set name */
	  
	  sprintf(tmpstr, "i%s", GetText(nuc + NUCLIDE_PTR_NAME));
	  
	  if ((long)RDB[nuc + NUCLIDE_TYPE] != NUCLIDE_TYPE_DECAY)
	    tmpstr[strlen(tmpstr) - 4] = '_';
	  
	  /* Print reaction mt's */
	  
	  fprintf(fp, "%s_mt = [\n", tmpstr);
	  
	  /* Loop over reactions */

	  rea = (long)RDB[nuc + NUCLIDE_PTR_REA];
	  while (rea > VALID_PTR)
	    {
	      /* Print mt */
	      
	      fprintf(fp, "%4ld %% %s\n", (long)RDB[rea + REACTION_MT],
		      ReactionMT((long)RDB[rea + REACTION_MT])); 

	      /* Next */

	      rea = NextItem(rea);
	    }
	  
	  fprintf(fp, "];\n\n");
	
	  /* Print cross sections */
	  
	  fprintf(fp, "%s_xs = [\n", tmpstr);
	  
	  for (n = 0; n < ne; n++)
	    {
	      /* Loop over reactions */

	      rea = (long)RDB[nuc + NUCLIDE_PTR_REA];
	      while (rea > VALID_PTR)
		{
		  /* Get cross section */

		  if ((long)RDB[nuc + NUCLIDE_TYPE] == NUCLIDE_TYPE_PHOTON)
		    fprintf(fp, "%1.5E ", PhotonMicroXS(rea,  E[n], 0));
		  else
		    fprintf(fp, "%1.5E ", MicroXS(rea, E[n], 0));	      

		  /* 0K data */

		  if ((rea1 = (long)RDB[rea + REACTION_PTR_0K_DATA]) 
		      > VALID_PTR)
		    fprintf(fp, "%1.5E ", MicroXS(rea1, E[n], 0));

		  /* Majorant */

		  if ((rea1 = (long)RDB[rea + REACTION_PTR_TMP_MAJORANT]) 
		      > VALID_PTR)
		    fprintf(fp, "%1.5E ", MicroXS(rea1, E[n], 0));

		  /* Next reaction */

		  rea = NextItem(rea);
		}
	      
	      fprintf(fp, "\n");
	    }

	  fprintf(fp, "];\n\n");
	}
      else if (((long)RDB[nuc + NUCLIDE_TYPE] != NUCLIDE_TYPE_DECAY) ||
	       ((long)RDB[nuc + NUCLIDE_TYPE_FLAGS] & 
		NUCLIDE_FLAG_TRANSMU_DATA))
	{
	  /* Set name */

	  sprintf(tmpstr, "i%s", GetText(nuc + NUCLIDE_PTR_NAME));
	  
	  if ((long)RDB[nuc + NUCLIDE_TYPE] != NUCLIDE_TYPE_DECAY)
	    tmpstr[strlen(tmpstr) - 4] = '_';
	    
	  /* Print reaction mt's */
	  
	  fprintf(fp, "%s_mt = [\n", tmpstr);
	  
	  if ((long)RDB[nuc + NUCLIDE_TYPE] == NUCLIDE_TYPE_PHOTON)
	    fprintf(fp, "%4ld %% Total\n", (long)501);
	  else 
	    {
	      fprintf(fp, "%4ld %% Total\n", (long)1);
	      if ((long)RDB[nuc + NUCLIDE_PTR_SUM_ABSXS] > VALID_PTR)
		fprintf(fp, "%4ld %% Sum of absorption\n", (long)101);
	    }

	  if ((long)RDB[nuc + NUCLIDE_PTR_HEATPRODXS] > VALID_PTR)
	    fprintf(fp, "%4ld %% Heat production\n", (long)301);

	  if ((long)RDB[nuc + NUCLIDE_PTR_PHOTPRODXS] > VALID_PTR)
	    fprintf(fp, "%4ld %% Photon production\n", (long)202);

	  /* Pointer total xs */
	  
	  rea = (long)RDB[nuc + NUCLIDE_PTR_TOTXS];
	  CheckPointer(FUNCTION_NAME, "(rea)", DATA_ARRAY, rea);

	  if ((long)RDB[rea + REACTION_PTR_0K_DATA] > VALID_PTR)
	    fprintf(fp, "%4ld %% %s (0K)\n", 
		    (long)RDB[rea + REACTION_MT],
		    ReactionMT((long)RDB[rea + REACTION_MT])); 
	  
	  if ((long)RDB[rea + REACTION_PTR_TMP_MAJORANT] > VALID_PTR)
	    fprintf(fp, "%4ld %% %s (temperature Majorant)\n", 
		    (long)RDB[rea + REACTION_MT],
		    ReactionMT((long)RDB[rea + REACTION_MT])); 
	  
	  /* Pointer to partial list */
	  
	  ptr = (long)RDB[rea + REACTION_PTR_PARTIAL_LIST];
	  CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);
	  
	  /* Loop over partials */
	  
	  i = 0;
	  while ((rea = ListPtr(ptr, i++)) > VALID_PTR)
	    {
	      /* Pointer to reaction data */
	      
	      rea = (long)RDB[rea + RLS_DATA_PTR_REA];
	      CheckPointer(FUNCTION_NAME, "(rea)", DATA_ARRAY, rea);
	      
	      /* Print mt */
	      
	      fprintf(fp, "%4ld %% %s\n", (long)RDB[rea + REACTION_MT],
		      ReactionMT((long)RDB[rea + REACTION_MT])); 

	      if ((long)RDB[rea + REACTION_PTR_0K_DATA] > VALID_PTR)
		fprintf(fp, "%4ld %% %s (0K)\n", 
			(long)RDB[rea + REACTION_MT],
			ReactionMT((long)RDB[rea + REACTION_MT])); 

	      if ((long)RDB[rea + REACTION_PTR_TMP_MAJORANT] > VALID_PTR)
		fprintf(fp, "%4ld %% %s (temperature Majorant)\n", 
			(long)RDB[rea + REACTION_MT],
			ReactionMT((long)RDB[rea + REACTION_MT])); 
	    }
	  
	  fprintf(fp, "];\n\n");
	
	  /* Print cross sections */
	  
	  fprintf(fp, "%s_xs = [\n", tmpstr);
	  
	  for (n = 0; n < ne; n++)
	    {
	      /* Pointer to total xs */

	      rea = (long)RDB[nuc + NUCLIDE_PTR_TOTXS];
	      CheckPointer(FUNCTION_NAME, "(rea)", DATA_ARRAY, rea);
	      
	      /* Get cross section */

	      if ((long)RDB[nuc + NUCLIDE_TYPE] == NUCLIDE_TYPE_PHOTON)
		fprintf(fp, "%1.5E ", PhotonMicroXS(rea, E[n], 0));
	      else
		fprintf(fp, "%1.5E ", MicroXS(rea, E[n], 0));

	      /* Pointer to total absorption xs */

	      if ((rea1 = (long)RDB[nuc + NUCLIDE_PTR_SUM_ABSXS]) > VALID_PTR)
		fprintf(fp, "%1.5E ", MicroXS(rea1, E[n], 0));

	      /* Heat production */

	      if ((long)RDB[nuc + NUCLIDE_TYPE] == NUCLIDE_TYPE_PHOTON)
		{
		  ptr = (long)RDB[nuc + NUCLIDE_PTR_PHOTON_HEATPRODXS];
		  fprintf(fp, "%1.5E ", PhotonMicroXS(ptr, E[n], 0));
		}
	      else if ((ptr = (long)RDB[nuc + NUCLIDE_PTR_HEATPRODXS]) > 
		       VALID_PTR)
		fprintf(fp, "%1.5E ", MicroXS(ptr, E[n], 0));

	      /* Photon production */

	      if ((long)RDB[nuc + NUCLIDE_TYPE] == NUCLIDE_TYPE_TRANSPORT)
		if ((ptr = (long)RDB[nuc + NUCLIDE_PTR_PHOTPRODXS]) > VALID_PTR)
		  fprintf(fp, "%1.5E ", MicroXS(ptr, E[n], 0));

	      /* 0K data */

	      if ((rea1 = (long)RDB[rea + REACTION_PTR_0K_DATA]) 
		  > VALID_PTR)
		fprintf(fp, "%1.5E ", MicroXS(rea1, E[n], 0));
	      
	      /* Majorant */
	      
	      if ((rea1 = (long)RDB[rea + REACTION_PTR_TMP_MAJORANT]) 
		  > VALID_PTR)
		fprintf(fp, "%1.5E ", MicroXS(rea1, E[n], 0));

	      /* Pointer to partial list */
	      
	      ptr = (long)RDB[rea + REACTION_PTR_PARTIAL_LIST];
	      CheckPointer(FUNCTION_NAME, "(ptr)", DATA_ARRAY, ptr);
	      
	      /* Loop over partials */

	      i = 0;
	      while ((rea = ListPtr(ptr, i++)) > VALID_PTR)
		{
		  /* Pointer to reaction data */
		  
		  rea = (long)RDB[rea + RLS_DATA_PTR_REA];
		  CheckPointer(FUNCTION_NAME, "(rea)", DATA_ARRAY, rea);
		  
		  /* Get cross section */

		  if ((long)RDB[nuc + NUCLIDE_TYPE] == NUCLIDE_TYPE_PHOTON)
		    fprintf(fp, "%1.5E ", PhotonMicroXS(rea,  E[n], 0));
		  else
		    fprintf(fp, "%1.5E ", MicroXS(rea, E[n], 0));	      

		  /* 0K data */

		  if ((rea1 = (long)RDB[rea + REACTION_PTR_0K_DATA]) 
		      > VALID_PTR)
		    fprintf(fp, "%1.5E ", MicroXS(rea1, E[n], 0));

		  /* Majorant */

		  if ((rea1 = (long)RDB[rea + REACTION_PTR_TMP_MAJORANT]) 
		      > VALID_PTR)
		    fprintf(fp, "%1.5E ", MicroXS(rea1, E[n], 0));
		}
	      
	      fprintf(fp, "\n");
	    }

	  fprintf(fp, "];\n\n");

	  /* Print multi-group cross sections */

	  if ((long)RDB[DATA_OPTI_MG_MODE] == YES)
	    {	  
	      fprintf(fp, "%s_mg_xs = [\n", tmpstr);
	      
	      for (n = 0; n < ne; n++)
		{	  
		  /* Pointer total xs */
		  
		  rea = (long)RDB[nuc + NUCLIDE_PTR_TOTXS];
		  CheckPointer(FUNCTION_NAME, "(rea)", DATA_ARRAY, rea);
		  
		  /* Get cross section */
		  
		  fprintf(fp, "%1.5E ", MGXS(rea, E[n], -1, 0));
		  
		  fprintf(fp, "\n");
		}
	      
	      fprintf(fp, "];\n\n");
	    }
	}

      /* Next nuclide */

      nuc = NextItem(nuc);
    }

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

  /***** Print photon yields *************************************************/

  if ((long)RDB[DATA_PHOTON_PRODUCTION] == YES)
    {
      /* Loop over nuclides */

      nuc = (long)RDB[DATA_PTR_NUC0];
      while(nuc > VALID_PTR)
	{
	  /* Check if reactions exist */

	  if ((long)RDB[nuc + NUCLIDE_PTR_PHOTON_PROD] < VALID_PTR)
	    {
	      /* Next nuclide */

	      nuc = NextItem(nuc);
	      
	      /* Cycle loop */

	      continue;
	    }

	  /* Print mt's */
	  
	  sprintf(tmpstr, "i%s", GetText(nuc + NUCLIDE_PTR_NAME));
	  tmpstr[strlen(tmpstr) - 4] = '_';
	  fprintf(fp, "%s_pprod_mt = [\n", tmpstr);

	  /* Loop over reactions */

	  ptr = (long)RDB[nuc + NUCLIDE_PTR_PHOTON_PROD];
	  while (ptr > VALID_PTR)
	    {
	      fprintf(fp, "%ld\n", (long)RDB[ptr + PHOTON_PROD_MT]);
	      ptr = NextItem(ptr);
	    }

	  fprintf(fp, "];\n\n");

	  /* Print cross sections */
	  
	  sprintf(tmpstr, "i%s", GetText(nuc + NUCLIDE_PTR_NAME));
	  tmpstr[strlen(tmpstr) - 4] = '_';
	  fprintf(fp, "%s_pprod_xs = [\n", tmpstr);

	  for (n = 0; n < ne; n++)
	    {
	      /* Loop over reactions */
	      
	      ptr = (long)RDB[nuc + NUCLIDE_PTR_PHOTON_PROD];
	      while (ptr > VALID_PTR)
		{
		  rea1 = (long)RDB[ptr + PHOTON_PROD_PTR_PRODXS];
		  CheckPointer(FUNCTION_NAME, "(rea1)", DATA_ARRAY, rea1);

		  fprintf(fp, "%1.5E ", MicroXS(rea1, E[n], 0));
		  ptr = NextItem(ptr);
		}
	      fprintf(fp, "\n");
	    }

	  fprintf(fp, "];\n\n");

	  /* Next */

	  nuc = NextItem(nuc);
	}
    }

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

  /***** Print photon line spectra *******************************************/

  /* Loop over nuclides */

  nuc = (long)RDB[DATA_PTR_NUC0];
  while(nuc > VALID_PTR)
    {
      /* Check if line spectra exists */

      if ((ptr = (long)RDB[nuc + NUCLIDE_PTR_PHOTON_LINE_SPEC]) > VALID_PTR)
	{
	  /* Set name */
	  
	  sprintf(tmpstr, "i%s", GetText(nuc + NUCLIDE_PTR_NAME));

	  if ((long)RDB[nuc + NUCLIDE_TYPE] != NUCLIDE_TYPE_DECAY)
	    tmpstr[strlen(tmpstr) - 4] = '_';

	  /* Print spectra */
	  
	  fprintf(fp, "%s_pspec = [\n", tmpstr);
	  
	  while (ptr > VALID_PTR)
	    {
	      fprintf(fp, "%1.5E %1.5E\n", RDB[ptr + PHOTON_LINE_SPEC_E],
		      RDB[ptr + PHOTON_LINE_SPEC_RI]);

	      /* Next line */

	      ptr = NextItem(ptr);
	    }
	      
	  fprintf(fp, "];\n\n");
	}

      /* Next nuclide */

      nuc = NextItem(nuc);
    }

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

  /***** Print nubar data ****************************************************/

  /* Loop over nuclides */

  nuc = (long)RDB[DATA_PTR_NUC0];
  while(nuc > VALID_PTR)
    {
      /* Pointer to fission channel */

      if ((rea = (long)RDB[nuc + NUCLIDE_PTR_FISSXS]) > VALID_PTR)
	{
	  /* Set name */
	  
	  sprintf(tmpstr, "i%s", GetText(nuc + NUCLIDE_PTR_NAME));

	  if ((long)RDB[nuc + NUCLIDE_TYPE] != NUCLIDE_TYPE_DECAY)
	    tmpstr[strlen(tmpstr) - 4] = '_';

	  /* Print nubars */
	  
	  fprintf(fp, "%s_nu = [\n", tmpstr);
	  
	  for (n = 0; n < ne; n++)
	    {	  
	      /* Prompt nubar data */
	      
	      if ((ptr = (long)RDB[rea + REACTION_PTR_TNUBAR])> VALID_PTR)
		fprintf(fp, "%1.5f ", Nubar(ptr, E[n], 0));	      
	      
	      /* Delayed nubar data */
	      
	      if ((ptr = (long)RDB[rea + REACTION_PTR_DNUBAR])> VALID_PTR)
		fprintf(fp, "%1.5f ", Nubar(ptr, E[n], 0));	      

	      fprintf(fp, "\n");
	    }
	      
	  fprintf(fp, "];\n\n");
	}

      /* Next nuclide */

      nuc = NextItem(nuc);
    }

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

  /***** Print energy-dependent isomeric branching ratios ********************/

  /* Tää tehtiinkin eri tavalla */

#ifdef mmmmmmmmmmmmmmmmmmmmmm

  /* Loop over nuclides */

  nuc = (long)RDB[DATA_PTR_NUC0];
  while (nuc > VALID_PTR)
    {
      /* Check pointer to branching data */

      if ((long)RDB[nuc + NUCLIDE_BRA_TYPE] != BRA_TYPE_ENE)
	{
	  /* Next nuclide */

	  nuc = NextItem(nuc);

	  /* Cycle loop */

	  continue;
	}

      /* Set name */

      sprintf(tmpstr, "i%s", GetText(nuc + NUCLIDE_PTR_NAME));
      tmpstr[strlen(tmpstr) - 4] = '_';

      /* Print data */
	  
      fprintf(fp, "%s_bra = [\n", tmpstr);
      
      for (n = 0; n < ne; n++)
	{
	  /* Loop over reactions */

	  rea = (long)RDB[nuc + NUCLIDE_PTR_REA];
	  while (rea > VALID_PTR)
	    {
	      /* Check pointer to branching data */

	      if ((long)RDB[rea + REACTION_RFS] > 0)
		fprintf(fp, "%1.5E ", MicroXS(rea, E[n], 0));		

	      /* Next reaction */

	      rea = NextItem(rea);
	    }

	  fprintf(fp, "\n");

	}

      fprintf(fp, "];\n\n");
	      
      /* Next nuclide */

      nuc = NextItem(nuc);
    }

#endif

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

  /***** Print macroscopic cross sections ************************************/

  /* Loop over materials */

  mat = (long)RDB[DATA_PTR_M0];
  while(mat > VALID_PTR)
    {
      /* Set name */
	  
      sprintf(tmpstr, "m%s", GetText(mat + MATERIAL_PTR_NAME));
	  
      /* Print reaction mt's */
	  
      fprintf(fp, "%s_mt = [\n", tmpstr);

      if ((rea = (long)RDB[mat + MATERIAL_PTR_TOTXS]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
      if ((rea = (long)RDB[mat + MATERIAL_PTR_ELAXS]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
      if ((rea = (long)RDB[mat + MATERIAL_PTR_ABSXS]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
      if ((rea = (long)RDB[mat + MATERIAL_PTR_FISSXS]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
      if ((rea = (long)RDB[mat + MATERIAL_PTR_HEATTXS]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
      if ((rea = (long)RDB[mat + MATERIAL_PTR_PHOTPXS]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
      if ((rea = (long)RDB[mat + MATERIAL_PTR_NSF]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
      if ((rea = (long)RDB[mat + MATERIAL_PTR_INLPXS]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
      if ((rea = (long)RDB[mat + MATERIAL_PTR_TOTPHOTXS]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
      if ((rea = (long)RDB[mat + MATERIAL_PTR_HEATPHOTXS]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
      if ((rea = (long)RDB[mat + MATERIAL_PTR_TMP_MAJORANTXS]) > VALID_PTR)
	fprintf(fp, "%4ld\n", (long)RDB[rea + REACTION_MT]);
	  
      fprintf(fp, "];\n\n");
      
      /* Print cross sections */
	  
      fprintf(fp, "%s_xs = [\n", tmpstr);

      for (n = 0; n < ne; n++)
	{	
	  /* Add to counter */

	  ptr = (long)RDB[DATA_PTR_COLLISION_COUNT];
	  AddPrivateData(ptr, 1.0, 0);
	  
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_TOTXS]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", MacroXS(rea, E[n],0));
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_ELAXS]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", MacroXS(rea, E[n],0));
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_ABSXS]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", MacroXS(rea, E[n],0));
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_FISSXS]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", MacroXS(rea, E[n],0));
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_HEATTXS]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", MacroXS(rea, E[n],0));
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_PHOTPXS]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", MacroXS(rea, E[n],0));
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_NSF]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", MacroXS(rea, E[n],0));
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_INLPXS]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", MacroXS(rea, E[n],0));
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_TOTPHOTXS]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", PhotonMacroXS(rea, E[n], 0));
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_HEATPHOTXS]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", PhotonMacroXS(rea, E[n], 0));
	  if ((rea = (long)RDB[mat + MATERIAL_PTR_TMP_MAJORANTXS]) > VALID_PTR)
	    fprintf(fp, "%1.5E ", MacroXS(rea, E[n],0));

	  fprintf(fp, "\n");
	}

      fprintf(fp, "];\n\n");
      
      /* Next material */
      
      mat = NextItem(mat);
    }

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

  /***** Print multi-group macroscopic xs ************************************/

  /* Check mode */

  if ((long)RDB[DATA_OPTI_MG_MODE] == YES)
    {
      /* Loop over materials */

      mat = (long)RDB[DATA_PTR_M0];
      while(mat > VALID_PTR)
	{
	  /* Set name */
	  
	  sprintf(tmpstr, "m%s", GetText(mat + MATERIAL_PTR_NAME));
	  
	  /* Print cross sections */
	  
	  fprintf(fp, "%s_mg_xs = [\n", tmpstr);
	  
	  for (n = 0; n < ne; n++)
	    {	
	      if ((rea = (long)RDB[mat + MATERIAL_PTR_TOTXS]) > VALID_PTR)
		{
		  if ((ptr = (long)RDB[rea + REACTION_PTR_MGXS]) > VALID_PTR)
		    fprintf(fp, "%1.5E ", MGXS(rea, E[n], -1, 0));
		}
	      if ((rea = (long)RDB[mat + MATERIAL_PTR_ELAXS]) > VALID_PTR)
		{
		  if ((ptr = (long)RDB[rea + REACTION_PTR_MGXS]) > VALID_PTR)
		    fprintf(fp, "%1.5E ", MGXS(rea, E[n], -1, 0));
		}
	      if ((rea = (long)RDB[mat + MATERIAL_PTR_ABSXS]) > VALID_PTR)
		{
		  if ((ptr = (long)RDB[rea + REACTION_PTR_MGXS]) > VALID_PTR)
		    fprintf(fp, "%1.5E ", MGXS(rea, E[n], -1, 0));
		}
	      if ((rea = (long)RDB[mat + MATERIAL_PTR_FISSXS]) > VALID_PTR)
		{
		  if ((ptr = (long)RDB[rea + REACTION_PTR_MGXS]) > VALID_PTR)
		    fprintf(fp, "%1.5E ", MGXS(rea, E[n], -1, 0));
		}
	      if ((rea = (long)RDB[mat + MATERIAL_PTR_INLPXS]) > VALID_PTR)
		{
		  if ((ptr = (long)RDB[rea + REACTION_PTR_MGXS]) > VALID_PTR)
		    fprintf(fp, "%1.5E ", MGXS(rea, E[n], -1, 0));
		}	      
	      
	      fprintf(fp, "\n");
	    }
	  
	  fprintf(fp, "];\n\n");
	  
	  /* Next material */
	  
	  mat = NextItem(mat);
	}
    }

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

  /***** Print majorant ******************************************************/

  /* TODO: muuta tohon ne simulation moodit instead */

  if ((rea = (long)RDB[DATA_PTR_MAJORANT]) > VALID_PTR)
    {
      fprintf(fp, "majorant_xs = [\n");

      for (n = 0; n < ne; n++)
	fprintf(fp, "%1.5E\n", DTMajorant(PARTICLE_TYPE_NEUTRON, E[n],0));
	
      fprintf(fp, "];\n\n");
    }

  if ((rea = (long)RDB[DATA_PTR_PHOTON_MAJORANT]) > VALID_PTR)
    {
      fprintf(fp, "photon_majorant_xs = [\n");

      for (n = 0; n < ne; n++)
	fprintf(fp, "%1.5E\n", DTMajorant(PARTICLE_TYPE_GAMMA, E[n],0));
	
      fprintf(fp, "];\n\n");
    }

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

  /* Free memory */

  Mem(MEM_FREE, E);

  /* Close file */

  fclose(fp);

  /* Restore collision count */

  ptr = (long)RDB[DATA_PTR_COLLISION_COUNT];
  PutPrivateData(ptr, ncol, 0);

  /* Exit */
  
  fprintf(out, "OK.\n\n");
}
void CalculateEntropies()
{
  long nx, ny, nz, part, i, j, k, idx, ptr;
  double xmin, xmax, ymin, ymax, zmin, zmax, x, y, z, wgt, totw, totp;
  double *spt, *swg, entrp, entrw, sump, sumw;

  /* Check if entropies are calculated */

  if ((long)RDB[DATA_OPTI_ENTROPY_CALC] == NO)
    return;
  
  /* Get mesh size */

  nx = (long)RDB[DATA_ENTROPY_NX];
  ny = (long)RDB[DATA_ENTROPY_NY];
  nz = (long)RDB[DATA_ENTROPY_NZ];

  /* Check values */

  CheckValue(FUNCTION_NAME, "nx", "", nx, 1, 500);
  CheckValue(FUNCTION_NAME, "ny", "", ny, 1, 500);
  CheckValue(FUNCTION_NAME, "nz", "", nz, 1, 500);

  /* Get boundaries */

  xmin = RDB[DATA_ENTROPY_XMIN];
  xmax = RDB[DATA_ENTROPY_XMAX];
  ymin = RDB[DATA_ENTROPY_YMIN];
  ymax = RDB[DATA_ENTROPY_YMAX];
  zmin = RDB[DATA_ENTROPY_ZMIN];
  zmax = RDB[DATA_ENTROPY_ZMAX];

  /* Check values */

  CheckValue(FUNCTION_NAME, "xmin", "", xmin, -INFTY, INFTY);
  CheckValue(FUNCTION_NAME, "xmax", "", xmax, -INFTY, INFTY);
  CheckValue(FUNCTION_NAME, "ymin", "", ymin, -INFTY, INFTY);
  CheckValue(FUNCTION_NAME, "ymax", "", ymax, -INFTY, INFTY);
  CheckValue(FUNCTION_NAME, "zmin", "", zmin, -INFTY, INFTY);
  CheckValue(FUNCTION_NAME, "zmax", "", zmax, -INFTY, INFTY);

  /* Check order */

  if (xmin > xmax)
    Die(FUNCTION_NAME, "Error in boundaries");

  if (ymin > ymax)
    Die(FUNCTION_NAME, "Error in boundaries");

  if (zmin > zmax)
    Die(FUNCTION_NAME, "Error in boundaries");

  /* Allocate memory for temporary arrays  */

  spt = (double *)Mem(MEM_ALLOC, nx*ny*nz, sizeof(double));
  swg = (double *)Mem(MEM_ALLOC, nx*ny*nz, sizeof(double));

  /* Reset data */

  memset(spt, 0.0, nx*ny*nz*sizeof(double));
  memset(swg, 0.0, nx*ny*nz*sizeof(double));
  
  /* Reset totals */

  totw = 0.0;
  totp = 0.0;

  /* Pointer to first item after dummy */

  part = (long)RDB[DATA_PART_PTR_SOURCE];
  part = NextItem(part);

  /* Loop over source and collect points */

  while(part > VALID_PTR)
    {
      /* Get coordinates and weight */

      x = RDB[part + PARTICLE_X];
      y = RDB[part + PARTICLE_Y];
      z = RDB[part + PARTICLE_Z];

      wgt = RDB[part + PARTICLE_WGT];

      /* Get local normalised co-ordinates */
      
      if (xmin != xmax)
	x = (x - xmin)/(xmax - xmin);
      else
	x = 0.0;
      
      if (ymin != ymax)
	y = (y - ymin)/(ymax - ymin);
      else
	y = 0.0;

      if (zmin != zmax)
	z = (z - zmin)/(zmax - zmin);
      else
	z = 0.0;

      /* Check */

      if ((x >= 0.0) && (x < 1.0) && (y >= 0.0) && (y < 1.0) &&
	  (z >= 0.0) && (z < 1.0))
	{
	  /* Calculate indexes */
      
	  i = (long)(x*nx);
	  j = (long)(y*ny);
	  k = (long)(z*nz);

	  /* Calculate index */

	  idx = i + nx*j + nx*ny*k;

	  /* Add points and weight */

	  spt[idx] = spt[idx] + 1.0;
	  swg[idx] = swg[idx] + wgt;
	  
	  /* Add to totals */

	  totp = totp + 1.0;
	  totw = totw + wgt;
	}

      /* Next particle */

      part = NextItem(part);
    }

  /* X-component of entropy */
  
  entrp = 0.0;
  entrw = 0.0;

  for (i = 0; i < nx; i++)
    {
      /* Sum over values */
      
      sump = 0.0;
      sumw = 0.0;
      
      for (j = 0; j < ny; j++)
	for (k = 0; k < nz; k++)
	  {
	    /* Calculate index */
	    
	    idx = i + nx*j + nx*ny*k;
	  
	    /* Add to sums */

	    sump = sump + spt[idx]/totp;
	    sumw = sumw + swg[idx]/totw;
	  }

      /* Add to entropies */

      if ((sump > 0.0) && (sump < 1.0))
	entrp = entrp - sump*log2(sump);

      if ((sumw > 0.0) && (sumw < 1.0))
	entrw = entrw - sumw*log2(sumw);
    }
  
  /* Divide by uniform source entropy */
  
  if (nx > 1)
    {
      entrp = entrp/log2(nx);
      entrw = entrw/log2(nx);
    }

  /* Add to statistics */

  ptr = (long)RDB[DATA_ENTROPY_PTR_SPT_STAT];  
  AddStat(entrp, ptr, 1);

  ptr = (long)RDB[DATA_ENTROPY_PTR_SWG_STAT];  
  AddStat(entrw, ptr, 1);

  /* Y-component of entropy */
  
  entrp = 0.0;
  entrw = 0.0;

  for (j = 0; j < ny; j++)
    {
      /* Sum over values */
      
      sump = 0.0;
      sumw = 0.0;

      for (i = 0; i < nx; i++)
	for (k = 0; k < nz; k++)
	  {
	    /* Calculate index */
	    
	    idx = i + nx*j + nx*ny*k;
	  
	    /* Add to sums */

	    sump = sump + spt[idx]/totp;
	    sumw = sumw + swg[idx]/totw;
	  }

      /* Add to entropies */

      if ((sump > 0.0) && (sump < 1.0))
	entrp = entrp - sump*log2(sump);

      if ((sumw > 0.0) && (sumw < 1.0))
	entrw = entrw - sumw*log2(sumw);
    }
  
  /* Divide by uniform source entropy */
  
  if (ny > 1)
    {
      entrp = entrp/log2(ny);
      entrw = entrw/log2(ny);
    }

  /* Add to statistics */

  ptr = (long)RDB[DATA_ENTROPY_PTR_SPT_STAT];  
  AddStat(entrp, ptr, 2);

  ptr = (long)RDB[DATA_ENTROPY_PTR_SWG_STAT];  
  AddStat(entrw, ptr, 2);

  /* Z-component of entropy */
  
  entrp = 0.0;
  entrw = 0.0;

  for (k = 0; k < nz; k++)
    {
      /* Sum over values */
      
      sump = 0.0;
      sumw = 0.0;

      for (i = 0; i < nx; i++)
	for (j = 0; j < ny; j++)
	  {
	    /* Calculate index */
	    
	    idx = i + nx*j + nx*ny*k;
	  
	    /* Add to sums */

	    sump = sump + spt[idx]/totp;
	    sumw = sumw + swg[idx]/totw;
	  }

      /* Add to entropies */

      if ((sump > 0.0) && (sump < 1.0))
	entrp = entrp - sump*log2(sump);

      if ((sumw > 0.0) && (sumw < 1.0))
	entrw = entrw - sumw*log2(sumw);
    }
  
  /* Divide by uniform source entropy */
  
  if (nz > 1)
    {
      entrp = entrp/log2(nz);
      entrw = entrw/log2(nz);
    }

  /* Add to statistics */

  ptr = (long)RDB[DATA_ENTROPY_PTR_SPT_STAT];  
  AddStat(entrp, ptr, 3);

  ptr = (long)RDB[DATA_ENTROPY_PTR_SWG_STAT];  
  AddStat(entrw, ptr, 3);

  /* Total entropy */
  
  entrp = 0.0;
  entrw = 0.0;

  /* Loop over values */
      
  for (i = 0; i < nx; i++)
    for (j = 0; j < ny; j++)
      for (k = 0; k < nz; k++)
	{
	  /* Calculate index */
	  
	  idx = i + nx*j + nx*ny*k;
	  
	  /* Get value */

	    sump = spt[idx]/totp;
	    sumw = swg[idx]/totw;
	    
	    /* Add to entropies */

	    if ((sump > 0.0) && (sump < 1.0))
	      entrp = entrp - sump*log2(sump);
	    
	    if ((sumw > 0.0) && (sumw < 1.0))
	      entrw = entrw - sumw*log2(sumw);
	}
  
  /* Divide by uniform source entropy */
  
  if (nx*ny*nz > 1)
    {
      entrp = entrp/log2(nx*ny*nz);
      entrw = entrw/log2(nx*ny*nz);
    }

  /* Add to statistics */

  ptr = (long)RDB[DATA_ENTROPY_PTR_SPT_STAT];  
  AddStat(entrp, ptr, 0);

  ptr = (long)RDB[DATA_ENTROPY_PTR_SWG_STAT];  
  AddStat(entrw, ptr, 0);

  /* Free temporary arrays */

  Mem(MEM_FREE, spt);
  Mem(MEM_FREE, swg);
}
Example #21
0
/*!
  \todo better zero copy handling
*/
filepos_t KaxInternalBlock::ReadData(IOCallback & input, ScopeMode ReadFully)
{
  filepos_t Result;

  FirstFrameLocation = input.getFilePointer(); // will be updated accordingly below

  SetValueIsSet(false);

  try {
    if (ReadFully == SCOPE_ALL_DATA) {
      Result = EbmlBinary::ReadData(input, ReadFully);
      if (Result != GetSize())
        throw SafeReadIOCallback::EndOfStreamX(GetSize() - Result);

      binary *BufferStart = EbmlBinary::GetBuffer();

      SafeReadIOCallback Mem(*this);
      uint8 BlockHeadSize = 4;

      // update internal values
      TrackNumber = Mem.GetUInt8();
      if ((TrackNumber & 0x80) == 0) {
        // there is extra data
        if ((TrackNumber & 0x40) == 0) {
          // We don't support track numbers that large !
          throw SafeReadIOCallback::EndOfStreamX(0);
        }
        TrackNumber = (TrackNumber & 0x3F) << 8;
        TrackNumber += Mem.GetUInt8();
        BlockHeadSize++;
      } else {
        TrackNumber &= 0x7F;
      }

      LocalTimecode = int16(Mem.GetUInt16BE());
      bLocalTimecodeUsed = true;

      uint8 Flags = Mem.GetUInt8();
      if (EbmlId(*this) == EBML_ID(KaxSimpleBlock)) {
        bIsKeyframe = (Flags & 0x80) != 0;
        bIsDiscardable = (Flags & 0x01) != 0;
      }
      mInvisible = (Flags & 0x08) >> 3;
      mLacing = LacingType((Flags & 0x06) >> 1);

      // put all Frames in the list
      if (mLacing == LACING_NONE) {
        FirstFrameLocation += Mem.GetPosition();
        DataBuffer * soloFrame = new DataBuffer(BufferStart + Mem.GetPosition(), GetSize() - BlockHeadSize);
        myBuffers.push_back(soloFrame);
        SizeList.resize(1);
        SizeList[0] = GetSize() - BlockHeadSize;
      } else {
        // read the number of frames in the lace
        uint32 LastBufferSize = GetSize() - BlockHeadSize - 1; // 1 for number of frame
        uint8 FrameNum = Mem.GetUInt8(); // number of frames in the lace - 1
        // read the list of frame sizes
        uint8 Index;
        int32 FrameSize;
        uint32 SizeRead;
        uint64 SizeUnknown;

        SizeList.resize(FrameNum + 1);

        switch (mLacing) {
          case LACING_XIPH:
            for (Index=0; Index<FrameNum; Index++) {
              // get the size of the frame
              FrameSize = 0;
              uint8 Value;
              do {
                Value = Mem.GetUInt8();
                FrameSize += Value;
                LastBufferSize--;
              } while (Value == 0xFF);
              SizeList[Index] = FrameSize;
              LastBufferSize -= FrameSize;
            }
            SizeList[Index] = LastBufferSize;
            break;
          case LACING_EBML:
            SizeRead = LastBufferSize;
            FrameSize = ReadCodedSizeValue(BufferStart + Mem.GetPosition(), SizeRead, SizeUnknown);
            SizeList[0] = FrameSize;
            Mem.Skip(SizeRead);
            LastBufferSize -= FrameSize + SizeRead;

            for (Index=1; Index<FrameNum; Index++) {
              // get the size of the frame
              SizeRead = LastBufferSize;
              FrameSize += ReadCodedSizeSignedValue(BufferStart + Mem.GetPosition(), SizeRead, SizeUnknown);
              SizeList[Index] = FrameSize;
              Mem.Skip(SizeRead);
              LastBufferSize -= FrameSize + SizeRead;
            }
            if (Index <= FrameNum) // Safety check if FrameNum == 0
              SizeList[Index] = LastBufferSize;
            break;
          case LACING_FIXED:
            for (Index=0; Index<=FrameNum; Index++) {
              // get the size of the frame
              SizeList[Index] = LastBufferSize / (FrameNum + 1);
            }
            break;
          default: // other lacing not supported
            assert(0);
        }

        FirstFrameLocation += Mem.GetPosition();

        for (Index=0; Index<=FrameNum; Index++) {
          DataBuffer * lacedFrame = new DataBuffer(BufferStart + Mem.GetPosition(), SizeList[Index]);
          myBuffers.push_back(lacedFrame);
          Mem.Skip(SizeList[Index]);
        }
      }

      binary *BufferEnd = BufferStart + GetSize();
      size_t NumFrames  = myBuffers.size();

      // Sanity checks for frame pointers and boundaries.
      for (size_t Index = 0; Index < NumFrames; ++Index) {
        binary *FrameStart  = myBuffers[Index]->Buffer();
        binary *FrameEnd    = FrameStart + myBuffers[Index]->Size();
        binary *ExpectedEnd = (Index + 1) < NumFrames ? myBuffers[Index + 1]->Buffer() : BufferEnd;

        if ((FrameStart < BufferStart) || (FrameEnd > BufferEnd) || (FrameEnd != ExpectedEnd))
          throw SafeReadIOCallback::EndOfStreamX(0);
      }

      SetValueIsSet();
    } else if (ReadFully == SCOPE_PARTIAL_DATA) {
      binary _TempHead[5];
      Result = input.read(_TempHead, 5);
      if (Result != 5)
        throw SafeReadIOCallback::EndOfStreamX(0);
      binary *cursor = _TempHead;
      binary *_tmpBuf;
      uint8 BlockHeadSize = 4;

      // update internal values
      TrackNumber = *cursor++;
      if ((TrackNumber & 0x80) == 0) {
        // there is extra data
        if ((TrackNumber & 0x40) == 0) {
          // We don't support track numbers that large !
          return Result;
        }
        TrackNumber = (TrackNumber & 0x3F) << 8;
        TrackNumber += *cursor++;
        BlockHeadSize++;
      } else {
        TrackNumber &= 0x7F;
      }

      big_int16 b16;
      b16.Eval(cursor);
      LocalTimecode = int16(b16);
      bLocalTimecodeUsed = true;
      cursor += 2;

      if (EbmlId(*this) == EBML_ID(KaxSimpleBlock)) {
        bIsKeyframe = (*cursor & 0x80) != 0;
        bIsDiscardable = (*cursor & 0x01) != 0;
      }
      mInvisible = (*cursor & 0x08) >> 3;
      mLacing = LacingType((*cursor++ & 0x06) >> 1);
      if (cursor == &_TempHead[4]) {
        _TempHead[0] = _TempHead[4];
      } else {
        Result += input.read(_TempHead, 1);
      }

      FirstFrameLocation += cursor - _TempHead;

      // put all Frames in the list
      if (mLacing != LACING_NONE) {
        // read the number of frames in the lace
        uint32 LastBufferSize = GetSize() - BlockHeadSize - 1; // 1 for number of frame
        uint8 FrameNum = _TempHead[0]; // number of frames in the lace - 1
        // read the list of frame sizes
        uint8 Index;
        int32 FrameSize;
        uint32 SizeRead;
        uint64 SizeUnknown;

        SizeList.resize(FrameNum + 1);

        switch (mLacing) {
          case LACING_XIPH:
            for (Index=0; Index<FrameNum; Index++) {
              // get the size of the frame
              FrameSize = 0;
              do {
                Result += input.read(_TempHead, 1);
                FrameSize += uint8(_TempHead[0]);
                LastBufferSize--;

                FirstFrameLocation++;
              } while (_TempHead[0] == 0xFF);

              FirstFrameLocation++;
              SizeList[Index] = FrameSize;
              LastBufferSize -= FrameSize;
            }
            SizeList[Index] = LastBufferSize;
            break;
          case LACING_EBML:
            SizeRead = LastBufferSize;
            cursor = _tmpBuf = new binary[FrameNum*4]; /// \warning assume the mean size will be coded in less than 4 bytes
            Result += input.read(cursor, FrameNum*4);
            FrameSize = ReadCodedSizeValue(cursor, SizeRead, SizeUnknown);
            SizeList[0] = FrameSize;
            cursor += SizeRead;
            LastBufferSize -= FrameSize + SizeRead;

            for (Index=1; Index<FrameNum; Index++) {
              // get the size of the frame
              SizeRead = LastBufferSize;
              FrameSize += ReadCodedSizeSignedValue(cursor, SizeRead, SizeUnknown);
              SizeList[Index] = FrameSize;
              cursor += SizeRead;
              LastBufferSize -= FrameSize + SizeRead;
            }

            FirstFrameLocation += cursor - _tmpBuf;

            SizeList[Index] = LastBufferSize;
            delete [] _tmpBuf;
            break;
          case LACING_FIXED:
            for (Index=0; Index<=FrameNum; Index++) {
              // get the size of the frame
              SizeList[Index] = LastBufferSize / (FrameNum + 1);
            }
            break;
          default: // other lacing not supported
            assert(0);
        }
      } else {
        SizeList.resize(1);
        SizeList[0] = GetSize() - BlockHeadSize;
      }
      SetValueIsSet(false);
      Result = GetSize();
    } else {
Example #22
0
///////////////////////////////////////////////////////////////////////////////////////////////////
//应用程序读设备数据时(应用程序调用ReadFile函数),系统会调用此函数
NTSTATUS KadyUsbTestDevice::Read(KIrp I)
{
    NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;

	//声明变量,接收实际读取的字节数	
    ULONG dwBytesRead = 0;
	
	//URB
	PURB pUrb = NULL;
	
	//获取应用程序内存对象
	KMemory Mem(I.Mdl());

	//检查缓冲区长度
    ULONG dwTotalSize = I.ReadSize(CURRENT);				//应用程序要读取的字节数
	ULONG dwMaxSize = EndPoint1In.MaximumTransferSize();	//端点能传输的最大字节数
	if ( dwTotalSize > dwMaxSize )
	{
		//如果要读取的字节数超过端点的最大长度,则设置为最大长度
		ASSERT(dwMaxSize);
		dwTotalSize = dwMaxSize;
	}
	
	if(UsbdPipeTypeBulk == EndPoint2Out.Type())
	{
		pUrb = EndPoint1In.BuildBulkTransfer(
			Mem,		  //数据缓冲区
			dwTotalSize,  //要读取的字节数
			TRUE,         //输入
			NULL	      //下一个URB(无)
							);

	}
	else if(UsbdPipeTypeInterrupt == EndPoint2Out.Type())
	{
		pUrb = EndPoint1In.BuildInterruptTransfer(
			Mem,		  //数据缓冲区
			dwTotalSize,  //要读取的字节数
			TRUE,         //允许接收的字节数小于需求字节数
			NULL,	      //下一个URB(无)
			NULL,		  //当前USB(无,则创建新的)
			TRUE		  //读数据
													);
	}

	
	//判断创建URB是否成功
	if ( pUrb != NULL)
	{
		//设置为直接读取方式,允许接收字节数小于要求的字节数
		pUrb->UrbBulkOrInterruptTransfer.TransferFlags =
			(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK);
		
		//提交URB
        status = EndPoint1In.SubmitUrb(pUrb, NULL, NULL,1000);
		
		//获取实际读取的字节数
        if ( NT_SUCCESS(status) ) 
        {
			dwBytesRead = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;
		}
		
		delete pUrb;
	}
	
	//向应用程序返回实际读取的字节数
    I.Information() = dwBytesRead;

	//结束IRP操作
    return I.PnpComplete(this, status, IO_NO_INCREMENT);
}