19#include "BDSArray4DCoordsTransformed.hh"
20#include "BDSArrayOperatorIndex.hh"
21#include "BDSArrayOperatorValue.hh"
22#include "BDSFieldValue.hh"
34 indexOperator(indexOperatorIn),
35 valueOperator(valueOperatorIn),
39BDSArray4DCoordsTransformed::~BDSArray4DCoordsTransformed()
53 G4double& tFrac)
const
59 auto x1 = (G4int)std::floor(xArrayCoords);
60 auto y1 = (G4int)std::floor(yArrayCoords);
61 auto z1 = (G4int)std::floor(zArrayCoords);
62 auto t1 = (G4int)std::floor(tArrayCoords);
63 xFrac = xArrayCoords - x1;
64 yFrac = yArrayCoords - y1;
65 zFrac = zArrayCoords - z1;
66 tFrac = tArrayCoords - t1;
68 std::array<G4int, 2> indexArrX = {x1, x1+1};
69 std::array<G4int, 2> indexArrY = {y1, y1+1};
70 std::array<G4int, 2> indexArrZ = {z1, z1+1};
71 std::array<G4int, 2> indexArrT = {t1, t1+1};
72 G4int indexOriginalX, indexOriginalY, indexOriginalZ, indexOriginalT;
73 G4int indexTransformedX, indexTransformedY, indexTransformedZ, indexTransformedT;
74 for (G4int i = 0; i < 2; i++)
76 for (G4int j = 0; j < 2; j++)
78 for (G4int k = 0; k < 2; k++)
80 for (G4int l = 0; l < 2; l++)
82 indexOriginalX = indexArrX[i];
83 indexTransformedX = indexOriginalX;
84 indexOriginalY = indexArrY[j];
85 indexTransformedY = indexOriginalY;
86 indexOriginalZ = indexArrZ[k];
87 indexTransformedZ = indexOriginalZ;
88 indexOriginalT = indexArrT[l];
89 indexTransformedT = indexOriginalT;
90 indexOperator->
Apply(indexTransformedX, indexTransformedY, indexTransformedZ, indexTransformedT);
91 BDSFieldValue v =
GetConst(indexTransformedX, indexTransformedY, indexTransformedZ, indexTransformedT);
92 localData[i][j][k][l] = valueOperator->
Apply(v, indexOriginalX, indexOriginalY, indexOriginalZ, indexOriginalT);
107 G4double& tFrac)
const
109 G4double xArrayCoords, yArrayCoords, zArrayCoords, tArrayCoords;
111 auto x1 = (G4int)std::floor(xArrayCoords);
112 auto y1 = (G4int)std::floor(yArrayCoords);
113 auto z1 = (G4int)std::floor(zArrayCoords);
114 auto t1 = (G4int)std::floor(tArrayCoords);
115 xFrac = xArrayCoords - x1;
116 yFrac = yArrayCoords - y1;
117 zFrac = zArrayCoords - z1;
118 tFrac = tArrayCoords - t1;
120 std::array<G4int, 4> indexArrX = {x1-1, x1, x1+1, x1+2};
121 std::array<G4int, 4> indexArrY = {y1-1, y1, y1+1, y1+2};
122 std::array<G4int, 4> indexArrZ = {z1-1, z1, z1+1, z1+2};
123 std::array<G4int, 4> indexArrT = {t1-1, t1, t1+1, t1+2};
124 G4int indexOriginalX, indexOriginalY, indexOriginalZ, indexOriginalT;
125 G4int indexTransformedX, indexTransformedY, indexTransformedZ, indexTransformedT;
126 for (G4int i = 0; i < 4; i++)
128 for (G4int j = 0; j < 4; j++)
130 for (G4int k = 0; k < 4; k++)
132 for (G4int l = 0; l < 4; l++)
134 indexOriginalX = indexArrX[i];
135 indexTransformedX = indexOriginalX;
136 indexOriginalY = indexArrY[j];
137 indexTransformedY = indexOriginalY;
138 indexOriginalZ = indexArrZ[k];
139 indexTransformedZ = indexOriginalZ;
140 indexOriginalT = indexArrT[l];
141 indexTransformedT = indexOriginalT;
142 indexOperator->
Apply(indexTransformedX, indexTransformedY, indexTransformedZ, indexTransformedT);
143 BDSFieldValue v =
GetConst(indexTransformedX, indexTransformedY, indexTransformedZ, indexTransformedT);
144 localData[i][j][k][l] = valueOperator->
Apply(v, indexOriginalX, indexOriginalY, indexOriginalZ, indexOriginalT);
160 G4int indexTransformedX = indexOriginalX;
161 G4int indexTransformedY = indexOriginalY;
162 G4int indexTransformedZ = indexOriginalZ;
163 G4int indexTransformedT = indexOriginalT;
164 indexOperator->
Apply(indexTransformedX, indexTransformedY, indexTransformedZ, indexTransformedT);
165 BDSFieldValue v =
GetConst(indexTransformedX, indexTransformedY, indexTransformedT, indexTransformedZ);
166 v = valueOperator->
Apply(v, indexOriginalX, indexOriginalY, indexOriginalZ, indexOriginalT);
172 out <<
"Spatial limits are the original ones" << G4endl;
173 out <<
"Array index operator: " << indexOperator->
Name() << G4endl;
174 out <<
"Array value operator: " << valueOperator->
Name() << G4endl;
Overlay of 4D array that provides uniform only spatial coordinate mapping.
virtual G4double ArrayCoordsFromX(G4double x) const
Not much point in being both virtual and inline (in our use case) but has to be virtual.
virtual std::ostream & Print(std::ostream &out) const
virtual G4int NearestY(G4double y) const
Not much point in being both virtual and inline (in our use case) but has to be virtual.
virtual G4double ArrayCoordsFromZ(G4double z) const
Not much point in being both virtual and inline (in our use case) but has to be virtual.
virtual G4int NearestX(G4double x) const
Not much point in being both virtual and inline (in our use case) but has to be virtual.
virtual G4double ArrayCoordsFromY(G4double y) const
Not much point in being both virtual and inline (in our use case) but has to be virtual.
virtual G4double ArrayCoordsFromT(G4double t) const
Not much point in being both virtual and inline (in our use case) but has to be virtual.
void ArrayCoordsFromXYZT(G4double &x, G4double &xArr, G4double &y, G4double &yArr, G4double &z, G4double &zArr, G4double &t, G4double &tArr) const
Utility version to forward to individual function.
virtual const BDSFieldValue & GetConst(G4int x, G4int y=0, G4int z=0, G4int t=0) const
Interface for modifying by reference array indices.
virtual G4String Name() const
Supply a name of this operator for feedback to the user in print out.
virtual void Apply(G4int &, G4int &, G4int &, G4int &) const
Interface for modifying field values.
virtual BDSFieldValue Apply(BDSFieldValue v, G4int, G4int=0, G4int=0, G4int=0) const
virtual G4String Name() const
Return a name of the operator for feedback to the user in print out.