310 info() <<
"[XmfMeshWriter::writeMeshToFile] nNodes=" <<
mesh->nbNode() <<
" nCells=" <<
mesh->nbCell()
311 <<
" all=" <<
mesh->allNodes().size() <<
", own=" <<
mesh->ownNodes().size();
316 XdmfRoot* xmfRoot =
new XdmfRoot();
317 XdmfDOM* xmfDom =
new XdmfDOM();
318 String h5_file_name = file_name +
".h5";
321 ARCANE_FATAL(
"Could not remove .h5 file '{0}'", h5_file_name);
322 String xmfDomFileName(file_name);
324 if (!xmfDomFileName.
endsWith(
".xmf"))
325 xmfDomFileName = file_name +
".xmf";
326 if (xmfDom->SetWorkingDirectory(
".") != XDMF_SUCCESS)
327 throw IOException(
"writeMeshToFile",
"SetOutputFileName");
328 if (xmfDom->SetOutputFileName(xmfDomFileName.
localstr()) != XDMF_SUCCESS)
329 throw IOException(
"writeMeshToFile",
"SetOutputFileName");
330 xmfRoot->SetDOM(xmfDom);
332 info() <<
"XDMF-side initialisation done filename='" << xmfDomFileName <<
"'";
335 XdmfDomain* xmfDomain =
new XdmfDomain();
336 xmfDomain->SetName(file_name.
localstr());
337 xmfRoot->Insert(xmfDomain);
338 info() <<
"[XmfMeshWriter] Domain initialisation done";
341 XdmfGrid* xmfGrid =
new XdmfGrid();
342 xmfGrid->SetGridType(XDMF_GRID_UNIFORM);
343 info() <<
"[XmfMeshWriter] Grid initialisation done";
348 XdmfAttribute* xmfCellAttribute =
new XdmfAttribute();
349 xmfCellAttribute->SetName(
"CellsUniqueIDs");
350 xmfCellAttribute->SetAttributeCenter(XDMF_ATTRIBUTE_CENTER_CELL);
351 xmfCellAttribute->SetAttributeType(XDMF_ATTRIBUTE_TYPE_SCALAR);
352 XdmfArray* xmfCellsUniqueIDs = xmfCellAttribute->GetValues();
353 String heavyDataForCellsUniqueIDs(h5_file_name +
":/CellsUniqueIDs");
354 xmfCellsUniqueIDs->SetHeavyDataSetName(heavyDataForCellsUniqueIDs.
localstr());
355 xmfCellsUniqueIDs->SetNumberType(XDMF_INT32_TYPE);
356 xmfCellsUniqueIDs->SetNumberOfElements(
mesh->nbCell());
357 XdmfInt64 cellIndex = 0;
362 XdmfAttribute* xmfNodeAttribute =
new XdmfAttribute();
363 xmfNodeAttribute->SetName(
"NodesUniqueIDs");
364 xmfNodeAttribute->SetAttributeCenter(XDMF_ATTRIBUTE_CENTER_NODE);
365 xmfNodeAttribute->SetAttributeType(XDMF_ATTRIBUTE_TYPE_SCALAR);
366 XdmfArray* xmfNodesUniqueIDs = xmfNodeAttribute->GetValues();
367 String heavyDataForNodesUniqueIDs(h5_file_name +
":/NodesUniqueIDs");
368 xmfNodesUniqueIDs->SetHeavyDataSetName(heavyDataForNodesUniqueIDs.
localstr());
369 xmfNodesUniqueIDs->SetNumberType(XDMF_INT32_TYPE);
370 xmfNodesUniqueIDs->SetNumberOfElements(
mesh->nbNode());
376 XdmfAttribute* xmfOwnerAttribute =
new XdmfAttribute();
377 xmfOwnerAttribute->SetName(
"NodesOwner");
378 xmfOwnerAttribute->SetAttributeCenter(XDMF_ATTRIBUTE_CENTER_NODE);
379 xmfOwnerAttribute->SetAttributeType(XDMF_ATTRIBUTE_TYPE_SCALAR);
380 XdmfArray* xmfNodesOwners = xmfOwnerAttribute->GetValues();
381 String heavyDataForOwners(h5_file_name +
":/NodesOwners");
382 xmfNodesOwners->SetHeavyDataSetName(heavyDataForOwners.
localstr());
383 xmfNodesOwners->SetNumberType(XDMF_INT32_TYPE);
384 xmfNodesOwners->SetNumberOfElements(
mesh->nbNode());
385 XdmfInt64 nodeIndex = 0;
387 nodesUniqueIDs.
add(iNode->uniqueId().asInteger());
388 xmfNodesUniqueIDs->SetValue(nodeIndex, iNode->uniqueId().asInteger());
389 xmfNodesOwners->SetValue(nodeIndex++, iNode->owner());
393 info() <<
"[XmfMeshWriter] Focussing on the topology";
394 XdmfTopology* xmfTopology = xmfGrid->GetTopology();
395 xmfTopology->SetTopologyType(XDMF_MIXED);
396 xmfTopology->SetNumberOfElements(
mesh->nbCell());
397 XdmfArray* xmfConnectivityArray = xmfTopology->GetConnectivity();
398 String heavyDataForConnections(h5_file_name +
":/Connections");
399 xmfConnectivityArray->SetHeavyDataSetName(heavyDataForConnections.
localstr());
400 xmfConnectivityArray->SetNumberType(XDMF_INT32_TYPE);
405 xmfCellsUniqueIDs->SetValue(cellIndex++, iCell->uniqueId().asInteger());
406 _switchXmfType(cell.
type(), arcCellConnectivityArray);
408 for (
Integer j = 0; j < nbNodes; ++j) {
410 for (
Integer i = 0; i < meshNbNodes; ++i) {
412 if (nodesUniqueIDs[i] != uid)
414 arcCellConnectivityArray.
add(i);
419 xmfConnectivityArray->SetNumberOfElements(arcCellConnectivityArray.
size());
420 info() <<
"[XmfMeshWriter] arcCellConnectivityArray.size()=" << arcCellConnectivityArray.
size();
421 for (XdmfInt32 idx = 0; idx < arcCellConnectivityArray.
size(); ++idx)
422 xmfConnectivityArray->SetValue(idx, arcCellConnectivityArray[idx]);
423 info() <<
"[XmfMeshWriter] Work on grid->topology done";
426 XdmfGeometry* xmfGeometry = xmfGrid->GetGeometry();
427 xmfGeometry->SetGeometryType(XDMF_GEOMETRY_XYZ);
429 XdmfArray* xmfNodeGeometryArray = xmfGeometry->GetPoints();
430 String heavyDataForGeometry(h5_file_name +
":/XYZ");
431 xmfNodeGeometryArray->SetHeavyDataSetName(heavyDataForGeometry.
localstr());
432 xmfNodeGeometryArray->SetNumberType(XDMF_FLOAT32_TYPE);
433 xmfNodeGeometryArray->SetNumberOfElements(3 *
mesh->nbNode());
437 const Node& node = *iNode;
438 xmfNodeGeometryArray->SetValue(Index++,
Convert::toDouble(nodes_coords[iNode].x));
439 xmfNodeGeometryArray->SetValue(Index++,
Convert::toDouble(nodes_coords[iNode].y));
440 xmfNodeGeometryArray->SetValue(Index++,
Convert::toDouble(nodes_coords[iNode].z));
443 info() <<
"[XmfMeshWriter] Work on Geometry done";
444 xmfDomain->Insert(xmfGrid);
452 info() <<
"[XmfMeshWriter] Working on Groups";
454 if ((*arcGroup ==
mesh->cellFamily()->allItems()) || (*arcGroup ==
mesh->nodeFamily()->allItems()) ||
455 (*arcGroup ==
mesh->edgeFamily()->allItems()) || (*arcGroup ==
mesh->faceFamily()->allItems()))
457 info() <<
"[writeMeshToFile] Found a " << arcGroup->itemKind() <<
"-group " << arcGroup->name();
458 XdmfAttribute* xmfAttribute =
new XdmfAttribute();
459 xmfAttribute->SetName(arcGroup->name().localstr());
460 xmfAttribute->SetAttributeCenter(XDMF_ATTRIBUTE_CENTER_NODE);
461 xmfAttribute->SetAttributeType(XDMF_ATTRIBUTE_TYPE_SCALAR);
462 XdmfArray* xmfGroup = xmfAttribute->GetValues();
463 String heavyDataForGroup(h5_file_name +
":/" + arcGroup->name());
464 xmfGroup->SetHeavyDataSetName(heavyDataForGroup.
localstr());
465 xmfGroup->SetNumberType(XDMF_INT32_TYPE);
466 xmfGroup->SetNumberOfElements(1 + arcGroup->size());
468 xmfGroup->SetValue(Index++, arcGroup->itemKind());
470 xmfGroup->SetValue(Index++, iItem->uniqueId().asInteger());
472 xmfGrid->Insert(xmfAttribute);
474 xmfGrid->Insert(xmfCellAttribute);
475 xmfGrid->Insert(xmfNodeAttribute);
476 xmfGrid->Insert(xmfOwnerAttribute);
484 delete xmfCellAttribute;
485 delete xmfNodeAttribute;
486 delete xmfOwnerAttribute;
492 info() <<
"[XmfMeshWriter] Done";