32 template<
unsigned int Dim>
37 template<
class T,
class FT,
class FT2>
39 grn = grnI[0] * hrsq[0] + grnI[1] * hrsq[1] + grnI[2] * hrsq[2];
40 grn = 1.0 /
sqrt(grn);
41 grn[0][0][0] = grn[0][0][1];
60 bcz_m = (bcz == std::string(
"PERIODIC"));
71 mesh_m(&beam.getMesh()),
72 layout_m(&beam.getFieldLayout()),
101 dksbase.freeMemory<
double>(tmpgreen_ptr, sizegreen);
102 dksbase.freeMemory<
double>(rho2_m_ptr, sizerho2_m);
103 dksbase.freeMemory< std::complex<double> >(grntr_m_ptr, sizecomp);
107 dksbase.freeMemory<
double>(rho2real_m_ptr, sizerho2_m);
108 dksbase.freeMemory< std::complex<double> >(rho2tr_m_ptr, sizecomp);
110 dksbase.closeHandle(rho2real_m_ptr);
125 for(
int d = 0; d < 3; ++ d) {
136 for (
int i = 0; i < 2; ++ i) {
146 for (
int i = 0; i < 2 * 3; ++ i) {
162 for (
int i = 0; i < 3; ++ i) {
168 for (
int i = 0; i < 2 * 3; ++ i) {
208 for (
int i = 0; i < 3; ++ i) {
219 tmpdomain = layout3_m->getDomain();
220 for (
int i = 0; i < 3; ++ i)
228 for (
int i = 0; i < 3; ++ i) {
241 dksbase.setAPI(
"Cuda", 4);
242 dksbase.setDevice(
"-gpu", 4);
243 dksbase.initDevice();
248 dksbase.createStream(streamGreens);
249 dksbase.createStream(streamFFT);
252 int dimsize[3] = {2*
nr_m[0], 2*
nr_m[1], 2*nr_m[2]};
254 dksbase.setupFFT(3, dimsize);
261 tmpgreen_ptr = dksbase.allocateMemory<
double>(sizegreen, dkserr);
262 rho2_m_ptr = dksbase.allocateMemory<
double>(sizerho2_m, dkserr);
263 rho2real_m_ptr = dksbase.allocateMemory<
double>(sizerho2_m, dkserr);
265 grntr_m_ptr = dksbase.allocateMemory< std::complex<double> >(sizecomp, dkserr);
266 rho2tr_m_ptr = dksbase.allocateMemory< std::complex<double> > (sizecomp, dkserr);
275 dksbase.createStream(streamFFT);
277 rho2real_m_ptr = dksbase.receivePointer(0,
Ippl::getComm(), dkserr);
386 dksbase.syncDevice();
394 int dimsize[3] = {2*
nr_m[0], 2*
nr_m[1], 2*nr_m[2]};
395 dksbase.callR2CFFT(rho2_m_ptr, grntr_m_ptr, 3, dimsize, streamGreens);
400 fft_m->transformDKSRC(-1,
rho2_m, rho2real_m_ptr, rho2tr_m_ptr, dksbase, streamFFT,
false);
409 dksbase.syncDevice();
410 dksbase.callMultiplyComplexFields(rho2tr_m_ptr, grntr_m_ptr, sizecomp);
416 fft_m->transformDKSCR(+1,
rho2_m, rho2real_m_ptr, rho2tr_m_ptr, dksbase);
421 "DKS not enabled during compilation");
472 for(
int k = idx[2].first(); k <= idx[2].last() + 1; k++) {
473 for(
int j = idx[1].first(); j <= idx[1].last() + 1; j++) {
474 for(
int i = idx[0].first(); i <= idx[0].last() + 1; i++) {
477 vv(0) = i * hr_m[0] - hr_m[0] / 2;
478 vv(1) = j * hr_m[1] - hr_m[1] / 2;
479 vv(2) = k * hr_m[2] - hr_m[2] / 2;
481 double r =
sqrt(vv(0) * vv(0) + vv(1) * vv(1) + vv(2) * vv(2));
482 double tmpgrn = -vv(2) * vv(2) *
atan(vv(0) * vv(1) / (vv(2) * r)) / 2;
483 tmpgrn += -vv(1) * vv(1) *
atan(vv(0) * vv(2) / (vv(1) * r)) / 2;
484 tmpgrn += -vv(0) * vv(0) *
atan(vv(1) * vv(2) / (vv(0) * r)) / 2;
485 tmpgrn += vv(1) * vv(2) *
log(vv(0) + r);
486 tmpgrn += vv(0) * vv(2) *
log(vv(1) + r);
487 tmpgrn += vv(0) * vv(1) *
log(vv(2) + r);
531 dksbase.callGreensIntegral(tmpgreen_ptr, idx[0].length(), idx[1].length(), idx[2].length(),
538 dksbase.callGreensIntegration(rho2_m_ptr, tmpgreen_ptr,
nr_m[0]+1,
nr_m[1]+1,
nr_m[2]+1,
541 dksbase.callMirrorRhoField(rho2_m_ptr,
nr_m[0],
nr_m[1],
nr_m[2], streamGreens);
554 for(
int k = idx[2].first(); k <= idx[2].last(); k++) {
555 for(
int j = idx[1].first(); j <= idx[1].last(); j++) {
556 for(
int i = idx[0].first(); i <= idx[0].last(); i++) {
559 vv(0) = i * hr_m[0] - hr_m[0] / 2;
560 vv(1) = j * hr_m[1] - hr_m[1] / 2;
561 vv(2) = k * hr_m[2] - hr_m[2] / 2 + zshift;
563 double r =
sqrt(vv(0) * vv(0) + vv(1) * vv(1) + vv(2) * vv(2));
564 double tmpgrn = -vv(2) * vv(2) *
atan(vv(0) * vv(1) / (vv(2) * r)) / 2;
565 tmpgrn += -vv(1) * vv(1) *
atan(vv(0) * vv(2) / (vv(1) * r)) / 2;
566 tmpgrn += -vv(0) * vv(0) *
atan(vv(1) * vv(2) / (vv(0) * r)) / 2;
567 tmpgrn += vv(1) * vv(2) *
log(vv(0) + r);
568 tmpgrn += vv(0) * vv(2) *
log(vv(1) + r);
569 tmpgrn += vv(0) * vv(1) *
log(vv(2) + r);
577 for(
int k = idx[2].first(); k <= idx[2].last(); k++) {
578 for(
int j = idx[1].first(); j <= idx[1].last(); j++) {
579 for(
int i = idx[0].first(); i <= idx[0].last(); i++) {
582 vv(0) = i * hr_m[0] - hr_m[0] / 2;
583 vv(1) = j * hr_m[1] - hr_m[1] / 2;
584 vv(2) = k * hr_m[2] - hr_m[2] / 2 + zshift -
nr_m[2] * hr_m[2];
586 double r =
sqrt(vv(0) * vv(0) + vv(1) * vv(1) + vv(2) * vv(2));
587 double tmpgrn = -vv(2) * vv(2) *
atan(vv(0) * vv(1) / (vv(2) * r)) / 2;
588 tmpgrn += -vv(1) * vv(1) *
atan(vv(0) * vv(2) / (vv(1) * r)) / 2;
589 tmpgrn += -vv(0) * vv(0) *
atan(vv(1) * vv(2) / (vv(0) * r)) / 2;
590 tmpgrn += vv(1) * vv(2) *
log(vv(0) + r);
591 tmpgrn += vv(0) * vv(2) *
log(vv(1) + r);
592 tmpgrn += vv(0) * vv(1) *
log(vv(2) + r);
594 grn2[i][j][k] = tmpgrn / cellVolume;
684 rho2_m[I ][J ][KE] = ggrn2[I ][J ][shiftedKE];
694 os <<
"* ************* F F T P o i s s o n S o l v e r ************************************ " <<
endl;
695 os <<
"* h " <<
hr_m <<
'\n';
696 os <<
"* ********************************************************************************** " <<
endl;
std::unique_ptr< Mesh_t > mesh2_m
Layout_t & getLayout() const
void shiftedIntGreensFunction(double zshift)
compute the shifted integrated Green function as described in Three-dimensional quasistatic model for...
The base class for all OPAL exceptions.
FFT< RCTransform, 3, double > FFT_t
std::unique_ptr< FieldLayout_t > layout4_m
CenteredFieldLayout< 3, Mesh_t, Center_t > FieldLayout_t
std::unique_ptr< Mesh_t > mesh3_m
Inform & print(Inform &os) const
BConds< Vector_t, 3, Mesh_t, Center_t > vbc_m
IpplTimings::TimerRef GreensFunctionTimer_m
static void calculate(Vektor< T, 3 > &hrsq, FT &grn, FT2 *grnI)
IpplTimings::TimerRef ComputePotential_m
NDIndex< 3 > domainFFTConstruct_m
Tps< T > log(const Tps< T > &x)
Natural logarithm.
void integratedGreensFunction()
compute the integrated Green function as described in Three-dimensional quasistatic model for high br...
e_dim_tag getRequestedDistribution(unsigned int d) const
std::unique_ptr< Mesh_t > mesh4_m
void integratedGreensFunctionDKS()
Uses DKS to offload the computation of Greens function on the GPU.
FFTPoissonSolver(PartBunch &bunch, std::string greensFuntion)
PETE_TUTree< FnArcTan, typename T::PETE_Expr_t > atan(const PETE_Expr< T > &l)
static void startTimer(TimerRef t)
PETE_TBTree< OpLT, Index::PETE_Expr_t, PETE_Scalar< double > > lt(const Index &idx, double x)
PETE_TTTree< OpWhere, typename Cond_t::PETE_Expr_t, typename True_t::PETE_Expr_t, PETE_Scalar< Vektor< T, Dim > > > where(const PETE_Expr< Cond_t > &c, const PETE_Expr< True_t > &t, const Vektor< T, Dim > &f)
BConds< double, 3, Mesh_t, Center_t > bc_m
for defining the boundary conditions
Vektor< double, 3 > Vector_t
static MPI_Comm getComm()
Tps< T > sqrt(const Tps< T > &x)
Square root.
MFLOAT get_meshSpacing(unsigned d) const
std::unique_ptr< FFT_t > fft_m
void initialize(Layout_t &)
static TimerRef getTimer(const char *nm)
static void stopTimer(TimerRef t)
void computePotentialDKS(Field_t &rho)
void computePotential(Field_t &rho, Vector_t hr, double zshift)
UniformCartesian< 3, double > Mesh_t
const NDIndex< Dim > & getDomain() const
std::unique_ptr< FieldLayout_t > layout3_m
std::unique_ptr< FieldLayout_t > layout2_m
Inform & endl(Inform &inf)