31#include <vtkSmartPointer.h>
32#include <vtkXMLReader.h>
33#include <vtkXMLWriter.h>
34#include <vtkXMLUnstructuredGridReader.h>
35#include <vtkXMLUnstructuredGridWriter.h>
36#include <vtkXMLPUnstructuredGridWriter.h>
37#include <vtkXMLPolyDataReader.h>
38#include <vtkXMLPolyDataWriter.h>
39#include <vtkXMLPPolyDataWriter.h>
40#include <vtkDataSetReader.h>
41#include <vtkDataSetWriter.h>
42#include <vtkPDataSetWriter.h>
43#include <vtkDataSet.h>
44#include <vtkUnstructuredGrid.h>
45#include <vtkPolyData.h>
46#include <vtkStructuredGrid.h>
47#include <vtkPointData.h>
48#include <vtkCellData.h>
49#include <vtkFieldData.h>
50#include <vtkCellTypes.h>
51#include <vtkDataArray.h>
52#include <vtkFloatArray.h>
53#include <vtkDoubleArray.h>
56#include <vtkTriangle.h>
60#include <vtkCellArray.h>
81 *ca = vtkSmartPointer< vtkCellArray >::New();
122 w->SetDataModeToBinary();
125 w->SetDataModeToAscii();
136 w->SetDataModeToBinary();
139 w->SetDataModeToAscii();
169template <
class T,
class TWriter,
class PWriter>
171 const char *mfilename,
172 int metricData,
int binary,
173 int npart,
int myid,
int master) {
174 int hasPointRef = 0, hasCellRef = 0;
177 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
180 for ( MMG5_int k=1; k<=
mesh->
np; ++k ) {
182 if ( !
MG_VOK(ppt) )
continue;
186 if (
mesh->
dim == 2 ) ppt->
c[2] = 0.;
187 if ( ppt->
ref ) hasPointRef = 1;
189 points->InsertNextPoint(ppt->
c[0], ppt->
c[1], ppt->
c[2]);
193 auto dataset = vtkSmartPointer<T> :: New();
194 dataset->SetPoints(points);
198 vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray> ::New();
199 vtkSmartPointer<vtkWedge> wedge = vtkSmartPointer<vtkWedge> ::New();
200 vtkSmartPointer<vtkTetra> tetra = vtkSmartPointer<vtkTetra> ::New();
201 vtkSmartPointer<vtkTriangle> tria = vtkSmartPointer<vtkTriangle> ::New();
202 vtkSmartPointer<vtkQuad> quadra = vtkSmartPointer<vtkQuad> ::New();
203 vtkSmartPointer<vtkLine> edge = vtkSmartPointer<vtkLine> ::New();
212 for ( MMG5_int k=1; k<=
mesh->
na; ++k ) {
214 if ( !pa || !pa->
a )
continue;
216 if ( pa->
ref ) hasCellRef = 1;
221 cellArray->InsertNextCell(edge);
222 types[ic++] = VTK_LINE;
228 for ( MMG5_int k=1; k<=
mesh->
nt; ++k ) {
230 if ( !
MG_EOK(ptt) )
continue;
232 if ( ptt->
ref ) hasCellRef = 1;
234 for (
int i=0; i<3; ++i ) {
237 cellArray->InsertNextCell(tria);
238 types[ic++] = VTK_TRIANGLE;
242 for ( MMG5_int k=1; k<=
mesh->
nquad; ++k ) {
244 if ( !
MG_EOK(pq) )
continue;
246 if ( pq->
ref ) hasCellRef = 1;
248 for (
int i=0; i<4; ++i ) {
251 cellArray->InsertNextCell(quadra);
252 types[ic++] = VTK_QUAD;
256 for ( MMG5_int k=1; k<=
mesh->
ne; ++k ) {
258 if ( !
MG_EOK(pt) )
continue;
260 if ( pt->
ref ) hasCellRef = 1;
262 for (
int i=0; i<4; ++i ) {
265 cellArray->InsertNextCell(tetra);
266 types[ic++] = VTK_TETRA;
272 if ( !
MG_EOK(ppr) )
continue;
274 if ( ppr->
ref ) hasCellRef = 1;
276 for (
int i=0; i<6; ++i ) {
279 cellArray->InsertNextCell(wedge);
280 types[ic++] = VTK_WEDGE;
290 auto *ar = vtkFloatArray::New();
292 ar->SetNumberOfComponents(1);
293 ar->SetNumberOfTuples(
mesh->
np);
294 ar->SetName(
"medit:ref");
296 for ( MMG5_int k = 0; k <
mesh->
np; k++ ) {
298 if ( !
MG_VOK(ppt) )
continue;
300 ar->SetTuple1(ppt->
tmp,ppt->
ref);
303 dataset->GetPointData()->AddArray(ar);
306 auto *ar = vtkFloatArray::New();
308 ar->SetNumberOfComponents(1);
309 ar->SetNumberOfTuples(nc);
310 ar->SetName(
"medit:ref");
313 for ( MMG5_int k = 1; k <=
mesh->
na; k++ ) {
317 for ( MMG5_int k = 1; k <=
mesh->
nt; k++ ) {
321 for ( MMG5_int k = 1; k <=
mesh->
nquad; k++ ) {
325 for ( MMG5_int k = 1; k <=
mesh->
ne; k++ ) {
329 for ( MMG5_int k = 1; k <=
mesh->
nprism; k++ ) {
334 dataset->GetCellData()->AddArray(ar);
341 if ( metricData==1 ) {
354 static int mmgWarn = 0;
355 for (
int isol=0; isol<nsols; ++isol) {
361 fprintf(stderr,
" ## Warning: %s: missing data for at least 1 solution."
362 " Skipped.\n",__func__);
368 if ( psl->
size == 1 ) {
371 else if ( psl->
size == psl->
dim ) {
378 auto *ar = vtkDoubleArray::New();
380 ar->SetNumberOfComponents(ncp);
381 ar->SetNumberOfTuples(
mesh->
np);
394 strcat ( data ,
":metric");
401 ar->SetName(
"no_name");
407 if ( psl->
size!= (psl->
dim*(psl->
dim+1))/2 ) {
409 for ( MMG5_int k=1; k<=
mesh->
np; k++) {
411 if ( !
MG_VOK(ppt) )
continue;
413 MMG5_int iadr = k*psl->
size;
414 for (
int i=0; i<psl->
size; ++i ) {
415 dfmt[i] = psl->
m[iadr+i];
418 if ( psl->
dim==2 && ncp==3 ) {
421 ar->SetTuple(ppt->
tmp,dfmt);
426 for ( MMG5_int k=1; k<=
mesh->
np; k++) {
428 if ( !
MG_VOK(ppt) )
continue;
430 MMG5_int iadr = k*psl->
size;
431 double *d = &psl->
m[iadr];
439 double dbuf[6] = {0,0,0,0,0,0};
445 for (
int i=0; i<psl->
size; i++) dbuf[i] = psl->
m[psl->
size*k+i];
457 ar->SetTuple(ppt->
tmp,dfmt);
460 dataset->GetPointData()->AddArray(ar);
467 vtkSmartPointer<PWriter> writer = vtkSmartPointer<PWriter>::New();
469#if VTK_MAJOR_VERSION <= 5
470 writer->SetInput(dataset);
472 writer->SetInputData(dataset);
475 writer->SetFileName(mfilename);
477 writer->SetNumberOfPieces(npart);
478 writer->SetStartPiece(myid);
479 writer->SetEndPiece(myid);
484 vtkSmartPointer<TWriter> writer = vtkSmartPointer<TWriter>::New();
486 writer->SetFileName(mfilename);
488#if VTK_MAJOR_VERSION <= 5
489 writer->SetInput(dataset);
491 writer->SetInputData(dataset);
515template <
class T,
class TWriter,
class PWriter>
517 int metricData,
int binary) {
520 metricData,binary,0,0,0);
char * MMG5_Get_basename(char *path)
MMG5_pMesh MMG5_pSol * sol
MMG5_pMesh char * filename
void MMG5_build3DMetric(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int ip, double dbuf[6])
#define MMG5_SAFE_CALLOC(ptr, size, type, law)
#define MMG5_SAFE_MALLOC(ptr, size, type, law)
#define MMG5_SAFE_FREE(ptr)
#define MMG5_DEL_MEM(mesh, ptr)
Structure to store edges of a MMG mesh.
Structure to store points of a MMG mesh.
int MMG5_loadVtkMesh_part1(MMG5_pMesh, const char *, vtkDataSet **, int8_t *, int8_t *, int *, int8_t *)
int MMG5_loadVtuMesh_part1(MMG5_pMesh, const char *, vtkDataSet **, int8_t *, int8_t *, int *, int8_t *)
static void MMG5_internal_VTKSetLine(vtkSmartPointer< vtkPolyData > d, vtkSmartPointer< vtkCellArray > *ca)
int MMG5_saveVtkMesh(MMG5_pMesh mesh, MMG5_pSol *sol, const char *filename, int metricData, int binary)
static void MMG5_internal_VTKbinary(vtkXMLUnstructuredGridWriter *w, int binary)
int MMG5_saveVtkMesh_i(MMG5_pMesh mesh, MMG5_pSol *sol, const char *mfilename, int metricData, int binary, int npart, int myid, int master)
int MMG5_loadVtkMesh_part2(MMG5_pMesh, MMG5_pSol *, vtkDataSet **, int8_t, int8_t, int)
static void MMG5_internal_VTKSetCells(int *t, vtkSmartPointer< vtkPolyData > d, vtkSmartPointer< vtkCellArray > ca)
int MMG5_loadVtpMesh_part1(MMG5_pMesh, const char *, vtkDataSet **, int8_t *, int8_t *, int *, int8_t *)