<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="FR" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hello,</span><span lang="EN-US" style="font-size:12.0pt;mso-fareast-language:FR"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I am working at the french CEA "French Alternative Energies and Atomic Energy Commission" on the development of a new finite-elements/finite-volume software for mechanical applications.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Until now, we had an internal data base for storing and querying adjencencies/connectivities between mesh entities. In this legacy data structure, every adjacencies/connectivities are computed and stored at the beginning
 of the computation, and then queries during the actual computation steps just "read" in this data structure. Our problem is that this legacy data structure is way too "static": for example, it is very difficult to add/remove cells (for AMR, or load balancing
 for example) during the computation steps.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">So we consider replacing our legacy data/structure by moab. We already did this replacement in a dedicated branch of our software, and it works (it succeed to pass our test base). But the cpu costs of adjacencies queries
 increased hugely... For example, for a finite-volume fluid computation (the cells "often" query their adjacent faces, and the faces "often" query their adjacent cells), with our legacy structure, the adjacency queries cost about nothing, and with moab cost
 about 50% of the total computation!<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Maybe we just misuse moab? In the moab documentation, it is written that "Non-vertex entity to entity adjacencies are never stored, unless explicitly requested by the application.". Because memory consumption is not our
 primary concern, we tried that, assuming that the request for storing adjacencies is done with the "add_adjacencies" function (in the end of this message a very simple sample code representative of what we do with moab is provided). But the cost of the adjacency
 queries is still very high... <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Does moab actually store the adjacencies with "add_adjacencies"? For example, by following in a debugger what moab does on the sample program provided when querying the edges adjacent to a quadrangular cell, it seems
 that whereas the adjacencies being stored, moab:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">- get the nodes of each edges of the quadrangle<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">- for each edge represented by its two vertices, loop over some existing edges represented by their EntityHandle to find which one matches the current edge (a large portion of the computation time is spent in "moab::AEntityFactory::entities_equivalent(unsigned
 long, unsigned long const*, int, moab::EntityType)" )<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">We see in the code that there is a "create_adjacency_option" that is not yet supported. Could this option help once implemented? We also checked the AHF feature. At this time, this feature cannot apply in our applications
 because it is not compatible with modified and mixed-type meshes. Is it planned for AHF to become compatible with modified and mixed-type meshes?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Is there something that we miss, or a more efficient way to use moab?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal">Many thanks,<o:p></o:p></p>
<p class="MsoNormal"><b><span style="font-size:12.0pt;font-family:"Courier New",serif;color:#1F497D;mso-fareast-language:FR">_____________________________</span></b><span style="font-family:"Courier New",serif;color:black;mso-fareast-language:FR"><o:p></o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Courier New",serif;color:navy;mso-fareast-language:FR">Olivier JAMOND</span></b><span style="font-size:10.0pt;font-family:"Courier New",serif;color:black;mso-fareast-language:FR"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New",serif;color:black;mso-fareast-language:FR">Laboratoire d'études de dynamique<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New",serif;color:black;mso-fareast-language:FR">CEA Saclay, DEN/DANS/DM2S/SEMT/DYN<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New",serif;color:black;mso-fareast-language:FR">F-91191 GIF SUR YVETTE, FRANCE<o:p></o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Courier New",serif;mso-fareast-language:FR">Tél. : 01.69.08.44.90<o:p></o:p></span></b></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New",serif">* ------------- Sample code --------------- *<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New",serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New",serif">#include <iostream><br>
#include <sstream><br>
#include <vector><br>
<br>
#include "moab/Core.hpp"<br>
<br>
//<br>
// 3 ----- 5 ----- 5<br>
// |       |       |<br>
// |       |       |<br>
// |       |       |<br>
// 0 ----- 1 ----- 4<br>
//<br>
<br>
int main() <br>
{<br>
<br>
  std::vector<moab::EntityHandle> adj;<br>
  <br>
  // > init moab<br>
  moab::Core mb;<br>
  mb.set_dimension(2);<br>
  // <<br>
<br>
  // > create the vertices (foo coordinates)<br>
  double coords[3]={0.,0.,0.};<br>
<br>
  std::vector<moab::EntityHandle> nodes;<br>
  nodes.resize(6);<br>
  mb.create_vertex(coords, nodes[0]);<br>
  mb.create_vertex(coords, nodes[1]);<br>
  mb.create_vertex(coords, nodes[2]);<br>
  mb.create_vertex(coords, nodes[3]);<br>
  mb.create_vertex(coords, nodes[4]);<br>
  mb.create_vertex(coords, nodes[5]);<br>
  // <<br>
<br>
  // > create the 2 quadrangles<br>
  moab::EntityHandle q0;<br>
  std::vector<moab::EntityHandle> conn0;<br>
  conn0.resize(4);<br>
  conn0[0]=nodes[0];<br>
  conn0[1]=nodes[1];<br>
  conn0[2]=nodes[2];<br>
  conn0[3]=nodes[3];<br>
  mb.create_element(moab::MBQUAD, conn0.data(), 4, q0);<br>
<br>
  moab::EntityHandle q1;<br>
  std::vector<moab::EntityHandle> conn1;<br>
  conn1.resize(4);<br>
  conn1[0]=nodes[1];<br>
  conn1[1]=nodes[4];<br>
  conn1[2]=nodes[5];<br>
  conn1[3]=nodes[2];<br>
  mb.create_element(moab::MBQUAD, conn1.data(), 4, q1);<br>
  // <<br>
<br>
  // > compute and store cell<->face adjacencies<br>
  adj.clear();<br>
  mb.get_adjacencies (&q0, 1, 1, true, adj);<br>
  mb.add_adjacencies(q0, adj.data(), adj.size(), true);<br>
  adj.clear();<br>
  mb.get_adjacencies (&q1, 1, 1, true, adj);<br>
  mb.add_adjacencies(q1, adj.data(), adj.size(), true);<br>
  // <<br>
<br>
  // > example of queries<br>
  // > get the faces of the first cell<br>
  adj.clear();<br>
  mb.get_adjacencies (&q1, 1, 1, false, adj);<br>
  std::cout << "## face of the first cell -------------------#\n";<br>
  mb.list_entities(adj.data(), adj.size());<br>
  // <<br>
<br>
  // > get the face shared by the two cells<br>
  adj.clear();<br>
  moab::EntityHandle cells[2]={q0,q1};<br>
  mb.get_adjacencies(cells, 2, 1, false, adj);<br>
  std::cout << "## face shared by the two cells -------------#\n";<br>
  mb.list_entities(adj.data(), adj.size());  <br>
  // <<br>
<br>
  // > get the two cells from the middle face<br>
  moab::EntityHandle face=adj[0];<br>
  adj.clear();<br>
  mb.get_adjacencies(&face, 1, 2, false, adj);<br>
  std::cout << "## cells adjacent to the middle face --------#\n";<br>
  mb.list_entities(adj.data(), adj.size());  <br>
  // <<br>
  // <<br>
  <br>
  return 0;<br>
}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>