示例#1
0
static int srLoop(void* p_void)
{
	//SR.Send.SetIgorRadInputStruct((srTIgorRadInputStruct*)p_void);
	//return SR.ComputeSR_DirectOut();

	srTIgorRadInputStruct* pStr = (srTIgorRadInputStruct*)p_void;

	int iElecBeam = 0, iMagFld = 0, iWfrSmp = 0;
	srTSRWRadInData SRWRadInData;

	try
	{
		ProcErr(srTIgorSend::GetSRWRadInData(pStr->wRad, &SRWRadInData));

		double I, Neb, sElecBeam, Mom1Arr[6];
		ProcErr(srTIgorSend::GetElecBeamThin(pStr->wElectronBeam, I, Neb, Mom1Arr, sElecBeam));
		ProcErr(srElecBeamSet(&iElecBeam, I, Neb, Mom1Arr, 5, 0, 0, sElecBeam));

		ProcErr(srTIgorSend::GetAndSetMagFieldGen(&iMagFld, pStr->wField));
		ProcErr(srTIgorSend::GetAndSetWfrSampling(&iWfrSmp, pStr->wObservation));

		bool AllowAutoChoiceOfNxNzForPropag = true;
		double NxNzOversamplingParam = 1.;
		ProcErr(srTIgorSend::GetPrecParamWfrSamplingForPropag(pStr->wAuxParam, AllowAutoChoiceOfNxNzForPropag, NxNzOversamplingParam));

		int IntegMethNo = 2; 
		double RelPrecOrStep = 0.005, sStartInt = 0., sEndInt = 0.;
		bool ShowProgrIndic = true;
		//ProcErr(srTIgorSend::GetPrecParamElectricFieldComp(pStr->wIntPar, IntegMethNo, RelPrecOrStep, sStartInt, sEndInt));
		ProcErr(srTIgorSend::GetPrecParamElectricFieldComp(pStr->wIntPar, IntegMethNo, RelPrecOrStep, sStartInt, sEndInt, ShowProgrIndic));
		//srTParPrecElecFld PrecElecFld(IntegMethNo, RelPrecOrStep, sStartInt, sEndInt, NxNzOversamplingParam);
		srTParPrecElecFld PrecElecFld(IntegMethNo, RelPrecOrStep, sStartInt, sEndInt, NxNzOversamplingParam, ShowProgrIndic); //OC180312

		//int iWfr = 0;
		//ProcErr(srElecFldComp(&iWfr, iElecBeam, iMagFld, iWfrSmp, &PrecElecFld));
		ProcErr(srElecFldCompExt(&SRWRadInData, iElecBeam, iMagFld, iWfrSmp, &PrecElecFld));

		ProcErr(srTIgorSend::FinishWorkingWithSRWRadStruct(&SRWRadInData));
		DeleteObjects(iElecBeam, iMagFld, iWfrSmp);
	}
	catch(int ErrNo)
	{
		srTIgorSend::FinishWorkingWithSRWRadStruct(&SRWRadInData);
		DeleteObjects(iElecBeam, iMagFld, iWfrSmp);
		return ErrNo;
	}
	return 0;
}
示例#2
0
void srTRadIntThickBeam::ComputeTotalStokesDistrViaSingleElec(srTEbmDat* pElecBeam, srTMagFldTrUnif* pMagFldTrUnif, srTParPrecStokesArb* pPrcPar, srTStokesStructAccessData* pStokes)
{
	if(pMagFldTrUnif == 0) throw NO_MAG_FIELD_DEFINED;
    if((pElecBeam == 0) || (pPrcPar == 0)) throw INCORRECT_PARAMS_SR_COMP;
	if(pStokes == 0) throw NO_STOKES_STRUCTURE_SUPPLIED;
	
	srTEbmDat& OrigElecBeam = *pElecBeam;
	srTEbmDat LocElecBeam(OrigElecBeam);
	//CRandGen RandGen;
	CGenMathRand RandGen;

	LocElecBeam.SetNewEnergy(GetNextElecEnergyFromGausDistrib(OrigElecBeam, RandGen));
	srTTrjDat* pTrjDat = (srTTrjDat*)(pMagFldTrUnif->CreateAndSetupNewTrjDat(&LocElecBeam));
	//gAuxPar.Setup(*pElecBeam);
	
	srTWfrSmp* pWfrSmp = 0;
	srTSRWRadStructAccessData* pRad = CreateNewRadStructWithConstParams(pElecBeam, pTrjDat, pStokes, pWfrSmp);
	CHGenObj hRad(pRad);
	srTRadGenManip RadGenManip(hRad);
	srTRadInt RadInt;

	int IntegMethNo = 2; //Auto Wiggler
	double sEndInt = pTrjDat->sStart + (pTrjDat->LenFieldData - 1)*(pTrjDat->sStep);
	srTParPrecElecFld PrecElecFld(IntegMethNo, pPrcPar->RelPrecOrStep, pTrjDat->sStart, sEndInt, 0);

	int ExtractIntType = 1; // Multi-e intensity
	int ExtractPT = 3; // vs x & z
	if(pStokes->ne > 1) ExtractPT = 6;
	double xc = pStokes->xStart + 0.5*(pStokes->nx - 1)*(pStokes->xStep);
	double zc = pStokes->zStart + 0.5*(pStokes->nz - 1)*(pStokes->zStep);
	double ec = pStokes->eStart;

	//long AmOfAuxData = (pWfrSmp->nLamb)*(pWfrSmp->nx)*(pWfrSmp->nz);
	long long AmOfAuxData = ((long long)(pWfrSmp->nLamb))*((long long)(pWfrSmp->nx))*((long long)(pWfrSmp->nz));
	float* ArrAuxDataS0 = new float[AmOfAuxData];
	float* ArrAuxDataS1 = new float[AmOfAuxData];
	float* ArrAuxDataS2 = new float[AmOfAuxData];
	float* ArrAuxDataS3 = new float[AmOfAuxData];

	pStokes->ZeroStokesData();

	double RelPrecElecEn = pPrcPar->RelPrecOrStep;
	double ActualRelPrecIntens = 1E+23;
	//int iElecEn = 0;
	long long iElecEn = 0;

	//int MaxNumIter = 1000000;
	long long MaxNumIter = 1000000;
	if(pPrcPar->NumIter > 0)
	{
        MaxNumIter = pPrcPar->NumIter;
	}

	while(ActualRelPrecIntens > RelPrecElecEn)
	{
		if(ActualRelPrecIntens != 1E+23)
		{
            LocElecBeam.SetNewEnergy(GetNextElecEnergyFromGausDistrib(OrigElecBeam, RandGen));
			if(pTrjDat != 0) { delete pTrjDat; pTrjDat = 0;}
			pTrjDat = (srTTrjDat*)(pMagFldTrUnif->CreateAndSetupNewTrjDat(&LocElecBeam));
			pRad->EmulateElectronBeamStruct(LocElecBeam);
		}

        RadInt.ComputeElectricFieldFreqDomain(pTrjDat, pWfrSmp, &PrecElecFld, pRad);
        RadGenManip.ExtractRadiation(-1, ExtractIntType, ExtractPT, 0, ec, xc, zc, (char*)ArrAuxDataS0);
        RadGenManip.ExtractRadiation(-2, ExtractIntType, ExtractPT, 0, ec, xc, zc, (char*)ArrAuxDataS1);
        RadGenManip.ExtractRadiation(-3, ExtractIntType, ExtractPT, 0, ec, xc, zc, (char*)ArrAuxDataS2);
        RadGenManip.ExtractRadiation(-4, ExtractIntType, ExtractPT, 0, ec, xc, zc, (char*)ArrAuxDataS3);

		ActualRelPrecIntens = UpdateResultStokesData(ArrAuxDataS0, ArrAuxDataS1, ArrAuxDataS2, ArrAuxDataS3, pWfrSmp, iElecEn, pStokes);
		iElecEn++;
		if(iElecEn >= MaxNumIter) break;
	}

	if(pTrjDat != 0) { delete pTrjDat; pTrjDat = 0;}
	if(pWfrSmp != 0) { delete pWfrSmp; pWfrSmp = 0;}
	//if(pRad != 0) { delete pRad; pRad = 0;}

	if(ArrAuxDataS0 != 0) { delete ArrAuxDataS0; ArrAuxDataS0 = 0;}
	if(ArrAuxDataS1 != 0) { delete ArrAuxDataS1; ArrAuxDataS1 = 0;}
	if(ArrAuxDataS2 != 0) { delete ArrAuxDataS2; ArrAuxDataS2 = 0;}
	if(ArrAuxDataS3 != 0) { delete ArrAuxDataS3; ArrAuxDataS3 = 0;}
}