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 59 of file ProcessPhiFromFile.cpp.

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

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

◆ ~ProcessPhiFromFile()

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

Definition at line 70 of file ProcessPhiFromFile.cpp.

71 {
72 }

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 367 of file ProcessPhiFromFile.cpp.

371 {
372  // Edge vectors
375  Vmath::Vsub(3, tri.v1, 1, tri.v0, 1, E1, 1);
376  Vmath::Vsub(3, tri.v2, 1, tri.v0, 1, E2, 1);
377 
378  // If det == 0, ray parallel to triangle
379  Array<OneD, NekDouble> Pvec = Cross(Dvec, E2);
380  double det = Vmath::Dot(3, Pvec, E1);
381  double inv_det = 1.0 / det;
382  if (IsEqual(0.0, det, 1e-10))
383  {
384  distance = numeric_limits<double>::max();
385  u = numeric_limits<double>::max();
386  v = numeric_limits<double>::max();
387  return false;
388  }
389 
390  // Vector T and parameter u = (0.0, 1.0)
391  Array<OneD, NekDouble> Tvec(3);
392  Vmath::Vsub(3, Origin, 1, tri.v0, 1, Tvec, 1);
393  u = Vmath::Dot(3, Pvec, Tvec) * inv_det;
394 
395  // Vector Q and parameter v = (0.0, 1.0)
396  Array<OneD, NekDouble> Qvec = Cross(Tvec, E1);
397  v = Vmath::Dot(3, Qvec, Dvec) * inv_det;
398 
399  // There is a hit if (u,v) coordinates are bounded
400  distance = Vmath::Dot(3, Qvec, E2) * inv_det;
401  if ((u < 0.0 || u > 1.0) || (v < 0.0 || u+v > 1.0))
402  {
403  return false;
404  }
405  else
406  {
407  return true;
408  }
409 }
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:1038
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:372

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.

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

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 419 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:75
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:251
std::vector< int > QueryPoints(int nodeID)
Returns the indices of the points of the mesh contained in the tree.
Definition: Octree.cpp:236
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:138
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:225
scalarT< T > sqrt(scalarT< T > in)
Definition: scalar.hpp:267

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 213 of file ProcessPhiFromFile.cpp.

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

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

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

Referenced by GetPhifromSTL().

◆ Process()

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

Implements Nektar::FieldUtils::Module.

Definition at line 77 of file ProcessPhiFromFile.cpp.

78 {
79  // Ignore warnings due to 'vm'
80  boost::ignore_unused(vm);
81 
82  // Do not run in parallel
83  ASSERTL0(m_f->m_session->GetComm()->IsSerial(), "Parallel execution is "
84  "not supported yet in "
85  "this module.")
86 
87  // Check if required params are defined
88  ASSERTL0(m_f->m_graph, "A session file file must be provided before the "
89  "STL file.")
90 
91  // Skip in case of empty partition
92  if (m_f->m_exp[0]->GetNumElmts() == 0)
93  {
94  return;
95  }
96 
97  // Read Phi function from the session file...
98  if (m_config["file"].as<string>().compare("NotSet") == 0)
99  {
100  WARNINGL0(m_config["scale"].as<string>().compare("NotSet") == 0,
101  "Reading Phi function from session file, the provided scale "
102  "value will not be used");
104  }
105  // ...or Read STL file and append Phi values to the existing expansions
106  else
107  {
108  ASSERTL0(m_config["scale"].as<string>().compare("NotSet") != 0,
109  "Need to specify a scale coefficient, scale=value");
110 
111  STLobject phiFile = ReadSTL(m_config["file"].as<string>());
112  GetPhifromSTL(phiFile);
113  }
114 }
#define WARNINGL0(condition, msg)
Definition: ErrorUtil.hpp:223
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 146 of file ProcessPhiFromFile.cpp.

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

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

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 580 of file ProcessPhiFromFile.cpp.

584 {
585  size_t n = x.size();
586  Array<OneD, NekDouble> e1x(n);
587  Array<OneD, NekDouble> e1e2(n);
588  Vmath::Vsub(n, x, 1, e1, 1, e1x, 1);
589  Vmath::Vsub(n, e2, 1, e1, 1, e1e2, 1);
590  double norm = sqrt(Vmath::Dot(n, e1e2, e1e2));
591  for (size_t i = 0; i < n; ++i)
592  {
593  e1e2[i] /= norm;
594  }
595 
596  Array<OneD, NekDouble> out(n);
597  double proj = Vmath::Dot(n, e1x, e1e2);
598  if (proj < 0.0)
599  {
600  Vmath::Vsub(n, x, 1, e1, 1, out, 1);
601  }
602  else if (proj > norm)
603  {
604  Vmath::Vsub(n, x, 1, e2, 1, out, 1);
605  }
606  else
607  {
608  Vmath::Svtsvtp(n, 1.0, e1x, 1, -proj, e1e2, 1, out, 1);
609  }
610 
611  return out;
612 }
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:691

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:200
std::pair< ModuleType, std::string > ModuleKey
Definition: Module.h:290
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 101 of file ProcessPhiFromFile.h.

Referenced by FindShortestDist(), and GetPhifromSTL().