78 bool cornerXMYM_inside[1];
79 bool cornerXMYP_inside[1];
80 bool cornerXPYM_inside[1];
81 bool cornerXPYP_inside[1];
82 _blockGeometry.getPhysR(physR, {input[0], input[1]});
89 cornerXMYM[0] = physR[0] - 0.5*_converter.getPhysDeltaX();
90 cornerXMYM[1] = physR[1] - 0.5*_converter.getPhysDeltaX();
92 cornerXMYP[0] = physR[0] - 0.5*_converter.getPhysDeltaX();
93 cornerXMYP[1] = physR[1] + 0.5*_converter.getPhysDeltaX();
95 cornerXPYM[0] = physR[0] + 0.5*_converter.getPhysDeltaX();
96 cornerXPYM[1] = physR[1] - 0.5*_converter.getPhysDeltaX();
98 cornerXPYP[0] = physR[0] + 0.5*_converter.getPhysDeltaX();
99 cornerXPYP[1] = physR[1] + 0.5*_converter.getPhysDeltaX();
101 _indicator(cornerXMYM_inside, cornerXMYM);
102 _indicator(cornerXMYP_inside, cornerXMYP);
103 _indicator(cornerXPYM_inside, cornerXPYM);
104 _indicator(cornerXPYP_inside, cornerXPYP);
106 if ((cornerXMYM_inside[0] && cornerXMYP_inside[0] && cornerXPYM_inside[0] && cornerXPYP_inside[0]) ||
107 (!cornerXMYM_inside[0] && !cornerXMYP_inside[0] && !cornerXPYM_inside[0] && !cornerXPYP_inside[0]) ) {
109 if (cornerXMYM_inside[0]) {
114 if (!cornerXMYM_inside[0]) {
120 Vector<T,2> cornerXMYM_vec(physR[0] - 0.5*_converter.getPhysDeltaX(), physR[1] - 0.5*_converter.getPhysDeltaX());
121 Vector<T,2> cornerXPYP_vec(physR[0] + 0.5*_converter.getPhysDeltaX(), physR[1] + 0.5*_converter.getPhysDeltaX());
123 Vector<T,2> directionXP(_converter.getPhysDeltaX(), 0);
124 Vector<T,2> directionXM(-_converter.getPhysDeltaX(), 0);
125 Vector<T,2> directionYP(0, _converter.getPhysDeltaX());
126 Vector<T,2> directionYM(0, -_converter.getPhysDeltaX());
128 T distanceXP = 1.01 * _converter.getPhysDeltaX();
129 T distanceXM = 1.01 * _converter.getPhysDeltaX();
130 T distanceYP = 1.01 * _converter.getPhysDeltaX();
131 T distanceYM = 1.01 * _converter.getPhysDeltaX();
133 if ((cornerXMYM_inside[0] && !cornerXMYP_inside[0]) ||
134 (!cornerXMYM_inside[0] && cornerXMYP_inside[0]) ) {
135 _indicator.distance(distanceYP, cornerXMYM, directionYP);
138 if ((cornerXMYM_inside[0] && !cornerXPYM_inside[0]) ||
139 (!cornerXMYM_inside[0] && cornerXPYM_inside[0]) ) {
140 _indicator.distance(distanceXP, cornerXMYM, directionXP);
143 if ((cornerXPYP_inside[0] && !cornerXMYP_inside[0]) ||
144 (!cornerXPYP_inside[0] && cornerXMYP_inside[0]) ) {
145 _indicator.distance(distanceXM, cornerXPYP, directionXM);
148 if ((cornerXPYP_inside[0] && !cornerXPYM_inside[0]) ||
149 (!cornerXPYP_inside[0] && cornerXPYM_inside[0]) ) {
150 _indicator.distance(distanceYM, cornerXPYP, directionYM);
153 T volumeFraction = 0.0;
155 if (distanceXP < _converter.getPhysDeltaX() && distanceXM < _converter.getPhysDeltaX()) {
156 volumeFraction = distanceXP * _converter.getPhysDeltaX();
157 volumeFraction += 0.5 * (_converter.getPhysDeltaX() - distanceXM - distanceXP) * _converter.getPhysDeltaX();
158 volumeFraction /= _converter.getPhysDeltaX() * _converter.getPhysDeltaX();
159 if (!cornerXMYM_inside[0]) {
160 volumeFraction = 1.0 - volumeFraction;
164 if (distanceYP < _converter.getPhysDeltaX() && distanceYM < _converter.getPhysDeltaX()) {
165 volumeFraction = distanceYP * _converter.getPhysDeltaX();
166 volumeFraction += 0.5 * (_converter.getPhysDeltaX() - distanceYM - distanceYP) * _converter.getPhysDeltaX();
167 volumeFraction /= _converter.getPhysDeltaX() * _converter.getPhysDeltaX();
168 if (!cornerXMYM_inside[0]) {
169 volumeFraction = 1.0 - volumeFraction;
173 if (distanceXP < _converter.getPhysDeltaX() && distanceYP < _converter.getPhysDeltaX()) {
174 volumeFraction = 0.5 * distanceXP * distanceYP;
175 volumeFraction /= _converter.getPhysDeltaX() * _converter.getPhysDeltaX();
176 if (!cornerXMYM_inside[0]) {
177 volumeFraction = 1.0 - volumeFraction;
181 if (distanceXM < _converter.getPhysDeltaX() && distanceYM < _converter.getPhysDeltaX()) {
182 volumeFraction = 0.5 * distanceXM * distanceYM;
183 volumeFraction /= _converter.getPhysDeltaX() * _converter.getPhysDeltaX();
184 if (!cornerXPYP_inside[0]) {
185 volumeFraction = 1.0 - volumeFraction;
189 if (distanceXM < _converter.getPhysDeltaX() && distanceYP < _converter.getPhysDeltaX()) {
190 volumeFraction = 0.5 * (_converter.getPhysDeltaX() - distanceXM) * (_converter.getPhysDeltaX() - distanceYP);
191 volumeFraction /= _converter.getPhysDeltaX() * _converter.getPhysDeltaX();
192 if (!cornerXMYP_inside[0]) {
193 volumeFraction = 1.0 - volumeFraction;
197 if (distanceYM < _converter.getPhysDeltaX() && distanceXP < _converter.getPhysDeltaX()) {
198 volumeFraction = 0.5 * (_converter.getPhysDeltaX() - distanceXP) * (_converter.getPhysDeltaX() - distanceYM);
199 volumeFraction /= _converter.getPhysDeltaX() * _converter.getPhysDeltaX();
200 if (!cornerXPYM_inside[0]) {
201 volumeFraction = 1.0 - volumeFraction;
206 output[0] = volumeFraction;
209 output[0] = 1.0 - volumeFraction;