Вместо того что бы моделировать что не попадя в GEANT4, можно использовать его как калькулятор электромагнитных процессов.
Однако нужно учесть некоторые особенности, не смотря на то что мы ничего не собираемся симулировать, мы должны все равно совершить все шаманские действия по подготовке симуляции. Это связано с тем что ЭМ-калькулятор используется для внутренних расчетов и без инициализации сеанса симуляции работать не будет (Alexander Nozik - вот он явный пример ужаса geantовской архитектуры).
Соответственно мы создаем минимальную геометрию, пушку и физический лист и пользовательский класс по управлению сеансом (наследник G4UserRunAction). Именно в последнем и будет работать наш калькулятор. Так рекомендует делать пример extended/electromagnetic/TestEm0. Обращу внимание что нас интересуют не get методы (которые используются предрасчеты для конкретных объемов), а compute методы позволяющие определять сечения и dE/dx "на лету". Также для того чтобы калькулятор мог работать с поиском по материалам (то есть в том случае когда мы передаем в калькулятор не объект, описывающий материал, а строку-имя) нужно предварительно инстанцировать этот материал. Пример использования калькулятора приведен ниже:
void RunAction::BeginOfRunAction(const G4Run* aRun){ G4EmCalculator emCalculator; //создаем калькулятор G4Material* mat = G4NistManager::Instance()->FindOrBuildMaterial("G4_H"); //истанцируем водород cout<< mat->GetDensity()/ (gram/cm3)<<endl; double runwayEnergy = emCalculator->ComputeTotalDEDX(1*MeV, "e-", "G4_H");// считаем dE/dx для одномэвного электрона в водороде (поиск по имени элемента работает только потому что я создад водород раннее. // emCalculator->PrintDEDXTable(G4Electron::Definition()); cout<<"Runway energy: " << runwayEnergy/ (MeV/mm)<<endl; }
2 Comments
Alexander Nozik
Не очень понял, что ты с этим хочешь делать. Для расчета электромагнитных полей есть гораздо лучшие инструменты. Тот же Comsol.
Mihail Zelenyy
Это калькулятор сечение и ионизационных потерь.