56 for (
int i=0; i<3; i++) {
57 physCv[i] = origin[i] + (physC[i] - origin[i]) * ( _cuboid.getDeltaR() / _delta[i] );
61 for (
int i=0; i<3; i++) {
63 _cuboid.getDeltaR()), 0);
70 for (
int i=0; i<3; i++) {
71 latticeRv[i] = (T) latticeR[i];
73 physRiC = origin + latticeRv * _cuboid.getDeltaR();
74 T dr = 1. / _cuboid.getDeltaR();
77 d = (physCv - physRiC) * dr;
80 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
86 _f(output_tmp, latticeR);
87 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
88 output[iD] += output_tmp[iD] * e[0]*e[1]*e[2];
91 if (_cuboid.getNy() != 1) {
96 _f(output_tmp, latticeR);
97 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
98 output[iD] += output_tmp[iD] * e[0]*d[1]*e[2];
101 if (_cuboid.getNx() != 1) {
104 if (_cuboid.getNy() != 1) {
108 _f(output_tmp, latticeR);
109 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
110 output[iD] += output_tmp[iD] * d[0]*e[1]*e[2];
113 if (_cuboid.getNy() != 1) {
117 _f(output_tmp, latticeR);
118 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
119 output[iD] += output_tmp[iD] * d[0]*d[1]*e[2];
122 if (_cuboid.getNx() != 1) {
125 if (_cuboid.getNy() != 1) {
128 if (_cuboid.getNz() != 1) {
132 _f(output_tmp, latticeR);
133 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
134 output[iD] += output_tmp[iD] * e[0]*e[1]*d[2];
137 if (_cuboid.getNy() != 1) {
141 _f(output_tmp, latticeR);
142 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
143 output[iD] += output_tmp[iD] * e[0]*d[1]*d[2];
146 if (_cuboid.getNx() != 1) {
149 if (_cuboid.getNy() != 1) {
153 _f(output_tmp, latticeR);
154 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
155 output[iD] += output_tmp[iD] * d[0]*e[1]*d[2];
158 if (_cuboid.getNy() != 1) {
162 _f(output_tmp, latticeR);
163 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
164 output[iD] += output_tmp[iD] * d[0]*d[1]*d[2];
167 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
168 output[iD] *= _scale;
190 _cuboid.getFloorLatticeR(latticeR, physC);
192 auto& block = _f.getBlockStructure();
193 auto padding = std::min(1, block.getPadding());
196 const int& locX = latticeR[0];
197 const int& locY = latticeR[1];
198 const int& locZ = latticeR[2];
202 _cuboid.getPhysR(physRiC.
data(), {locX, locY, locZ});
205 Vector<W,3> d = (physCv - physRiC) * (1. / _cuboid.getDeltaR());
208 W output_tmp[_f.getTargetDim()];
209 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
210 output_tmp[iD] = W();
216 _f(output_tmp,latticeC);
217 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
218 output[iD] += output_tmp[iD] * e[0] * e[1] * e[2];
219 output_tmp[iD] = W();
223 latticeC[1] = locY + 1;
225 _f(output_tmp,latticeC);
226 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
227 output[iD] += output_tmp[iD] * e[0] * d[1] * e[2];
228 output_tmp[iD] = W();
231 latticeC[0] = locX + 1;
234 _f(output_tmp,latticeC);
235 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
236 output[iD] += output_tmp[iD] * d[0] * e[1] * e[2];
237 output_tmp[iD] = W();
240 latticeC[0] = locX + 1;
241 latticeC[1] = locY + 1;
243 _f(output_tmp,latticeC);
244 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
245 output[iD] += output_tmp[iD] * d[0] * d[1] * e[2];
246 output_tmp[iD] = W();
251 latticeC[2] = locZ + 1;
252 _f(output_tmp,latticeC);
253 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
254 output[iD] += output_tmp[iD] * e[0] * e[1] * d[2];
255 output_tmp[iD] = W();
259 latticeC[1] = locY + 1;
260 latticeC[2] = locZ + 1;
261 _f(output_tmp,latticeC);
262 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
263 output[iD] += output_tmp[iD] * e[0] * d[1] * d[2];
264 output_tmp[iD] = W();
267 latticeC[0] = locX + 1;
269 latticeC[2] = locZ + 1;
270 _f(output_tmp,latticeC);
271 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
272 output[iD] += output_tmp[iD] * d[0] * e[1] * d[2];
273 output_tmp[iD] = W();
276 latticeC[0] = locX + 1;
277 latticeC[1] = locY + 1;
278 latticeC[2] = locZ + 1;
279 _f(output_tmp,latticeC);
280 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
281 output[iD] += output_tmp[iD] * d[0] * d[1] * d[2];
282 output_tmp[iD] = W();
316 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
321 if (!_cuboidGeometry.getLatticeR(latticeR, physC)) {
325 if (_communicateOverlap) {
326 _f.getSuperStructure().communicate();
333 for (
int iC = 0; iC < load.
size(); ++iC) {
334 if (_blockF[iC]->
operator()(output, physC)) {
335 dataSize += _f.getTargetDim();
340 if (_communicateToAll) {
341#ifdef PARALLEL_MODE_MPI
345 dataSize /= dataFound;
346#ifdef PARALLEL_MODE_MPI
347 for (
int iD = 0; iD < dataSize; ++iD) {
351 for (
int iD = 0; iD < dataSize; ++iD) {
352 output[iD]/=dataFound;
357 dataSize /= dataFound;
358 for (
int iD = 0; iD < dataSize; ++iD) {
359 output[iD]/=dataFound;
SpecialAnalyticalFfromBlockF3D(BlockF3D< W > &f, Cuboid3D< T > &cuboid, Vector< T, 3 > delta, T scale=1.)
trilinear interpolation for rectangular lattice with dimensions delta[i]; if the cuboid is a plane (e...
void reduceAndBcast(T &reductVal, MPI_Op op, int root=0, MPI_Comm comm=MPI_COMM_WORLD)
Reduction operation, followed by a broadcast.