Skip to content

Reply To: Rotating cuboid not working correctly in 1.8

OpenLB – Open Source Lattice Boltzmann Code Forums on OpenLB Bug Reports Rotating cuboid not working correctly in 1.8 Reply To: Rotating cuboid not working correctly in 1.8

#10393
upqdb
Participant

Hello,

When using the IndicatorRotate class, at the moment it is not possible to use the union and intersection operators. This, however can be solved by upcasting the IndicatorRotate to an IndicatorF2D when creating the pointer for the rotated geometry. I have added a comment in the following code.


  // ramp
  Vector<T, 2> straightCubeExtend(6.43, 1.85);
  Vector<T, 2> straightCubeOrigin;
  straightCubeOrigin[0] = 2;
  Vector<T, 2> tiltedCubeExtend(8.43, 1.27);
  Vector<T, 2> tiltedCubeOrigin;
  tiltedCubeOrigin[0] = 1;
  tiltedCubeOrigin[1] = 0;
  Vector<T, 2> lowerCubeExtend(6.43, .71);
  Vector<T, 2> lowerCubeOrigin;
  lowerCubeOrigin[0] = 2;
  std::shared_ptr<IndicatorCuboid2D<T>> straightCube(new IndicatorCuboid2D<T>(straightCubeExtend, straightCubeOrigin));
  IndicatorCuboid2D<T> tiltedCube(tiltedCubeExtend, tiltedCubeOrigin);

  auto                 rotX = tiltedCubeOrigin[0] + tiltedCubeExtend[0] / 2.0;
  auto                 rotY = tiltedCubeOrigin[1] + tiltedCubeExtend[1] / 2.0;
  Vector<T, 2>         rotationPoint(rotX, rotY);

  // Use IndicatorF2D as template argument for Pointer, thereby upcasting IndicatorRotate to IndicatorF2D
  std::shared_ptr<IndicatorF2D<T>> rotatedCube(new IndicatorRotate<T, 2>(rotationPoint, 0.174533, tiltedCube));
  std::shared_ptr<IndicatorCuboid2D<T>> lowerCube(new IndicatorCuboid2D<T>(lowerCubeExtend, lowerCubeOrigin));

  // * is intersection + is union
  std::shared_ptr<IndicatorF2D<T>> ramp((straightCube * rotatedCube) + lowerCube);

  // Set Material Numbers
  superGeometry.rename(0, 2, ramp);

  superGeometry.getStatistics().print();

This should result in the same geometry that you created in the 1.7 version.