Nektar++
Classes | Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes | List of all members
Nektar::FieldUtils::ProcessPhiFromFile Class Reference

#include <ProcessPhiFromFile.h>

Inheritance diagram for Nektar::FieldUtils::ProcessPhiFromFile:
[legend]

Classes

struct  STLobject
 STL file object. More...
 
struct  triangle
 Object representing a 3D triangle. More...
 

Public Member Functions

 ProcessPhiFromFile (FieldSharedPtr f)
 Set up ProcessPhiFromFile object. More...
 
virtual ~ProcessPhiFromFile ()
 
virtual void Process (po::variables_map &vm)
 
virtual std::string GetModuleName ()
 
virtual std::string GetModuleDescription ()
 
virtual ModulePriority GetModulePriority ()
 
- Public Member Functions inherited from Nektar::FieldUtils::ProcessModule
 ProcessModule ()
 
 ProcessModule (FieldSharedPtr p_f)
 
- Public Member Functions inherited from Nektar::FieldUtils::Module
FIELD_UTILS_EXPORT Module (FieldSharedPtr p_f)
 
virtual ~Module ()=default
 
const ConfigOptionGetConfigOption (const std::string &key) const
 
FIELD_UTILS_EXPORT void RegisterConfig (std::string key, std::string value="")
 Register a configuration option with a module. More...
 
FIELD_UTILS_EXPORT void PrintConfig ()
 Print out all configuration options for a module. More...
 
FIELD_UTILS_EXPORT void SetDefaults ()
 Sets default configuration options for those which have not been set. More...
 
FIELD_UTILS_EXPORT void AddFile (std::string fileType, std::string fileName)
 
FIELD_UTILS_EXPORT void EvaluateTriFieldAtEquiSpacedPts (LocalRegions::ExpansionSharedPtr &exp, const Array< OneD, const NekDouble > &infield, Array< OneD, NekDouble > &outfield)
 

Static Public Member Functions

static ModuleSharedPtr create (FieldSharedPtr f)
 Creates an instance of this class. More...
 

Static Public Attributes

static ModuleKey m_className
 ModuleKey for class. More...
 

Protected Member Functions

Array< OneD, NekDoubleReadVector (std::ifstream &in)
 Read one 3D vector from a STL file, starting from the next line of the input 'ifstream'. Numbers in ifstream are defined as 'float'. More...
 
STLobject ReadSTL (std::string filename)
 Read an STL binary file and returns a struct of type 'STLobject' containing the parsed data. More...
 
NekDouble PhiFunction (double dist, double coeff)
 Smoothing function for the SPM method given a distance value and a scaling coefficient. More...
 
void GetPhifromSession ()
 Assigns to 'phi' the values indicated by 'ShapeFunction'. More...
 
void GetPhifromSTL (const STLobject &file)
 Assigns to 'phi' the corresponding values of Phi. More...
 
bool CheckHit (const triangle &tri, const Array< OneD, NekDouble > &Origin, const Array< OneD, NekDouble > &Dvec, double &distance, double &u, double &v)
 Checks if a ray traced from 'Origin' with direction 'Dvec' hits the triangle defined by 'tri'. Returns the distance to the plane defined by 'tri' in any case. A negative distance means that the hit happened in the direction oposite that of the ray. Approach to calculate the intersection point found in: More...
 
void FindShortestDist (const STLobject &file, const Array< OneD, NekDouble > &x, double &dist)
 Calculates the shortest distance from a point \(x\) to the closed body contained in the STL file. More...
 
bool IsEqual (double x, double y, double relTol)
 Returns true if \(x=y\) within the relative tolerance 'relTol' (relative to 'y') More...
 
bool IsNegative (double x, double tol)
 Returns true if \(x<tol\). More...
 
Array< OneD, NekDoubleCross (const Array< OneD, NekDouble > &v0, const Array< OneD, NekDouble > &v1)
 Returns the cross product of vectors 'v0' y 'v1'. More...
 
Array< OneD, NekDoubleVector2edge (const Array< OneD, NekDouble > &x, const Array< OneD, NekDouble > &e1, const Array< OneD, NekDouble > &e2)
 Determines the shortest distance from a point 'x' to the segment defined by the points 'e1' and 'e2'. Note that this distance may be equal to that to one of the end points. The vector returned points towards the point 'x'. More...
 
- Protected Member Functions inherited from Nektar::FieldUtils::Module
 Module ()
 

Protected Attributes

Octree m_tree
 Octree object. More...
 
- Protected Attributes inherited from Nektar::FieldUtils::Module
std::map< std::string, ConfigOptionm_config
 List of configuration values. More...
 
std::set< std::string > m_allowedFiles
 List of allowed file formats. More...
 

Additional Inherited Members

- Public Attributes inherited from Nektar::FieldUtils::Module
FieldSharedPtr m_f
 Field object. More...
 

Detailed Description

Converter for STL files.

Definition at line 50 of file ProcessPhiFromFile.h.

Constructor & Destructor Documentation

◆ ProcessPhiFromFile()

Nektar::FieldUtils::ProcessPhiFromFile::ProcessPhiFromFile ( FieldSharedPtr  f)

Set up ProcessPhiFromFile object.

Definition at line 57 of file ProcessPhiFromFile.cpp.

57  : ProcessModule(f)
58 {
59  m_config["scale"] =
60  ConfigOption(false, "NotSet", "Scale coefficient for Phi.");
61  m_config["file"] =
62  ConfigOption(false, "NotSet", "File with the IB definition.");
63 }
std::map< std::string, ConfigOption > m_config
List of configuration values.
Definition: Module.h:228

References Nektar::FieldUtils::Module::m_config.

◆ ~ProcessPhiFromFile()

Nektar::FieldUtils::ProcessPhiFromFile::~ProcessPhiFromFile ( )
virtual

Definition at line 68 of file ProcessPhiFromFile.cpp.

69 {
70 }

Member Function Documentation

◆ CheckHit()

bool Nektar::FieldUtils::ProcessPhiFromFile::CheckHit ( const triangle tri,
const Array< OneD, NekDouble > &  Origin,
const Array< OneD, NekDouble > &  Dvec,
double &  distance,
double &  u,
double &  v 
)
protected

Checks if a ray traced from 'Origin' with direction 'Dvec' hits the triangle defined by 'tri'. Returns the distance to the plane defined by 'tri' in any case. A negative distance means that the hit happened in the direction oposite that of the ray. Approach to calculate the intersection point found in:

Fast, minimum storage ray/triangle intersection, Tomas Moeller, Ben Trumbore

Parameters
tri
Origin
Dvec
distance
u
v
Returns
true
false

Definition at line 368 of file ProcessPhiFromFile.cpp.

372 {
373  // Edge vectors
376  Vmath::Vsub(3, tri.v1, 1, tri.v0, 1, E1, 1);
377  Vmath::Vsub(3, tri.v2, 1, tri.v0, 1, E2, 1);
378 
379  // If det == 0, ray parallel to triangle
380  Array<OneD, NekDouble> Pvec = Cross(Dvec, E2);
381  double det = Vmath::Dot(3, Pvec, E1);
382  double inv_det = 1.0 / det;
383  if (IsEqual(0.0, det, 1e-10))
384  {
385  distance = numeric_limits<double>::max();
386  u = numeric_limits<double>::max();
387  v = numeric_limits<double>::max();
388  return false;
389  }
390 
391  // Vector T and parameter u = (0.0, 1.0)
392  Array<OneD, NekDouble> Tvec(3);
393  Vmath::Vsub(3, Origin, 1, tri.v0, 1, Tvec, 1);
394  u = Vmath::Dot(3, Pvec, Tvec) * inv_det;
395 
396  // Vector Q and parameter v = (0.0, 1.0)
397  Array<OneD, NekDouble> Qvec = Cross(Tvec, E1);
398  v = Vmath::Dot(3, Qvec, Dvec) * inv_det;
399 
400  // There is a hit if (u,v) coordinates are bounded
401  distance = Vmath::Dot(3, Qvec, E2) * inv_det;
402  if ((u < 0.0 || u > 1.0) || (v < 0.0 || u + v > 1.0))
403  {
404  return false;
405  }
406  else
407  {
408  return true;
409  }
410 }
Array< OneD, NekDouble > Cross(const Array< OneD, NekDouble > &v0, const Array< OneD, NekDouble > &v1)
Returns the cross product of vectors 'v0' y 'v1'.
bool IsEqual(double x, double y, double relTol)
Returns true if within the relative tolerance 'relTol' (relative to 'y')
T Dot(int n, const T *w, const T *x)
vvtvp (vector times vector times vector): z = w*x*y
Definition: Vmath.cpp:1100
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
Definition: Vmath.cpp:419

References Cross(), Vmath::Dot(), IsEqual(), Nektar::FieldUtils::ProcessPhiFromFile::triangle::v0, Nektar::FieldUtils::ProcessPhiFromFile::triangle::v1, Nektar::FieldUtils::ProcessPhiFromFile::triangle::v2, and Vmath::Vsub().

Referenced by FindShortestDist().

◆ create()

static ModuleSharedPtr Nektar::FieldUtils::ProcessPhiFromFile::create ( FieldSharedPtr  f)
inlinestatic

Creates an instance of this class.

Definition at line 54 of file ProcessPhiFromFile.h.

55  {
57  }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr().

◆ Cross()

Array< OneD, NekDouble > Nektar::FieldUtils::ProcessPhiFromFile::Cross ( const Array< OneD, NekDouble > &  v0,
const Array< OneD, NekDouble > &  v1 
)
protected

Returns the cross product of vectors 'v0' y 'v1'.

Parameters
v0
v1
Returns
Array<OneD, NekDouble>

Definition at line 556 of file ProcessPhiFromFile.cpp.

558 {
559  Array<OneD, NekDouble> out(3);
560 
561  out[0] = v0[1] * v1[2] - v0[2] * v1[1];
562  out[1] = v0[2] * v1[0] - v0[0] * v1[2];
563  out[2] = v0[0] * v1[1] - v0[1] * v1[0];
564 
565  return out;
566 }

Referenced by CheckHit().

◆ FindShortestDist()

void Nektar::FieldUtils::ProcessPhiFromFile::FindShortestDist ( const STLobject file,
const Array< OneD, NekDouble > &  x,
double &  dist 
)
protected

Calculates the shortest distance from a point \(x\) to the closed body contained in the STL file.

Parameters
file
x
dist

Definition at line 420 of file ProcessPhiFromFile.cpp.

423 {
424  // Find closest triangles
425  // First, use the ones in the node of 'x'
426  int node = m_tree.QueryNode(x);
427 
428  // Set 'dist' to an unreal value
429  dist = numeric_limits<double>::max();
430 
431  // If the node's depth is less than 3 the point is far from the object
432  int depth = m_tree.QueryDepth(node);
433 
434  if (depth > 2)
435  {
436  vector<int> treeTriangles;
437  vector<int> tmpTriangles = m_tree.QueryPoints(node);
438  for (int point : tmpTriangles)
439  {
440  treeTriangles.push_back(point);
441  }
442 
443  // Then, save the ones in the neighbouring nodes
444  vector<int> neighbours = m_tree.QueryNeighbours(node);
445  for (int neighNode : neighbours)
446  {
447  tmpTriangles = m_tree.QueryPoints(neighNode);
448  for (int point : tmpTriangles)
449  {
450  treeTriangles.push_back(point);
451  }
452  }
453 
454  // Keep the sign (interior or exterior),
455  int distSign = 1;
456  // the normal vector of closest triangle so far,
457  Array<OneD, NekDouble> triNormal =
458  file.triangles[treeTriangles[0]].normal;
459  // and the distance to the triangle PLANE
460  double tParam = dist;
461 
462  for (int i = 0; i < treeTriangles.size(); ++i)
463  {
464  // Find distance to triangle
465  triangle tri = file.triangles[treeTriangles[i]];
466  double currentTparam;
467  double u, v;
468  bool hit = CheckHit(tri, x, tri.normal, currentTparam, u, v);
469 
470  // Save "sign" of 'currentTparam'
471  int currentDistSign = (currentTparam >= 0) - (currentTparam < 0);
472  // and distance to the triangle
473  double currentDist;
474 
475  // Vector linking the hit point with the node
476  Array<OneD, NekDouble> distVector(3);
477 
478  if (hit)
479  {
480  Vmath::Smul(3, -currentTparam, tri.normal, 1, distVector, 1);
481  currentDist = fabs(currentTparam);
482  }
483  else
484  {
485  // The minimum has to be in one of the edges
486  if (v < 0) // Edge V0-V1
487  {
488  distVector = Vector2edge(x, tri.v0, tri.v1);
489  }
490  else if (u < 0) // Edge V0-V2
491  {
492  distVector = Vector2edge(x, tri.v0, tri.v2);
493  }
494  else // Edge V1-V2
495  {
496  distVector = Vector2edge(x, tri.v1, tri.v2);
497  }
498  currentDist = sqrt(Vmath::Dot(3, distVector, distVector));
499  }
500 
501  // Update 'dist', MAGIC CONSTANT AHEAD!
502  // In the case of corners, check that the new triangle is not
503  // giving contradictory information and, if so, use the one
504  // closer to 'x'. Otherwise, some exterior points will be treated
505  // as interior and viceversa
506  if (dist - currentDist > 1e-5 * currentDist ||
507  (IsEqual(dist, currentDist, 1e-5) &&
508  IsNegative(Vmath::Dot(3, triNormal, tri.normal), 1e-5) &&
509  fabs(currentTparam) > fabs(tParam)))
510  {
511  dist = currentDist;
512  tParam = currentTparam;
513  distSign = currentDistSign;
514  triNormal = tri.normal;
515  }
516  }
517 
518  // Update distance sign
519  dist *= -distSign;
520  }
521 }
int QueryDepth(int nodeID)
Definition: Octree.h:81
std::vector< int > QueryNeighbours(int nodeID)
Returns the IDs of the octants that surround the queried node. First, it finds the neighbouring nodes...
Definition: Octree.cpp:252
std::vector< int > QueryPoints(int nodeID)
Returns the indices of the points of the mesh contained in the tree.
Definition: Octree.cpp:237
int QueryNode(const Array< OneD, NekDouble > &coords, int depth=std::numeric_limits< int >::max())
Given the coordinates 'coords' of a point, returns the leaf octant that contains it....
Definition: Octree.cpp:139
bool CheckHit(const triangle &tri, const Array< OneD, NekDouble > &Origin, const Array< OneD, NekDouble > &Dvec, double &distance, double &u, double &v)
Checks if a ray traced from 'Origin' with direction 'Dvec' hits the triangle defined by 'tri'....
Array< OneD, NekDouble > Vector2edge(const Array< OneD, NekDouble > &x, const Array< OneD, NekDouble > &e1, const Array< OneD, NekDouble > &e2)
Determines the shortest distance from a point 'x' to the segment defined by the points 'e1' and 'e2'....
bool IsNegative(double x, double tol)
Returns true if .
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
Definition: Vmath.cpp:248
scalarT< T > sqrt(scalarT< T > in)
Definition: scalar.hpp:291

References CheckHit(), Vmath::Dot(), IsEqual(), IsNegative(), m_tree, Nektar::FieldUtils::ProcessPhiFromFile::triangle::normal, Nektar::FieldUtils::Octree::QueryDepth(), Nektar::FieldUtils::Octree::QueryNeighbours(), Nektar::FieldUtils::Octree::QueryNode(), Nektar::FieldUtils::Octree::QueryPoints(), Vmath::Smul(), tinysimd::sqrt(), Nektar::FieldUtils::ProcessPhiFromFile::STLobject::triangles, Nektar::FieldUtils::ProcessPhiFromFile::triangle::v0, Nektar::FieldUtils::ProcessPhiFromFile::triangle::v1, Nektar::FieldUtils::ProcessPhiFromFile::triangle::v2, and Vector2edge().

Referenced by GetPhifromSTL().

◆ GetModuleDescription()

virtual std::string Nektar::FieldUtils::ProcessPhiFromFile::GetModuleDescription ( )
inlinevirtual

Reimplemented from Nektar::FieldUtils::Module.

Definition at line 70 of file ProcessPhiFromFile.h.

71  {
72  return "Processing input STL file to calculate Phi";
73  }

◆ GetModuleName()

virtual std::string Nektar::FieldUtils::ProcessPhiFromFile::GetModuleName ( )
inlinevirtual

Implements Nektar::FieldUtils::Module.

Definition at line 65 of file ProcessPhiFromFile.h.

66  {
67  return "ProcessPhiFromFile";
68  }

◆ GetModulePriority()

virtual ModulePriority Nektar::FieldUtils::ProcessPhiFromFile::GetModulePriority ( )
inlinevirtual

Implements Nektar::FieldUtils::Module.

Definition at line 75 of file ProcessPhiFromFile.h.

76  {
77  return eModifyExp;
78  }

References Nektar::FieldUtils::eModifyExp.

◆ GetPhifromSession()

void Nektar::FieldUtils::ProcessPhiFromFile::GetPhifromSession ( )
protected

Assigns to 'phi' the values indicated by 'ShapeFunction'.

Definition at line 214 of file ProcessPhiFromFile.cpp.

215 {
216  // Check that 'ShapeFunction' appears in the session file
217  ASSERTL0(m_f->m_session->DefinesFunction("ShapeFunction"),
218  "If file=file.stl is not supplied as an argument, a "
219  "'ShapeFunction' block must be provided in the session "
220  "file.")
221 
222  // Phi function in session file
223  LibUtilities::EquationSharedPtr phiFunction =
224  m_f->m_session->GetFunction("ShapeFunction", "Phi");
225 
226  // Get info about the domain
227  int nPts = m_f->m_exp[0]->GetNpoints();
228  int nVars = m_f->m_variables.size();
229  int nStrips;
230  m_f->m_session->LoadParameter("Strip_Z", nStrips, 1);
231 
232  // Add new variable
233  m_f->m_variables.push_back("phi");
234 
235  for (int s = 0; s < nStrips; ++s)
236  {
237  // Get current coords of the point
239  for (int i = 0; i < 3; ++i)
240  {
241  coords[i] = Array<OneD, NekDouble>(nPts, 0.0);
242  }
243  m_f->m_exp[s * nVars]->GetCoords(coords[0], coords[1], coords[2]);
244 
245  // Append Phi expansion to 'm_f'
247  Exp = m_f->AppendExpList(m_f->m_numHomogeneousDir);
248  phiFunction->Evaluate(coords[0], coords[1], coords[2],
249  Exp->UpdatePhys());
250  Exp->FwdTrans(Exp->GetPhys(), Exp->UpdateCoeffs());
251 
252  auto it = m_f->m_exp.begin() + s * (nVars + 1) + nVars;
253  m_f->m_exp.insert(it, Exp);
254  }
255 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
FieldSharedPtr m_f
Field object.
Definition: Module.h:225
std::shared_ptr< Equation > EquationSharedPtr
Definition: Equation.h:130
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.

References ASSERTL0, and Nektar::FieldUtils::Module::m_f.

Referenced by Process().

◆ GetPhifromSTL()

void Nektar::FieldUtils::ProcessPhiFromFile::GetPhifromSTL ( const STLobject file)
protected

Assigns to 'phi' the corresponding values of Phi.

Parameters
file

Definition at line 262 of file ProcessPhiFromFile.cpp.

264 {
265  // Get info about the domain
266  int nPts = m_f->m_exp[0]->GetNpoints();
267  int nVars = m_f->m_variables.size();
268 
269  // Get coordinates
271  for (int i = 0; i < 3; ++i)
272  {
273  coords[i] = Array<OneD, NekDouble>(nPts, 0.0);
274  }
275  m_f->m_exp[0]->GetCoords(coords[0], coords[1], coords[2]);
276 
277  // Add new variable
278  m_f->m_variables.push_back("phi");
279 
280  // Number of homogeneous strips
281  int nStrips;
282  m_f->m_session->LoadParameter("Strip_Z", nStrips, 1);
283 
284  // Find bounds of the mesh
285  Array<OneD, NekDouble> bounds(6);
286  bounds[0] = coords[0][0];
287  bounds[1] = coords[0][0];
288  bounds[2] = coords[1][0];
289  bounds[3] = coords[1][0];
290  bounds[4] = coords[2][0];
291  bounds[5] = coords[2][0];
292  for (int i = 1; i < nPts; ++i)
293  {
294  bounds[0] = (bounds[0] < coords[0][i]) ? bounds[0] : coords[0][i];
295  bounds[1] = (bounds[1] > coords[0][i]) ? bounds[1] : coords[0][i];
296  bounds[2] = (bounds[2] < coords[1][i]) ? bounds[2] : coords[1][i];
297  bounds[3] = (bounds[3] > coords[1][i]) ? bounds[3] : coords[1][i];
298  bounds[4] = (bounds[4] < coords[2][i]) ? bounds[4] : coords[2][i];
299  bounds[5] = (bounds[5] > coords[2][i]) ? bounds[5] : coords[2][i];
300  }
301  // and add a margin to avoid rounding errors
302  for (int i = 0; i < 6; ++i)
303  {
304  bounds[i] -= pow(-1, i) * 1e-10;
305  }
306 
307  // Array of centroids of triangles in the STL object
308  Array<OneD, Array<OneD, NekDouble>> centroids(file.numTri);
309  for (int i = 0; i < file.numTri; ++i)
310  {
311  centroids[i] = file.triangles[i].centroid;
312  }
313 
314  // Initialise octree
315  m_tree = Octree(centroids, 10, bounds);
316 
317  // For each strip...
318  for (int s = 0; s < nStrips; ++s)
319  {
320  // Append Phi expansion to 'm_f'
322  phi = m_f->AppendExpList(m_f->m_numHomogeneousDir);
323 
324  // Parallelisation is highly recommended here
325  for (int i = 0; i < nPts; ++i)
326  {
327  // Get coordinates of each point
328  Array<OneD, NekDouble> tmpCoords(3);
329  tmpCoords[2] = coords[2][i];
330  tmpCoords[1] = coords[1][i];
331  tmpCoords[0] = coords[0][i];
332 
333  // Find the shortest distance to the body(ies)
334  double dist;
335  FindShortestDist(file, tmpCoords, dist);
336 
337  // Get corresponding value of Phi
338  phi->UpdatePhys()[i] =
339  PhiFunction(dist, m_config["scale"].as<double>());
340  }
341 
342  // Update vector of expansions
343  phi->FwdTrans(phi->GetPhys(), phi->UpdateCoeffs());
344  auto it = m_f->m_exp.begin() + s * (nVars + 1) + nVars;
345  m_f->m_exp.insert(it, phi);
346  }
347 }
void FindShortestDist(const STLobject &file, const Array< OneD, NekDouble > &x, double &dist)
Calculates the shortest distance from a point to the closed body contained in the STL file.
NekDouble PhiFunction(double dist, double coeff)
Smoothing function for the SPM method given a distance value and a scaling coefficient.

References FindShortestDist(), Nektar::FieldUtils::Module::m_config, Nektar::FieldUtils::Module::m_f, m_tree, Nektar::FieldUtils::ProcessPhiFromFile::STLobject::numTri, PhiFunction(), and Nektar::FieldUtils::ProcessPhiFromFile::STLobject::triangles.

Referenced by Process().

◆ IsEqual()

bool Nektar::FieldUtils::ProcessPhiFromFile::IsEqual ( double  x,
double  y,
double  relTol 
)
protected

Returns true if \(x=y\) within the relative tolerance 'relTol' (relative to 'y')

Parameters
x
Returns
true
false

Definition at line 531 of file ProcessPhiFromFile.cpp.

532 {
533  return (fabs(x - y) <= relTol * y);
534 }

Referenced by CheckHit(), and FindShortestDist().

◆ IsNegative()

bool Nektar::FieldUtils::ProcessPhiFromFile::IsNegative ( double  x,
double  tol 
)
protected

Returns true if \(x<tol\).

Parameters
x
relTol
Returns
true
false

Definition at line 544 of file ProcessPhiFromFile.cpp.

545 {
546  return (x < tol);
547 }

Referenced by FindShortestDist().

◆ PhiFunction()

NekDouble Nektar::FieldUtils::ProcessPhiFromFile::PhiFunction ( double  dist,
double  coeff 
)
protected

Smoothing function for the SPM method given a distance value and a scaling coefficient.

Parameters
dist
coeff
Returns
NekDouble

Definition at line 205 of file ProcessPhiFromFile.cpp.

206 {
207  return -0.5 * (std::tanh(dist / coeff) - 1.0);
208 }

Referenced by GetPhifromSTL().

◆ Process()

void Nektar::FieldUtils::ProcessPhiFromFile::Process ( po::variables_map &  vm)
virtual

Implements Nektar::FieldUtils::Module.

Definition at line 75 of file ProcessPhiFromFile.cpp.

76 {
77  // Ignore warnings due to 'vm'
78  boost::ignore_unused(vm);
79 
80  // Do not run in parallel
81  ASSERTL0(m_f->m_session->GetComm()->IsSerial(), "Parallel execution is "
82  "not supported yet in "
83  "this module.")
84 
85  // Check if required params are defined
86  ASSERTL0(m_f->m_graph, "A session file file must be provided before the "
87  "STL file.")
88 
89  // Skip in case of empty partition
90  if (m_f->m_exp[0]->GetNumElmts() == 0)
91  {
92  return;
93  }
94 
95  // Read Phi function from the session file...
96  if (m_config["file"].as<string>().compare("NotSet") == 0)
97  {
98  WARNINGL0(m_config["scale"].as<string>().compare("NotSet") == 0,
99  "Reading Phi function from session file, the provided scale "
100  "value will not be used");
102  }
103  // ...or Read STL file and append Phi values to the existing expansions
104  else
105  {
106  ASSERTL0(m_config["scale"].as<string>().compare("NotSet") != 0,
107  "Need to specify a scale coefficient, scale=value");
108 
109  STLobject phiFile = ReadSTL(m_config["file"].as<string>());
110  GetPhifromSTL(phiFile);
111  }
112 }
#define WARNINGL0(condition, msg)
Definition: ErrorUtil.hpp:222
void GetPhifromSession()
Assigns to 'phi' the values indicated by 'ShapeFunction'.
STLobject ReadSTL(std::string filename)
Read an STL binary file and returns a struct of type 'STLobject' containing the parsed data.
void GetPhifromSTL(const STLobject &file)
Assigns to 'phi' the corresponding values of Phi.

References ASSERTL0, GetPhifromSession(), GetPhifromSTL(), Nektar::FieldUtils::Module::m_config, Nektar::FieldUtils::Module::m_f, ReadSTL(), and WARNINGL0.

◆ ReadSTL()

ProcessPhiFromFile::STLobject Nektar::FieldUtils::ProcessPhiFromFile::ReadSTL ( std::string  filename)
protected

Read an STL binary file and returns a struct of type 'STLobject' containing the parsed data.

Parameters
filename
Returns
ProcessPhiFromFile::STLobject

Definition at line 147 of file ProcessPhiFromFile.cpp.

148 {
149  STLobject out;
150 
151  // Open file
152  ifstream fileStl(filename.c_str(), ios::binary);
153  ASSERTL0(fileStl, "An error occurred while trying to open the STL file.")
154 
155  // Buffers
156  char headerBuf[80];
157  char numTriBuf[4];
158  char dumpBuf[2];
159 
160  // Read header and num of triangles
161  fileStl.read(headerBuf, sizeof(headerBuf));
162  fileStl.read(numTriBuf, sizeof(numTriBuf));
163  memcpy(&out.numTri, numTriBuf, sizeof(numTriBuf));
164 
165  // Read triangle data
166  out.triangles = Array<OneD, triangle>(out.numTri);
167  for (NekUInt32 i = 0; i < out.numTri; ++i)
168  {
169  // Read normal vector
170  triangle tmpTri;
171  tmpTri.normal = ReadVector(fileStl);
172 
173  // Read three vertices
174  tmpTri.v0 = ReadVector(fileStl);
175  tmpTri.v1 = ReadVector(fileStl);
176  tmpTri.v2 = ReadVector(fileStl);
177 
178  // Add centroid to the triangle object
179  Array<OneD, NekDouble> centre(3);
180  centre[0] = (tmpTri.v0[0] + tmpTri.v1[0] + tmpTri.v2[0]) / 3.0;
181  centre[1] = (tmpTri.v0[1] + tmpTri.v1[1] + tmpTri.v2[1]) / 3.0;
182  centre[2] = (tmpTri.v0[2] + tmpTri.v1[2] + tmpTri.v2[2]) / 3.0;
183  tmpTri.centroid = centre;
184 
185  out.triangles[i] = tmpTri;
186 
187  // Dump triangle type
188  fileStl.read(dumpBuf, sizeof(dumpBuf));
189  }
190 
191  // Close the file
192  fileStl.close();
193 
194  return out;
195 }
Array< OneD, NekDouble > ReadVector(std::ifstream &in)
Read one 3D vector from a STL file, starting from the next line of the input 'ifstream'....
std::uint32_t NekUInt32

References ASSERTL0, Nektar::FieldUtils::ProcessPhiFromFile::triangle::centroid, Nektar::FieldUtils::ProcessPhiFromFile::triangle::normal, Nektar::FieldUtils::ProcessPhiFromFile::STLobject::numTri, ReadVector(), Nektar::FieldUtils::ProcessPhiFromFile::STLobject::triangles, Nektar::FieldUtils::ProcessPhiFromFile::triangle::v0, Nektar::FieldUtils::ProcessPhiFromFile::triangle::v1, and Nektar::FieldUtils::ProcessPhiFromFile::triangle::v2.

Referenced by Process().

◆ ReadVector()

Array< OneD, NekDouble > Nektar::FieldUtils::ProcessPhiFromFile::ReadVector ( std::ifstream &  in)
protected

Read one 3D vector from a STL file, starting from the next line of the input 'ifstream'. Numbers in ifstream are defined as 'float'.

Parameters
in
Returns
Array<OneD, NekDouble>

Definition at line 121 of file ProcessPhiFromFile.cpp.

122 {
123  Array<OneD, NekDouble> out(3, 0.0);
124  float tmp;
125  char buf[4];
126 
127  in.read(buf, sizeof(buf));
128  memcpy(&tmp, buf, sizeof(buf));
129  out[0] = tmp;
130  in.read(buf, sizeof(buf));
131  memcpy(&tmp, buf, sizeof(buf));
132  out[1] = tmp;
133  in.read(buf, sizeof(buf));
134  memcpy(&tmp, buf, sizeof(buf));
135  out[2] = tmp;
136 
137  return out;
138 }

Referenced by ReadSTL().

◆ Vector2edge()

Array< OneD, NekDouble > Nektar::FieldUtils::ProcessPhiFromFile::Vector2edge ( const Array< OneD, NekDouble > &  x,
const Array< OneD, NekDouble > &  e1,
const Array< OneD, NekDouble > &  e2 
)
protected

Determines the shortest distance from a point 'x' to the segment defined by the points 'e1' and 'e2'. Note that this distance may be equal to that to one of the end points. The vector returned points towards the point 'x'.

Parameters
x
e1
e2
Returns
Array<OneD, NekDouble>

Definition at line 579 of file ProcessPhiFromFile.cpp.

582 {
583  size_t n = x.size();
584  Array<OneD, NekDouble> e1x(n);
585  Array<OneD, NekDouble> e1e2(n);
586  Vmath::Vsub(n, x, 1, e1, 1, e1x, 1);
587  Vmath::Vsub(n, e2, 1, e1, 1, e1e2, 1);
588  double norm = sqrt(Vmath::Dot(n, e1e2, e1e2));
589  for (size_t i = 0; i < n; ++i)
590  {
591  e1e2[i] /= norm;
592  }
593 
594  Array<OneD, NekDouble> out(n);
595  double proj = Vmath::Dot(n, e1x, e1e2);
596  if (proj < 0.0)
597  {
598  Vmath::Vsub(n, x, 1, e1, 1, out, 1);
599  }
600  else if (proj > norm)
601  {
602  Vmath::Vsub(n, x, 1, e2, 1, out, 1);
603  }
604  else
605  {
606  Vmath::Svtsvtp(n, 1.0, e1x, 1, -proj, e1e2, 1, out, 1);
607  }
608 
609  return out;
610 }
void Svtsvtp(int n, const T alpha, const T *x, int incx, const T beta, const T *y, int incy, T *z, int incz)
vvtvvtp (scalar times vector plus scalar times vector):
Definition: Vmath.cpp:751

References Vmath::Dot(), tinysimd::sqrt(), Vmath::Svtsvtp(), and Vmath::Vsub().

Referenced by FindShortestDist().

Member Data Documentation

◆ m_className

ModuleKey Nektar::FieldUtils::ProcessPhiFromFile::m_className
static
Initial value:
= {
"Computes the Phi function from a file, used in IB methods.")}
static ModuleSharedPtr create(FieldSharedPtr f)
Creates an instance of this class.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:198
std::pair< ModuleType, std::string > ModuleKey
Definition: Module.h:285
ModuleFactory & GetModuleFactory()
Definition: Module.cpp:49

ModuleKey for class.

Definition at line 59 of file ProcessPhiFromFile.h.

◆ m_tree

Octree Nektar::FieldUtils::ProcessPhiFromFile::m_tree
protected

Octree object.

Definition at line 103 of file ProcessPhiFromFile.h.

Referenced by FindShortestDist(), and GetPhifromSTL().