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; }
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;} }