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;
189 auto latticeR = _cuboid.getFloorLatticeR(physC);
191 auto& block = _f.getBlockStructure();
192 auto padding = std::min(1, block.getPadding());
194 if (latticeR >= -padding && latticeR < block.getExtent()+padding-1) {
195 const int& locX = latticeR[0];
196 const int& locY = latticeR[1];
197 const int& locZ = latticeR[2];
200 Vector<T,3> physRiC = _cuboid.getPhysR({locX, locY, locZ});
203 Vector<W,3> d = (physCv - physRiC) * (1. / _cuboid.getDeltaR());
206 W output_tmp[_f.getTargetDim()];
207 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
208 output_tmp[iD] = W();
214 _f(output_tmp,latticeC);
215 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
216 output[iD] += output_tmp[iD] * e[0] * e[1] * e[2];
217 output_tmp[iD] = W();
221 latticeC[1] = locY + 1;
223 _f(output_tmp,latticeC);
224 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
225 output[iD] += output_tmp[iD] * e[0] * d[1] * e[2];
226 output_tmp[iD] = W();
229 latticeC[0] = locX + 1;
232 _f(output_tmp,latticeC);
233 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
234 output[iD] += output_tmp[iD] * d[0] * e[1] * e[2];
235 output_tmp[iD] = W();
238 latticeC[0] = locX + 1;
239 latticeC[1] = locY + 1;
241 _f(output_tmp,latticeC);
242 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
243 output[iD] += output_tmp[iD] * d[0] * d[1] * e[2];
244 output_tmp[iD] = W();
249 latticeC[2] = locZ + 1;
250 _f(output_tmp,latticeC);
251 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
252 output[iD] += output_tmp[iD] * e[0] * e[1] * d[2];
253 output_tmp[iD] = W();
257 latticeC[1] = locY + 1;
258 latticeC[2] = locZ + 1;
259 _f(output_tmp,latticeC);
260 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
261 output[iD] += output_tmp[iD] * e[0] * d[1] * d[2];
262 output_tmp[iD] = W();
265 latticeC[0] = locX + 1;
267 latticeC[2] = locZ + 1;
268 _f(output_tmp,latticeC);
269 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
270 output[iD] += output_tmp[iD] * d[0] * e[1] * d[2];
271 output_tmp[iD] = W();
274 latticeC[0] = locX + 1;
275 latticeC[1] = locY + 1;
276 latticeC[2] = locZ + 1;
277 _f(output_tmp,latticeC);
278 for (
int iD = 0; iD < _f.getTargetDim(); ++iD) {
279 output[iD] += output_tmp[iD] * d[0] * d[1] * d[2];
280 output_tmp[iD] = W();
314 const auto targetDim = _f.getTargetDim();
315 for (
int iD = 0; iD < targetDim; ++iD) {
320 if (
auto tmp = _cuboidDecomposition.getLatticeR(physC)) {
326 if (_communicateOverlap) {
327 _f.getSuperStructure().communicate();
332 const LoadBalancer<T>& load = _f.getSuperStructure().getLoadBalancer();
333 for (
int iC = 0; iC < load.
size(); ++iC) {
334 if (_blockF[iC]->
operator()(output, physC)) {
339 if (_communicateToAll) {
340#ifdef PARALLEL_MODE_MPI
342 for (
int iD = 0; iD < targetDim; ++iD) {
346 for (
int iD = 0; iD < targetDim; ++iD) {
347 output[iD]/=dataFound;
352 for (
int iD = 0; iD < targetDim; ++iD) {
353 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.