32#include <vtkSmartPointer.h>
33#include <vtkXMLReader.h>
34#include <vtkXMLWriter.h>
35#include <vtkXMLUnstructuredGridReader.h>
36#include <vtkXMLPolyDataReader.h>
37#include <vtkDataSetReader.h>
38#include <vtkDataSet.h>
39#include <vtkUnstructuredGrid.h>
40#include <vtkPolyData.h>
41#include <vtkStructuredGrid.h>
42#include <vtkPointData.h>
43#include <vtkCellData.h>
44#include <vtkFieldData.h>
45#include <vtkCellTypes.h>
46#include <vtkDataArray.h>
60template<
class TReader>
63 vtkSmartPointer<TReader> reader =
64 vtkSmartPointer<TReader>::New();
65 reader->SetFileName(fileName);
68 if ( !reader->GetOutput() ) {
69 throw "Unable to open file.";
72 reader->GetOutput()->Register(reader);
74 return vtkDataSet::SafeDownCast(reader->GetOutput());
101 int8_t *ptMeditRef, int8_t *eltMeditRef,
102 int *nsols, int8_t *metricData ) {
104 static int8_t mmgWarn0 = 0;
105 static int8_t mmgWarn1 = 0;
114 mesh->
np = dataset->GetNumberOfPoints();
115 vtkIdType numCells = dataset->GetNumberOfCells();
118 for ( vtkIdType i = 0; i < numCells; i++ ) {
119 int typ = dataset->GetCellType(i);
124 case ( VTK_POLY_LINE ):
125 printf(
"polylin %lld \n", dataset->GetCell(i)->GetNumberOfPoints() - 1 );
127 printf(
"%lld %lld %lld\n", dataset->GetCell(i)->GetPointId(0)+1,
128 dataset->GetCell(i)->GetPointId(1)+1,dataset->GetCell(i)->GetPointId(2)+1);
129 mesh->
na += dataset->GetCell(i)->GetNumberOfPoints() - 1;
134 case ( VTK_TRIANGLE ):
148 printf(
" ## Warning:%s: unexpected element type (%d).",__func__,typ);
157 auto *pd = dataset->GetPointData();
160 int nmetricField = 0;
164 npointData = pd->GetNumberOfArrays();
165 for (
int k = 0; k < npointData; k++) {
166 if ( strstr(pd->GetArrayName(k),
":metric" ) ) {
169 else if ( strstr(pd->GetArrayName(k),
"medit:ref" ) ) {
175 if ( npointRef > 1 ) {
176 printf(
" ## Warning:%s: %d reference fields detected (labelled 'medit:ref')."
177 " Only the last is used, others are ignored.", __func__, npointRef);
179 if ( nmetricField > 1 ) {
180 printf(
" ## Error:%s: %d metric fields detected (labelled with a string"
181 " containing the 'metric' keyword).\n"
182 " Exit Program.\n",__func__,nmetricField);
188 auto *cd = dataset->GetCellData();
194 ncellData = cd->GetNumberOfArrays();
195 for (
int k = 0; k < ncellData; k++) {
196 if ( strstr(cd->GetArrayName(k),
"medit:ref" ) ) {
204 auto *fd = dataset->GetFieldData();
205 if ( fd->GetNumberOfArrays() ) {
206 printf(
" ## Warning:%s: VTK field data not used in Mmg."
207 " Ignored.\n",__func__ );
210 *nsols = npointData + ncellData - npointRef - ncellRef;
211 *metricData = ( nmetricField > 0 );
231 int8_t *ptMeditRef,int8_t *eltMeditRef,
int *nsols,
232 int8_t *metricData) {
235 (*ptMeditRef) = (*eltMeditRef) = -1;
239 (*dataset) = MMG5_load_vtkXMLFile<vtkXMLPolyDataReader> (
filename );
270 int8_t *ptMeditRef,int8_t *eltMeditRef,
int *nsols,
271 int8_t *metricData ) {
274 (*ptMeditRef) = (*eltMeditRef) = -1;
278 (*dataset) = MMG5_load_vtkXMLFile<vtkDataSetReader> (
filename );
309 int8_t *ptMeditRef,int8_t *eltMeditRef,
int *nsols,
310 int8_t *metricData) {
313 (*ptMeditRef) = (*eltMeditRef) = -1;
318 (*dataset) = MMG5_load_vtkXMLFile<vtkXMLUnstructuredGridReader> (
filename );
347 int8_t ptMeditRef,int8_t eltMeditRef,
int nsols) {
348 vtkSmartPointer<vtkDataArray> ptar = NULL, car = NULL;
351 static int8_t mmgWarn1 = 0;
354 if ( ptMeditRef > -1 ) {
355 auto *pd = (*dataset)->GetPointData();
356 ptar = pd->GetArray(ptMeditRef);
359 assert ( strstr( ptar->GetName(),
"medit:ref" ) );
362 assert ( ptar->GetNumberOfComponents() == 1 );
364 MMG5_int np = ptar->GetNumberOfTuples();
366 printf(
" ## Error: Point data size (%" MMG5_PRId
") differs from the number of"
367 " vertices (%" MMG5_PRId
")\n",np,
mesh->
np);
371 for ( vtkIdType k = 0; k < (*dataset)->GetNumberOfPoints(); k++ ) {
376 ppt->
ref = ptar->GetTuple1(k);
377 if ( ppt->
ref < 0 ) {
385 for ( vtkIdType k = 0; k < (*dataset)->GetNumberOfPoints(); k++ ) {
409 vtkIdType numCells = (*dataset)->GetNumberOfCells();
411 if ( eltMeditRef > -1 ) {
413 car = (*dataset)->GetCellData()->GetArray(eltMeditRef);
416 assert ( strstr( car->GetName(),
"medit:ref" ) );
418 assert ( car->GetNumberOfComponents() == 1 );
420 MMG5_int ne = car->GetNumberOfTuples();
421 if ( ne != numCells ) {
422 printf(
" ## Error: Cell data size (%" MMG5_PRId
") differs from the number of"
423 " cells (%lld)\n",ne,numCells);
429 for ( vtkIdType k = 0; k < numCells; k++ ) {
437 int typ = (*dataset)->GetCellType(k);
443 ppt->
ref = car ? car->GetTuple1(k) : 0;
444 if ( ppt->
ref < 0 ) {
449 case ( VTK_POLY_LINE ):
451 n = (*dataset)->GetCell(k)->GetNumberOfPoints() - 1;
453 for (
int i=0; i<n; ++i ) {
455 ref = car ? car->GetTuple1(k) : 0;
463 for (
int i=0; i < n; ++i ) {
465 pa->
a = (*dataset)->GetCell(k)->GetPointId(i) +1;
466 pa->
b = (*dataset)->GetCell(k)->GetPointId(i+1)+1;
480 ref = car ? car->GetTuple1(k) : 0;
489 pa->
a = (*dataset)->GetCell(k)->GetPointId(0)+1;
490 pa->
b = (*dataset)->GetCell(k)->GetPointId(1)+1;
498 assert( na+nbl_a <= mesh->na );
501 case ( VTK_TRIANGLE ):
503 ref = car ? car->GetTuple1(k) : 0;
512 for (
int i=0; i<3; ++i ) {
513 ptt->
v[i] = (*dataset)->GetCell(k)->GetPointId(i)+1;
517 if ( ptt->
ref < 0 ) {
526 pq->
ref = car ? car->GetTuple1(k) : 0;
527 for (
int i=0; i<4; ++i ) {
528 pq->
v[i] = (*dataset)->GetCell(k)->GetPointId(i)+1;
541 pt->
ref = car ? car->GetTuple1(k) : 0;
542 for (
int i=0; i<4; ++i ) {
543 pt->
v[i] = (*dataset)->GetCell(k)->GetPointId(i)+1;
556 ppr->
ref = car ? car->GetTuple1(k) : 0;
557 for (
int i=0; i<6; ++i ) {
558 ppr->
v[i] = (*dataset)->GetCell(k)->GetPointId(i)+1;
560 if ( ppr->
ref < 0 ) {
568 printf(
" ## Warning:%s: unexpected element type (%d).\n",
581 assert ( na + nbl_a ==
mesh->
na );
582 assert ( nt + nbl_t ==
mesh->
nt );
590 else if ( nt < mesh->nt ) {
592 fprintf(stderr,
" Exit program.\n");
602 else if ( na < mesh->na ) {
604 fprintf(stderr,
" Exit program.\n");
614 if (
ier < 1 )
return ier;
626 auto *pd = (*dataset)->GetPointData();
628 auto *cd = (*dataset)->GetCellData();
631 int npointData = pd->GetNumberOfArrays();
633 for (
int j = 0; j < npointData; j++) {
637 strcpy(chaine,pd->GetArrayName(j));
639 if ( strstr(chaine,
"medit:ref" ) ) {
642 else if ( (ptr = strstr(chaine,
":metric")) ) {
656 fprintf(stderr,
"\n ## Warning: %s: unable to set solution name for"
657 " at least 1 solution.\n",__func__);
661 auto ar = pd->GetArray(j);
663 psl->
np = ar->GetNumberOfTuples();
665 fprintf(stderr,
" ** MISMATCHES DATA: THE NUMBER OF VERTICES IN "
666 "THE MESH (%" MMG5_PRId
") DIFFERS FROM THE NUMBER OF VERTICES IN "
667 "THE SOLUTION (%" MMG5_PRId
") \n",
mesh->
np,psl->
np);
671 int ncp = ar->GetNumberOfComponents();
677 else if ( ncp == 2 || ncp == 3 ) {
693 fprintf(stderr,
" ** UNEXPECTED NUMBER OF COMPONENTS (%d). IGNORED \n",ncp);
702 fprintf(stderr,
" Exit program.\n");
706 switch ( psl->
type ) {
707 case ( 1 ):
case ( 2 ):
708 for (MMG5_int k=1; k<=psl->
np; k++) {
709 MMG5_int iadr = k*psl->
size;
710 ar->GetTuple ( k-1, &psl->
m[iadr] );
718 for (MMG5_int k=1; k<=psl->
np; k++) {
719 ar->GetTuple ( k-1, dbuf );
720 MMG5_int iadr = psl->
size*k;
724 if ( psl->
dim ==2 ) {
725 psl->
m[iadr] = dbuf[0];
726 psl->
m[iadr+1] = dbuf[1];
727 psl->
m[iadr+2] = dbuf[3];
728 psl->
m[iadr+3] = dbuf[4];
731 for (
int i=0 ; i<9 ; i++ ) {
732 psl->
m[iadr+i] = dbuf[i];
738 if ( psl->
dim ==2 ) {
739 assert ( dbuf[1] == dbuf[2] );
741 psl->
m[iadr] = dbuf[0];
742 psl->
m[iadr+1] = dbuf[1];
743 psl->
m[iadr+2] = dbuf[3];
746 assert ( dbuf[1]==dbuf[3] || dbuf[2]==dbuf[6] || dbuf[5]==dbuf[7] );
748 psl->
m[iadr+0] = dbuf[0];
749 psl->
m[iadr+1] = dbuf[1];
750 psl->
m[iadr+2] = dbuf[2];
751 psl->
m[iadr+3] = dbuf[4];
752 psl->
m[iadr+4] = dbuf[5];
753 psl->
m[iadr+5] = dbuf[8];
760 fprintf(stderr,
" ** UNEXPECTED METRIC TYPE (%d). EXIT PROGRAM \n",psl->
type);
768 int ncellData = cd->GetNumberOfArrays();
770 for (
int j = 0; j < ncellData; j++) {
773 strcpy(chaine,cd->GetArrayName(j));
775 if ( strstr(chaine,
"medit:ref" ) ) {
788 fprintf(stderr,
"\n ## Warning: %s: unable to set solution name for"
789 " at least 1 solution.\n",__func__);
793 auto ar = cd->GetArray(j);
795 psl->
np = ar->GetNumberOfTuples();
796 if ( numCells != psl->
np ) {
797 fprintf(stderr,
" ** MISMATCHES DATA: THE NUMBER OF ELEMENTS IN "
798 "THE MESH (%" MMG5_PRId
") DIFFERS FROM THE NUMBER OF CELLS DATA IN "
799 "THE SOLUTION (%" MMG5_PRId
") \n",
mesh->
ne,psl->
np);
803 int ncp = ar->GetNumberOfComponents();
809 else if ( ncp == 2 || ncp == 3 ) {
819 fprintf(stderr,
" ** UNEXPECTED NUMBER OF COMPONENTS (%d). IGNORED \n",ncp);
828 fprintf(stderr,
" Exit program.\n");
832 switch ( psl->
type ) {
833 case ( 1 ):
case ( 2 ):
834 for (MMG5_int k=1; k<=psl->
np; k++) {
835 MMG5_int iadr = k*psl->
size;
836 ar->GetTuple ( k-1, &psl->
m[iadr] );
844 for (MMG5_int k=1; k<=psl->
np; k++) {
845 ar->GetTuple ( k-1, dbuf );
846 MMG5_int iadr = psl->
size*k;
849 if ( psl->
dim ==2 ) {
850 psl->
m[iadr] = dbuf[0];
851 psl->
m[iadr+1] = dbuf[1];
852 psl->
m[iadr+2] = dbuf[3];
853 psl->
m[iadr+3] = dbuf[4];
856 for (
int i=0 ; i<9 ; i++ ) {
857 psl->
m[iadr+i] = dbuf[i];
864 fprintf(stderr,
" ** UNEXPECTED METRIC TYPE (%d). EXIT PROGRAM \n",psl->
type);
875 (*dataset)->Delete();
int MMG5_Set_inputSolName(MMG5_pMesh mesh, MMG5_pSol sol, const char *solin)
MMG5_pMesh MMG5_pSol * sol
MMG5_pMesh char * filename
int MMG5_check_readedMesh(MMG5_pMesh mesh, MMG5_int nref)
#define MMG5_SAFE_CALLOC(ptr, size, type, law)
#define MMG5_ADD_MEM(mesh, size, message, law)
#define MMG5_FILESTR_LGTH
#define MMG5_DEL_MEM(mesh, ptr)
#define MMG5_SAFE_RECALLOC(ptr, prevSize, newSize, type, message, law)
Structure to store edges of a MMG mesh.
Structure to store points of a MMG mesh.
int MMG5_loadVtkMesh_part2(MMG5_pMesh mesh, MMG5_pSol *sol, vtkDataSet **dataset, int8_t ptMeditRef, int8_t eltMeditRef, int nsols)
int MMG5_loadVtpMesh_part1(MMG5_pMesh mesh, const char *filename, vtkDataSet **dataset, int8_t *ptMeditRef, int8_t *eltMeditRef, int *nsols, int8_t *metricData)
static int MMG5_count_vtkEntities(vtkDataSet *dataset, MMG5_pMesh mesh, int8_t *ptMeditRef, int8_t *eltMeditRef, int *nsols, int8_t *metricData)
int MMG5_loadVtuMesh_part1(MMG5_pMesh mesh, const char *filename, vtkDataSet **dataset, int8_t *ptMeditRef, int8_t *eltMeditRef, int *nsols, int8_t *metricData)
vtkDataSet * MMG5_load_vtkXMLFile(const char *fileName)
I/O at VTK format.
int MMG5_loadVtkMesh_part1(MMG5_pMesh mesh, const char *filename, vtkDataSet **dataset, int8_t *ptMeditRef, int8_t *eltMeditRef, int *nsols, int8_t *metricData)