Nektar++
Public Member Functions | Protected Attributes | Private Member Functions | List of all members
Nektar::SpatialDomains::BoundaryConditions Class Reference

#include <Conditions.h>

Public Member Functions

 BoundaryConditions (const LibUtilities::SessionReaderSharedPtr &pSession, const MeshGraphSharedPtr &meshGraph)
 
 BoundaryConditions (void)
 
 ~BoundaryConditions (void)
 
const BoundaryRegionCollectionGetBoundaryRegions (void) const
 
void AddBoundaryRegions (const int regionID, BoundaryRegionShPtr &bRegion)
 
const BoundaryConditionCollectionGetBoundaryConditions (void) const
 
void AddBoundaryConditions (const int regionID, BoundaryConditionMapShPtr &bCond)
 
const std::string GetVariable (unsigned int indx)
 
std::map< int, LibUtilities::CommSharedPtrGetBoundaryCommunicators () const
 

Protected Attributes

MeshGraphSharedPtr m_meshGraph
 The mesh graph to use for referencing geometry info. More...
 
LibUtilities::SessionReaderSharedPtr m_session
 
BoundaryRegionCollection m_boundaryRegions
 
BoundaryConditionCollection m_boundaryConditions
 
std::map< int, LibUtilities::CommSharedPtrm_boundaryCommunicators
 

Private Member Functions

void Read (TiXmlElement *conditions)
 Read segments (and general MeshGraph) given TiXmlDocument. More...
 
void ReadBoundaryRegions (TiXmlElement *regions)
 
void ReadBoundaryConditions (TiXmlElement *conditions)
 
void CreateBoundaryComms ()
 

Detailed Description

Definition at line 230 of file Conditions.h.

Constructor & Destructor Documentation

◆ BoundaryConditions() [1/2]

Nektar::SpatialDomains::BoundaryConditions::BoundaryConditions ( const LibUtilities::SessionReaderSharedPtr pSession,
const MeshGraphSharedPtr meshGraph 
)

Constructor - collective on the session's communicator.

Definition at line 50 of file Conditions.cpp.

References m_session, and Read().

53  : m_meshGraph(meshGraph), m_session(pSession)
54 
55 {
56  Read(m_session->GetElement("Nektar/Conditions"));
57 }
void Read(TiXmlElement *conditions)
Read segments (and general MeshGraph) given TiXmlDocument.
Definition: Conditions.cpp:214
LibUtilities::SessionReaderSharedPtr m_session
Definition: Conditions.h:272
MeshGraphSharedPtr m_meshGraph
The mesh graph to use for referencing geometry info.
Definition: Conditions.h:271

◆ BoundaryConditions() [2/2]

Nektar::SpatialDomains::BoundaryConditions::BoundaryConditions ( void  )

Definition at line 59 of file Conditions.cpp.

60 {
61 }

◆ ~BoundaryConditions()

Nektar::SpatialDomains::BoundaryConditions::~BoundaryConditions ( void  )

Definition at line 63 of file Conditions.cpp.

64 {
65 }

Member Function Documentation

◆ AddBoundaryConditions()

void Nektar::SpatialDomains::BoundaryConditions::AddBoundaryConditions ( const int  regionID,
BoundaryConditionMapShPtr bCond 
)
inline

Definition at line 254 of file Conditions.h.

255  {
256  m_boundaryConditions[regionID] = bCond;
257  }
BoundaryConditionCollection m_boundaryConditions
Definition: Conditions.h:275

◆ AddBoundaryRegions()

void Nektar::SpatialDomains::BoundaryConditions::AddBoundaryRegions ( const int  regionID,
BoundaryRegionShPtr bRegion 
)
inline

Definition at line 243 of file Conditions.h.

244  {
245  m_boundaryRegions[regionID] = bRegion;
246  }
BoundaryRegionCollection m_boundaryRegions
Definition: Conditions.h:274

◆ CreateBoundaryComms()

void Nektar::SpatialDomains::BoundaryConditions::CreateBoundaryComms ( )
private

Create a new communicator for each boundary region. Collective on the session's communicator.

Definition at line 174 of file Conditions.cpp.

References ASSERTL0, m_boundaryCommunicators, m_boundaryRegions, m_session, and Nektar::SpatialDomains::ShareAllBoundaryIDs().

Referenced by Read().

175 {
176  LibUtilities::CommSharedPtr comm = m_session->GetComm();
177 
178  if (comm->IsSerial())
179  {
180  // Do not try and generate a communicator if we have a serial
181  // communicator. Arises with a FieldConvert communicator when
182  // using --nparts in FieldConvert. Just set communicator to comm
183  // in this case.
184  for (auto &it : m_boundaryRegions)
185  {
186  m_boundaryCommunicators[it.first] = comm;
187  }
188  return;
189  }
190 
191  std::set<int> allids = ShareAllBoundaryIDs(m_boundaryRegions, comm);
192 
193  for (auto &it : allids)
194  {
195  auto reg_it = m_boundaryRegions.find(it);
196  int this_rank_participates = (reg_it != m_boundaryRegions.end());
197  LibUtilities::CommSharedPtr comm_region =
198  comm->CommCreateIf(this_rank_participates);
199 
200  ASSERTL0(bool(comm_region) == bool(this_rank_participates),
201  "Rank should be in communicator but wasn't or is in "
202  "communicator but shouldn't be.");
203 
204  if (this_rank_participates)
205  {
206  m_boundaryCommunicators[reg_it->first] = comm_region;
207  }
208  }
209 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
BoundaryRegionCollection m_boundaryRegions
Definition: Conditions.h:274
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:53
std::map< int, LibUtilities::CommSharedPtr > m_boundaryCommunicators
Definition: Conditions.h:276
std::set< int > ShareAllBoundaryIDs(const BoundaryRegionCollection &boundaryRegions, LibUtilities::CommSharedPtr comm)
Definition: Conditions.cpp:90
LibUtilities::SessionReaderSharedPtr m_session
Definition: Conditions.h:272

◆ GetBoundaryCommunicators()

std::map<int, LibUtilities::CommSharedPtr> Nektar::SpatialDomains::BoundaryConditions::GetBoundaryCommunicators ( ) const
inline

Definition at line 264 of file Conditions.h.

265  {
267  }
std::map< int, LibUtilities::CommSharedPtr > m_boundaryCommunicators
Definition: Conditions.h:276

◆ GetBoundaryConditions()

const BoundaryConditionCollection& Nektar::SpatialDomains::BoundaryConditions::GetBoundaryConditions ( void  ) const
inline

◆ GetBoundaryRegions()

const BoundaryRegionCollection& Nektar::SpatialDomains::BoundaryConditions::GetBoundaryRegions ( void  ) const
inline

◆ GetVariable()

const std::string Nektar::SpatialDomains::BoundaryConditions::GetVariable ( unsigned int  indx)
inline

Definition at line 259 of file Conditions.h.

260  {
261  return m_session->GetVariable(indx);
262  }
LibUtilities::SessionReaderSharedPtr m_session
Definition: Conditions.h:272

◆ Read()

void Nektar::SpatialDomains::BoundaryConditions::Read ( TiXmlElement *  conditions)
private

Read segments (and general MeshGraph) given TiXmlDocument.

Collective on the session's communicator.

Definition at line 214 of file Conditions.cpp.

References ASSERTL0, CreateBoundaryComms(), ReadBoundaryConditions(), and ReadBoundaryRegions().

Referenced by BoundaryConditions().

215 {
216  ASSERTL0(conditions, "Unable to find CONDITIONS tag in file.");
217 
218  TiXmlElement *boundaryRegions =
219  conditions->FirstChildElement("BOUNDARYREGIONS");
220 
221  if (boundaryRegions)
222  {
223  ReadBoundaryRegions(conditions);
225  ReadBoundaryConditions(conditions);
226  }
227 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
void ReadBoundaryRegions(TiXmlElement *regions)
Definition: Conditions.cpp:232
void ReadBoundaryConditions(TiXmlElement *conditions)
Definition: Conditions.cpp:311

◆ ReadBoundaryConditions()

void Nektar::SpatialDomains::BoundaryConditions::ReadBoundaryConditions ( TiXmlElement *  conditions)
private

Definition at line 311 of file Conditions.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL0, Nektar::StdRegions::find(), Nektar::ParseUtils::GenerateSeqVector(), m_boundaryCommunicators, m_boundaryConditions, m_boundaryRegions, and m_session.

Referenced by Read().

312 {
313  // Protect against multiple reads.
314  if (m_boundaryConditions.size() != 0)
315  {
316  return;
317  }
318 
319  // Read REGION tags
320  TiXmlElement *boundaryConditionsElement =
321  conditions->FirstChildElement("BOUNDARYCONDITIONS");
322  ASSERTL0(boundaryConditionsElement,
323  "Boundary conditions must be specified.");
324 
325  TiXmlElement *regionElement =
326  boundaryConditionsElement->FirstChildElement("REGION");
327 
328  // Read R (Robin), D (Dirichlet), N (Neumann), P (Periodic) C(Cauchy) tags
329  while (regionElement)
330  {
331  BoundaryConditionMapShPtr boundaryConditions =
333 
334  int boundaryRegionID;
335  int err = regionElement->QueryIntAttribute("REF", &boundaryRegionID);
336  ASSERTL0(err == TIXML_SUCCESS,
337  "Error reading boundary region reference.");
338 
339  ASSERTL0(m_boundaryConditions.count(boundaryRegionID) == 0,
340  "Boundary region '" +
341  boost::lexical_cast<std::string>(boundaryRegionID) +
342  "' appears multiple times.");
343 
344  // Find the boundary region corresponding to this ID.
345  std::string boundaryRegionIDStr;
346  std::ostringstream boundaryRegionIDStrm(boundaryRegionIDStr);
347  boundaryRegionIDStrm << boundaryRegionID;
348 
349  if (m_boundaryRegions.count(boundaryRegionID) == 0)
350  {
351  regionElement = regionElement->NextSiblingElement("REGION");
352  continue;
353  }
354 
355  ASSERTL0(m_boundaryRegions.count(boundaryRegionID) == 1,
356  "Boundary region " +
357  boost::lexical_cast<string>(boundaryRegionID) +
358  " not found");
359 
360  // Find the communicator that belongs to this ID
361  LibUtilities::CommSharedPtr boundaryRegionComm =
362  m_boundaryCommunicators[boundaryRegionID];
363 
364  TiXmlElement *conditionElement = regionElement->FirstChildElement();
365  std::vector<std::string> vars = m_session->GetVariables();
366 
367  while (conditionElement)
368  {
369  // Check type.
370  std::string conditionType = conditionElement->Value();
371  std::string attrData;
372  bool isTimeDependent = false;
373 
374  // All have var specified, or else all variables are zero.
375  TiXmlAttribute *attr = conditionElement->FirstAttribute();
376 
377  std::vector<std::string>::iterator iter;
378  std::string attrName;
379 
380  attrData = conditionElement->Attribute("VAR");
381 
382  if (!attrData.empty())
383  {
384  iter = std::find(vars.begin(), vars.end(), attrData);
385  ASSERTL0(
386  iter != vars.end(),
387  (std::string("Cannot find variable: ") + attrData).c_str());
388  }
389 
390  if (conditionType == "N")
391  {
392  if (attrData.empty())
393  {
394  // All variables are Neumann and are set to zero.
395  for (auto &varIter : vars)
396  {
397  BoundaryConditionShPtr neumannCondition(
398  MemoryManager<NeumannBoundaryCondition>::
399  AllocateSharedPtr(m_session, "00.0"));
400  (*boundaryConditions)[varIter] = neumannCondition;
401  }
402  }
403  else
404  {
405  if (attr)
406  {
407  std::string equation, userDefined, filename;
408 
409  while (attr)
410  {
411 
412  attrName = attr->Name();
413 
414  if (attrName == "VAR")
415  {
416  // if VAR do nothing
417  }
418  else if (attrName == "USERDEFINEDTYPE")
419  {
420  // Do stuff for the user defined attribute
421  attrData = attr->Value();
422  ASSERTL0(!attrData.empty(),
423  "USERDEFINEDTYPE attribute must have "
424  "associated value.");
425 
426  // Suppose to go here?
427  m_session->SubstituteExpressions(attrData);
428 
429  userDefined = attrData;
430  isTimeDependent =
431  boost::iequals(attrData, "TimeDependent");
432  }
433  else if (attrName == "VALUE")
434  {
435  ASSERTL0(attrName == "VALUE",
436  (std::string("Unknown attribute: ") +
437  attrName)
438  .c_str());
439 
440  attrData = attr->Value();
441  ASSERTL0(!attrData.empty(),
442  "VALUE attribute must be specified.");
443 
444  m_session->SubstituteExpressions(attrData);
445 
446  equation = attrData;
447  }
448  else if (attrName == "FILE")
449  {
450  ASSERTL0(attrName == "FILE",
451  (std::string("Unknown attribute: ") +
452  attrName)
453  .c_str());
454 
455  attrData = attr->Value();
456  ASSERTL0(!attrData.empty(),
457  "FILE attribute must be specified.");
458 
459  m_session->SubstituteExpressions(attrData);
460 
461  filename = attrData;
462  }
463  else
464  {
465  ASSERTL0(false,
466  (std::string("Unknown boundary "
467  "condition attribute: ") +
468  attrName)
469  .c_str());
470  }
471  attr = attr->Next();
472  }
473 
474  BoundaryConditionShPtr neumannCondition(
475  MemoryManager<NeumannBoundaryCondition>::
476  AllocateSharedPtr(m_session, equation,
477  userDefined, filename,
478  boundaryRegionComm));
479  neumannCondition->SetIsTimeDependent(isTimeDependent);
480  (*boundaryConditions)[*iter] = neumannCondition;
481  }
482  else
483  {
484  // This variable's condition is zero.
485  BoundaryConditionShPtr neumannCondition(
486  MemoryManager<NeumannBoundaryCondition>::
487  AllocateSharedPtr(m_session, "0"));
488  (*boundaryConditions)[*iter] = neumannCondition;
489  }
490  }
491  }
492  else if (conditionType == "D")
493  {
494  if (attrData.empty())
495  {
496  // All variables are Dirichlet and are set to zero.
497  for (auto &varIter : vars)
498  {
499  BoundaryConditionShPtr dirichletCondition(
500  MemoryManager<DirichletBoundaryCondition>::
501  AllocateSharedPtr(m_session, "0"));
502  (*boundaryConditions)[varIter] = dirichletCondition;
503  }
504  }
505  else
506  {
507  if (attr)
508  {
509  std::string equation, userDefined, filename;
510 
511  while (attr)
512  {
513 
514  attrName = attr->Name();
515 
516  if (attrName == "VAR")
517  {
518  // if VAR do nothing
519  }
520  else if (attrName == "USERDEFINEDTYPE")
521  {
522 
523  // Do stuff for the user defined attribute
524  attrData = attr->Value();
525  ASSERTL0(!attrData.empty(),
526  "USERDEFINEDTYPE attribute must have "
527  "associated value.");
528 
529  m_session->SubstituteExpressions(attrData);
530 
531  userDefined = attrData;
532  isTimeDependent =
533  boost::iequals(attrData, "TimeDependent");
534  }
535  else if (attrName == "VALUE")
536  {
537  ASSERTL0(attrName == "VALUE",
538  (std::string("Unknown attribute: ") +
539  attrName)
540  .c_str());
541 
542  attrData = attr->Value();
543  ASSERTL0(!attrData.empty(),
544  "VALUE attribute must have associated "
545  "value.");
546 
547  m_session->SubstituteExpressions(attrData);
548 
549  equation = attrData;
550  }
551  else if (attrName == "FILE")
552  {
553  ASSERTL0(attrName == "FILE",
554  (std::string("Unknown attribute: ") +
555  attrName)
556  .c_str());
557 
558  attrData = attr->Value();
559  ASSERTL0(!attrData.empty(),
560  "FILE attribute must be specified.");
561 
562  m_session->SubstituteExpressions(attrData);
563 
564  filename = attrData;
565  }
566  else
567  {
568  ASSERTL0(false,
569  (std::string("Unknown boundary "
570  "condition attribute: ") +
571  attrName)
572  .c_str());
573  }
574  attr = attr->Next();
575  }
576 
577  BoundaryConditionShPtr dirichletCondition(
578  MemoryManager<DirichletBoundaryCondition>::
579  AllocateSharedPtr(m_session, equation,
580  userDefined, filename,
581  boundaryRegionComm));
582  dirichletCondition->SetIsTimeDependent(isTimeDependent);
583  (*boundaryConditions)[*iter] = dirichletCondition;
584  }
585  else
586  {
587  // This variable's condition is zero.
588  BoundaryConditionShPtr dirichletCondition(
589  MemoryManager<DirichletBoundaryCondition>::
590  AllocateSharedPtr(m_session, "0"));
591  (*boundaryConditions)[*iter] = dirichletCondition;
592  }
593  }
594  }
595  else if (conditionType == "R") // Read du/dn + PRIMCOEFF u = VALUE
596  {
597  if (attrData.empty())
598  {
599  // All variables are Robin and are set to zero.
600  for (auto &varIter : vars)
601  {
602  BoundaryConditionShPtr robinCondition(
603  MemoryManager<RobinBoundaryCondition>::
604  AllocateSharedPtr(m_session, "0", "0"));
605  (*boundaryConditions)[varIter] = robinCondition;
606  }
607  }
608  else
609  {
610 
611  if (attr)
612  {
613  std::string equation1, equation2, userDefined;
614  std::string filename;
615 
616  bool primcoeffset = false;
617 
618  while (attr)
619  {
620 
621  attrName = attr->Name();
622 
623  if (attrName == "VAR")
624  {
625  // if VAR do nothing
626  }
627  else if (attrName == "USERDEFINEDTYPE")
628  {
629 
630  // Do stuff for the user defined attribute
631  attrData = attr->Value();
632  ASSERTL0(!attrData.empty(),
633  "USERDEFINEDTYPE attribute must have "
634  "associated value.");
635 
636  m_session->SubstituteExpressions(attrData);
637  userDefined = attrData;
638  isTimeDependent =
639  boost::iequals(attrData, "TimeDependent");
640  }
641  else if (attrName == "VALUE")
642  {
643 
644  attrData = attr->Value();
645  ASSERTL0(!attrData.empty(),
646  "VALUE attributes must have "
647  "associated values.");
648 
649  m_session->SubstituteExpressions(attrData);
650 
651  equation1 = attrData;
652  }
653  else if (attrName == "PRIMCOEFF")
654  {
655 
656  attrData = attr->Value();
657  ASSERTL0(!attrData.empty(),
658  "PRIMCOEFF attributes must have "
659  "associated values.");
660 
661  m_session->SubstituteExpressions(attrData);
662 
663  equation2 = attrData;
664 
665  primcoeffset = true;
666  }
667  else if (attrName == "FILE")
668  {
669  attrData = attr->Value();
670  ASSERTL0(!attrData.empty(),
671  "FILE attribute must be specified.");
672 
673  m_session->SubstituteExpressions(attrData);
674 
675  filename = attrData;
676  }
677  else
678  {
679  ASSERTL0(false,
680  (std::string("Unknown boundary "
681  "condition attribute: ") +
682  attrName)
683  .c_str());
684  }
685  attr = attr->Next();
686  }
687 
688  if (primcoeffset == false)
689  {
690  ASSERTL0(false, "PRIMCOEFF must be specified in a "
691  "Robin boundary condition");
692  }
693  BoundaryConditionShPtr robinCondition(
694  MemoryManager<RobinBoundaryCondition>::
695  AllocateSharedPtr(
696  m_session, equation1, equation2,
697  userDefined, filename, boundaryRegionComm));
698  (*boundaryConditions)[*iter] = robinCondition;
699  }
700  else
701  {
702  // This variable's condition is zero.
703  BoundaryConditionShPtr robinCondition(
704  MemoryManager<RobinBoundaryCondition>::
705  AllocateSharedPtr(m_session, "0", "0"));
706  robinCondition->SetIsTimeDependent(isTimeDependent);
707  (*boundaryConditions)[*iter] = robinCondition;
708  }
709  }
710  }
711  else if (conditionType == "P")
712  {
713  if (attrData.empty())
714  {
715  ASSERTL0(false, "Periodic boundary conditions should "
716  "be explicitely defined");
717  }
718  else
719  {
720 
721  if (attr)
722  {
723  std::string userDefined;
724  vector<unsigned int> periodicBndRegionIndex;
725  while (attr)
726  {
727  attrName = attr->Name();
728 
729  if (attrName == "VAR")
730  {
731  // if VAR do nothing
732  }
733  else if (attrName == "USERDEFINEDTYPE")
734  {
735  // Do stuff for the user defined attribute
736  attrData = attr->Value();
737  ASSERTL0(!attrData.empty(),
738  "USERDEFINEDTYPE attribute must have "
739  "associated value.");
740 
741  m_session->SubstituteExpressions(attrData);
742  userDefined = attrData;
743  isTimeDependent =
744  boost::iequals(attrData, "TimeDependent");
745  }
746  else if (attrName == "VALUE")
747  {
748  attrData = attr->Value();
749  ASSERTL0(!attrData.empty(),
750  "VALUE attribute must have associated "
751  "value.");
752 
753  int beg = attrData.find_first_of("[");
754  int end = attrData.find_first_of("]");
755  std::string periodicBndRegionIndexStr =
756  attrData.substr(beg + 1, end - beg - 1);
757  ASSERTL0(
758  beg < end,
759  (std::string("Error reading periodic "
760  "boundary region definition "
761  "for boundary region: ") +
762  boundaryRegionIDStrm.str())
763  .c_str());
764 
765  bool parseGood = ParseUtils::GenerateSeqVector(
766  periodicBndRegionIndexStr.c_str(),
767  periodicBndRegionIndex);
768 
769  ASSERTL0(
770  parseGood &&
771  (periodicBndRegionIndex.size() == 1),
772  (std::string(
773  "Unable to read periodic boundary "
774  "condition for boundary region: ") +
775  boundaryRegionIDStrm.str())
776  .c_str());
777  }
778  attr = attr->Next();
779  }
780  BoundaryConditionShPtr periodicCondition(
781  MemoryManager<PeriodicBoundaryCondition>::
782  AllocateSharedPtr(periodicBndRegionIndex[0],
783  userDefined,
784  boundaryRegionComm));
785  (*boundaryConditions)[*iter] = periodicCondition;
786  }
787  else
788  {
789  ASSERTL0(false, "Periodic boundary conditions should "
790  "be explicitely defined");
791  }
792  }
793  }
794  else if (conditionType == "C")
795  {
796  ASSERTL0(false, "Cauchy type boundary conditions not "
797  "implemented.");
798  }
799 
800  conditionElement = conditionElement->NextSiblingElement();
801  }
802 
803  m_boundaryConditions[boundaryRegionID] = boundaryConditions;
804  regionElement = regionElement->NextSiblingElement("REGION");
805  }
806 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
BoundaryRegionCollection m_boundaryRegions
Definition: Conditions.h:274
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:53
std::map< int, LibUtilities::CommSharedPtr > m_boundaryCommunicators
Definition: Conditions.h:276
std::shared_ptr< BoundaryConditionMap > BoundaryConditionMapShPtr
Definition: Conditions.h:225
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::shared_ptr< BoundaryConditionBase > BoundaryConditionShPtr
Definition: Conditions.h:219
LibUtilities::SessionReaderSharedPtr m_session
Definition: Conditions.h:272
BoundaryConditionCollection m_boundaryConditions
Definition: Conditions.h:275
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
Definition: StdRegions.hpp:358
static bool GenerateSeqVector(const std::string &str, std::vector< unsigned int > &out)
Takes a comma-separated compressed string and converts it to entries in a vector. ...
Definition: ParseUtils.cpp:108

◆ ReadBoundaryRegions()

void Nektar::SpatialDomains::BoundaryConditions::ReadBoundaryRegions ( TiXmlElement *  regions)
private

All elements are of the form: "<B ID="#"> ... </B>", with ? being the element type.

Definition at line 232 of file Conditions.cpp.

References ASSERTL0, m_boundaryRegions, and m_meshGraph.

Referenced by Read().

233 {
234  // ensure boundary regions only read once per class definition
235  if (m_boundaryRegions.size() != 0)
236  {
237  return;
238  }
239 
240  TiXmlElement *boundaryRegions =
241  conditions->FirstChildElement("BOUNDARYREGIONS");
242  ASSERTL0(boundaryRegions, "Unable to find BOUNDARYREGIONS block.");
243 
244  // See if we have boundary regions defined.
245  TiXmlElement *boundaryRegionsElement =
246  boundaryRegions->FirstChildElement("B");
247 
248  while (boundaryRegionsElement)
249  {
250  /// All elements are of the form: "<B ID="#"> ... </B>", with
251  /// ? being the element type.
252  int indx;
253  int err = boundaryRegionsElement->QueryIntAttribute("ID", &indx);
254  ASSERTL0(err == TIXML_SUCCESS, "Unable to read attribute ID.");
255 
256  TiXmlNode *boundaryRegionChild = boundaryRegionsElement->FirstChild();
257  // This is primarily to skip comments that may be present.
258  // Comments appear as nodes just like elements.
259  // We are specifically looking for text in the body
260  // of the definition.
261  while (boundaryRegionChild &&
262  boundaryRegionChild->Type() != TiXmlNode::TINYXML_TEXT)
263  {
264  boundaryRegionChild = boundaryRegionChild->NextSibling();
265  }
266 
267  ASSERTL0(boundaryRegionChild,
268  "Unable to read variable definition body.");
269  std::string boundaryRegionStr =
270  boundaryRegionChild->ToText()->ValueStr();
271 
272  std::string::size_type indxBeg =
273  boundaryRegionStr.find_first_of('[') + 1;
274  std::string::size_type indxEnd =
275  boundaryRegionStr.find_last_of(']') - 1;
276 
277  ASSERTL0(indxBeg <= indxEnd,
278  (std::string("Error reading boundary region definition:") +
279  boundaryRegionStr)
280  .c_str());
281 
282  std::string indxStr =
283  boundaryRegionStr.substr(indxBeg, indxEnd - indxBeg + 1);
284 
285  if (!indxStr.empty())
286  {
287  // Extract the composites from the string and return them in a list.
288  BoundaryRegionShPtr boundaryRegion(
290 
291  ASSERTL0(m_boundaryRegions.count(indx) == 0,
292  "Boundary region " + indxStr +
293  " defined more than "
294  "once!");
295 
296  m_meshGraph->GetCompositeList(indxStr, *boundaryRegion);
297  if (boundaryRegion->size() > 0)
298  {
299  m_boundaryRegions[indx] = boundaryRegion;
300  }
301  }
302 
303  boundaryRegionsElement =
304  boundaryRegionsElement->NextSiblingElement("B");
305  }
306 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
BoundaryRegionCollection m_boundaryRegions
Definition: Conditions.h:274
std::shared_ptr< BoundaryRegion > BoundaryRegionShPtr
Definition: Conditions.h:215
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
MeshGraphSharedPtr m_meshGraph
The mesh graph to use for referencing geometry info.
Definition: Conditions.h:271

Member Data Documentation

◆ m_boundaryCommunicators

std::map<int, LibUtilities::CommSharedPtr> Nektar::SpatialDomains::BoundaryConditions::m_boundaryCommunicators
protected

Definition at line 276 of file Conditions.h.

Referenced by CreateBoundaryComms(), and ReadBoundaryConditions().

◆ m_boundaryConditions

BoundaryConditionCollection Nektar::SpatialDomains::BoundaryConditions::m_boundaryConditions
protected

Definition at line 275 of file Conditions.h.

Referenced by ReadBoundaryConditions().

◆ m_boundaryRegions

BoundaryRegionCollection Nektar::SpatialDomains::BoundaryConditions::m_boundaryRegions
protected

Definition at line 274 of file Conditions.h.

Referenced by CreateBoundaryComms(), ReadBoundaryConditions(), and ReadBoundaryRegions().

◆ m_meshGraph

MeshGraphSharedPtr Nektar::SpatialDomains::BoundaryConditions::m_meshGraph
protected

The mesh graph to use for referencing geometry info.

Definition at line 271 of file Conditions.h.

Referenced by ReadBoundaryRegions().

◆ m_session

LibUtilities::SessionReaderSharedPtr Nektar::SpatialDomains::BoundaryConditions::m_session
protected

Definition at line 272 of file Conditions.h.

Referenced by BoundaryConditions(), CreateBoundaryComms(), and ReadBoundaryConditions().