45 char *p_in = (
char *) &sbin;
46 char *p = (
char *)&inv;
64 char *p_in = (
char *) &sbin;
65 char *p_out = (
char *) &out;
83 char *p_in = (
char *) &sbin;
84 char *p_out = (
char *) &out;
100 char *p_in = (
char *) &sbin;
101 char *p_out = (
char *) &out;
106 p_out[i] = p_in[7-i];
128 int *np,
int *na,
int* nt,
int *nq,
int *ne,
int *npr)
132 static char mmgWarn = 0;
149 for ( idx=0; idx<num; ++idx ) {
166 for ( idx=0; idx<num; ++idx ) {
184 for ( idx=0; idx<num; ++idx ) {
203 for ( idx=0; idx<num; ++idx ) {
222 for ( idx=0; idx<num; ++idx ){
243 for ( idx=0; idx<num; ++idx ){
253 fprintf(stderr,
"\n ## Warning: %s: unexpected type of element (%d) for at"
254 " least 1 element (%d).\n",__func__,typ,k);
280 long *posNodes,
long *posElts,
281 long **posNodeData,
int *bin,
int *iswp,
282 MMG5_int *nelts,
int *nsols) {
286 int k,nt,na,nq,ne,npr,np;
287 int typ,tagNum,posNodeDataSize,initPosNodeDataSize;
298 nt = na = nq = ne = npr = np = 0;
305 initPosNodeDataSize = posNodeDataSize = 20;
309 ptr = strstr(data,
".msh");
312 strcat(data,
".mshb");
313 if (!(*inm = fopen(data,
"rb")) ) {
314 ptr = strstr(data,
".msh");
317 if( !((*inm) = fopen(data,
"rb")) ) {
325 if( !((*inm) = fopen(data,
"rb")) ) {
333 fprintf(stdout,
" %%%% %s OPENED\n",data);
339 while(fscanf((*inm),
"%127s ",&chaine[0])!=EOF ) {
340 if(!strncmp(chaine,
"$MeshFormat",strlen(
"$MeshFormat"))) {
341 MMG_FSCANF((*inm),
"%4s %d %d ",verNum,bin,&ver);
343 if ( strncmp(verNum,
"2.2",3) ) {
344 fprintf(stderr,
"\n ## Warning: %s: format version (%s) may be not supported."
345 " Please, use the format version 2.2.\n",__func__,verNum);
350 assert(oneBin==16777216);
356 }
else if(!strncmp(chaine,
"$EndMeshFormat",strlen(
"EndMeshFormat"))) {
358 }
else if(!strncmp(chaine,
"$Nodes",strlen(
"$Nodes"))) {
360 *posNodes = ftell((*inm));
364 for ( k=1; k<=
mesh->
npi; ++k ) {
370 for ( k=1; k<=
mesh->
npi; ++k ) {
377 }
else if(!strncmp(chaine,
"$EndNodes",strlen(
"$EndNodes"))) {
379 }
else if(!strncmp(chaine,
"$NodeData",strlen(
"$NodeData"))) {
381 (*posNodeData)[*nsols] = ftell((*inm));
382 if ( ++(*nsols) == posNodeDataSize ) {
384 posNodeDataSize+initPosNodeDataSize,
385 long,
"posNodeData",
return -1);
386 posNodeDataSize += initPosNodeDataSize;
393 for ( k=0; k<tagNum; ++k ) {
394 if ( 0 != fscanf((*inm),
"%*[^\n]%*c") ) {
395 fputs (
"Reading error", stderr );
402 for ( k=0; k<tagNum; ++k ) {
403 if ( 0 != fscanf((*inm),
"%*[^\n]%*c") ) {
404 fputs (
"Reading error", stderr );
414 for ( k=3; k<tagNum; ++k ) {
418 for ( k=1; k<=np; ++k ) {
424 for ( k=1; k<=np; ++k ) {
431 }
else if(!strncmp(chaine,
"$EndNodeData",strlen(
"$EndNodeData"))) {
433 }
else if(!strncmp(chaine,
"$Elements",strlen(
"$Elements"))) {
435 *posElts = ftell((*inm));
439 for ( k=0; k<*nelts; ++k) {
467 if ( 0 != fscanf((*inm),
"%*[^\n]%*c") ) {
468 fputs (
"Reading error", stderr );
482 else if(!strncmp(chaine,
"$EndElements",strlen(
"$EndElements"))) {
488 fprintf(stderr,
" ** MISSING DATA.\n");
489 fprintf(stderr,
" Check that your mesh contains points and elements.\n");
490 fprintf(stderr,
" Exit program.\n");
505 fprintf(stderr,
" ** MISSING DATA.\n");
506 fprintf(stderr,
" Check that your mesh contains points.\n");
507 fprintf(stderr,
" Exit program.\n");
536 fprintf(stdout,
"\n $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ \n");
537 fprintf(stdout,
" WARNING : %" MMG5_PRId
" entities with unexpected refs (ref< 0).",nref);
538 fprintf(stdout,
" We take their absolute values.\n");
539 fprintf(stdout,
" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ \n\n");
547 for (k=1; k<=
mesh->
nt; k++) {
550 for (i=0; i<3; i++) {
566 ptt->
v[2] = ptt->
v[1];
572 for (i=0; i<4; i++) {
581 for ( k=1; k<=
mesh->
ne; k++ ) {
583 if ( !
MG_EOK(pt) )
continue;
585 for (i=0; i<4; i++) {
605 for ( k=1; k<=
mesh->
nt; k++ ) {
607 if ( !
MG_EOK(ptt) )
continue;
608 for (i=0; i<3; i++) {
617 fprintf(stdout,
"\n $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ \n");
618 fprintf(stdout,
" BAD ORIENTATION : vol < 0 -- %8" MMG5_PRId
" element(s) reoriented\n",
mesh->
xt);
619 fprintf(stdout,
" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ \n\n");
626 for (i=0; i<6; i++) {
634 fprintf(stdout,
" NUMBER OF VERTICES %8" MMG5_PRId
"\n",
mesh->
np);
636 fprintf(stdout,
" NUMBER OF TETRAHEDRA %8" MMG5_PRId
"\n",
mesh->
ne);
639 fprintf(stdout,
" NUMBER OF PRISMS %8" MMG5_PRId
"\n",
mesh->
nprism);
641 fprintf(stdout,
" NUMBER OF TRIANGLES %8" MMG5_PRId
"\n",
mesh->
nt);
643 fprintf(stdout,
" NUMBER OF QUADRILATERALS %8" MMG5_PRId
"\n",
mesh->
nquad);
645 fprintf(stdout,
" NUMBER OF EDGES %8" MMG5_PRId
"\n",
mesh->
na);
669 const long posNodes,
const long posElts,
670 const long *posNodeData,
const int bin,
const int iswp,
671 const MMG5_int nelts,
const int nsols) {
682 int l,nref,nbl_t,nbl_a,k,v[4],nt,na,nq,ne,npr,idx,ref,num,iadr;
687 static int8_t mmgWarn=0, mmgWarn1=0;
691 fseek((*inm),posNodes,SEEK_SET);
694 for ( k=0; k<
mesh->
np; ++k)
699 for (i=0 ; i<
mesh->
dim ; i++) {
701 ppt->
c[i] = (double) fc;
708 for (i=0 ; i<
mesh->
dim ; i++) {
711 ppt->
c[i] = (double) fc;
720 for ( k=0; k<
mesh->
np; ++k)
725 MMG_FSCANF((*inm),
"%lf %lf %lf ",&ppt->
c[0],&ppt->
c[1],&ppt->
c[2]);
731 for (i=0 ; i<3 ; i++) {
743 fseek((*inm),posElts,SEEK_SET);
745 nbl_a = nbl_t = nt = na = nq = ne = npr = 0;
749 for ( k=0; k<nelts; ++k)
751 MMG_FSCANF((*inm),
"%d %d %d ",&i,&typ, &tagNum);
753 fprintf(stderr,
"\n ## Error: %s: elt %d (type %d): Expected at least 2 tags (%d given).\n",
754 __func__,k,typ,tagNum);
759 for ( l=2; l<tagNum; ++l ) {
770 MMG_FSCANF((*inm),
"%" MMG5_PRId
" %" MMG5_PRId
" ",&pa->
a,&pa->
b);
775 MMG_FSCANF((*inm),
"%" MMG5_PRId
" %" MMG5_PRId
" ",&pa->
a,&pa->
b);
783 assert( na+nbl_a<=mesh->na );
791 MMG_FSCANF((*inm),
"%" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
"",&ptt->
v[0],&ptt->
v[1],&ptt->
v[2]);
796 MMG_FSCANF((*inm),
"%" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" ",&ptt->
v[0],&ptt->
v[1],&ptt->
v[2]);
798 if ( ptt->
ref < 0 ) {
803 assert( nt+nbl_t<=mesh->nt );
808 MMG_FSCANF((*inm),
"%" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" ",&pq1->
v[0],&pq1->
v[1],&pq1->
v[2],&pq1->
v[3]);
810 if ( pq1->
ref < 0 ) {
814 assert( nq<=mesh->nquad );
820 MMG_FSCANF((*inm),
"%" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" ",&pt->
v[0],&pt->
v[1],&pt->
v[2],&pt->
v[3]);
821 pt->
ref = MMG5_abs(ref);
823 MMG_FSCANF((*inm),
"%d %d %d %d ",&v[0],&v[1],&v[2],&v[3]);
830 assert( ne<=mesh->ne );
837 MMG_FSCANF((*inm),
"%" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" ",&pp->
v[0],&pp->
v[1],&pp->
v[2],
838 &pp->
v[3],&pp->
v[4],&pp->
v[5]);
839 pp->
ref = MMG5_abs(ref);
844 assert( npr<=mesh->nprism );
851 if ( ppt->
ref < 0 ) {
855 assert( l<=mesh->np );
859 fprintf(stderr,
"\n ## Warning: %s: unexpected type for at least 1 element:"
860 " element %d, type %d\n",__func__,k,typ );
883 fprintf(stderr,
"\n ## Error: %s: Expected at least 2 tags per element (%d given).\n",
889 for ( idx=0; idx<num; ++idx ) {
895 for ( l=2; l<tagNum; ++l ) {
929 assert( na+nbl_a<=mesh->na );
943 fprintf(stderr,
"\n ## Error: %s: Expected at least 2 tags per element (%d given).\n",
949 for ( idx=0; idx<num; ++idx ) {
955 for ( l=2; l<tagNum; ++l ) {
964 for ( i=0; i<3 ; ++i ) {
971 for ( i=0; i<3 ; ++i ) {
977 if ( ptt->
ref < 0 ) {
982 assert( nt+nbl_t<=mesh->nt );
995 fprintf(stderr,
"\n ## Error: %s: Expected at least 2 tags per element (%d given).\n",
1001 for ( idx=0; idx<num; ++idx ) {
1007 for ( l=2; l<tagNum; ++l ) {
1014 for ( i=0; i<4 ; ++i ) {
1020 if ( pq1->
ref < 0 ) {
1024 assert( nq<=mesh->nquad );
1038 fprintf(stderr,
"\n ## Error: %s: Expected at least 2 tags per element (%d given).\n",
1044 for ( idx=0; idx<num; ++idx ) {
1050 for ( l=2; l<tagNum; ++l ) {
1058 for ( i=0; i<4 ; ++i ) {
1063 pt->
ref = MMG5_abs(ref);
1064 assert( ne<=mesh->ne );
1067 for ( i=0; i<4 ; ++i )
1085 fprintf(stderr,
"\n ## Error: %s: Expected at least 2 tags per element (%d given).\n",
1091 for ( idx=0; idx<num; ++idx ) {
1097 for ( l=2; l<tagNum; ++l ) {
1105 for ( i=0; i<6 ; ++i ) {
1110 pp->
ref = MMG5_abs(ref);
1111 assert( npr<=mesh->nprism );
1114 for ( i=0; i<6 ; ++i )
1133 fprintf(stderr,
"\n ## Error: %s: Expected at least 2 tags per element (%d given).\n",
1139 for ( idx=0; idx<num; ++idx ) {
1145 for ( l=2; l<tagNum; ++l ) {
1155 if ( ppt->
ref < 0 ) {
1159 assert( l<=mesh->np );
1164 fprintf(stderr,
"\n ## Error: %s: unexpected type of element (%d)\n",
1173 assert ( na + nbl_a ==
mesh->
na );
1174 assert ( nt + nbl_t ==
mesh->
nt );
1182 else if ( nt < mesh->nt ) {
1184 fprintf(stderr,
" Exit program.\n");
1195 else if ( na < mesh->na ) {
1197 fprintf(stderr,
" Exit program.\n");
1208 if (
ier < 1 )
return ier;
1218 for ( isol=0; isol < nsols; ++isol ) {
1219 assert ( posNodeData[isol] );
1222 fseek((*inm),posNodeData[isol],SEEK_SET);
1233 if ( 1 != fscanf(*inm,
"\"%127s\"\n",&chaine[0]) ) {
1238 ptr = strstr(chaine,
":metric");
1250 fprintf(stderr,
"\n ## Warning: %s: unable to set solution name for"
1251 " at least 1 solution.\n",__func__);
1255 for ( k=1; k<tagNum; ++k ) {
1256 if ( 0 != fscanf((*inm),
"%*[^\n]%*c") )
return -1;
1260 if ( fscanf((*inm),
"%d",&tagNum) ) {
1261 for ( k=0; k<tagNum; ++k ) {
1269 fprintf(stderr,
" Error: %s: node data: Expected at least 3 tags (%d given).\n",
1279 for ( k=3; k<tagNum; ++k ) {
1284 fprintf(stderr,
" ** MISMATCHES DATA: THE NUMBER OF VERTICES IN "
1285 "THE MESH (%" MMG5_PRId
") DIFFERS FROM THE NUMBER OF VERTICES IN "
1286 "THE SOLUTION (%" MMG5_PRId
") \n",
mesh->
np,psl->
np);
1295 else if ( typ == 3 ) {
1299 else if ( typ == 9 ) {
1310 fprintf(stderr,
" ** DATA TYPE IGNORED %d \n",typ);
1320 fprintf(stderr,
" Exit program.\n");
1326 if ( psl->
size == 1 ) {
1327 if ( psl->
ver == 1 ) {
1328 for (k=1; k<=psl->
np; k++) {
1338 psl->
m[idx] = fbuf[0];
1342 for (k=1; k<=psl->
np; k++) {
1352 psl->
m[idx] = dbuf[0];
1357 else if ( psl->
size == psl->
dim ) {
1358 if ( psl->
ver == 1 ) {
1359 for (k=1; k<=psl->
np; k++) {
1362 for (i=0; i<psl->
dim; i++) {
1364 psl->
m[psl->
dim*idx+i] = fbuf[0];
1369 for (i=0; i<psl->
dim; i++) {
1372 psl->
m[psl->
dim*idx+i] = fbuf[0];
1378 for (k=1; k<=psl->
np; k++) {
1382 for (i=0; i<psl->
dim; i++) {
1384 psl->
m[psl->
dim*idx+i] = dbuf[0];
1391 for (i=0; i<psl->
dim; i++) {
1394 psl->
m[psl->
dim*idx+i] = dbuf[0];
1403 if ( psl->
ver == 1 ) {
1405 for (k=1; k<=psl->
np; k++) {
1409 for(i=0 ; i<9 ; i++)
1414 for(i=0 ; i<9 ; i++) {
1420 iadr = psl->
size*idx;
1422 if ( !metricData ) {
1423 if ( psl->
dim ==2 ) {
1424 psl->
m[iadr] = fbuf[0];
1425 psl->
m[iadr+1] = fbuf[1];
1426 psl->
m[iadr+2] = fbuf[3];
1427 psl->
m[iadr+3] = fbuf[4];
1430 for(i=0 ; i<9 ; i++) {
1431 psl->
m[iadr+i] = fbuf[i];
1436 if ( psl->
dim ==2 ) {
1437 assert ( fbuf[1] == fbuf[3] );
1439 psl->
m[iadr] = fbuf[0];
1440 psl->
m[iadr+1] = fbuf[1];
1441 psl->
m[iadr+2] = fbuf[4];
1444 assert ( fbuf[1]==fbuf[3] && fbuf[2]==fbuf[6] && fbuf[5]==fbuf[7] );
1446 psl->
m[iadr+0] = fbuf[0];
1447 psl->
m[iadr+1] = fbuf[1];
1448 psl->
m[iadr+2] = fbuf[2];
1449 psl->
m[iadr+3] = fbuf[4];
1450 psl->
m[iadr+4] = fbuf[5];
1451 psl->
m[iadr+5] = fbuf[8];
1457 for (k=1; k<=psl->
np; k++) {
1461 for(i=0 ; i<9 ; i++)
1466 for(i=0 ; i<9 ; i++) {
1472 iadr = psl->
size*idx;
1474 if ( !metricData ) {
1475 if ( psl->
dim ==2 ) {
1476 psl->
m[iadr ] = dbuf[0];
1477 psl->
m[iadr+1] = dbuf[1];
1478 psl->
m[iadr+2] = dbuf[3];
1479 psl->
m[iadr+3] = dbuf[4];
1482 for(i=0 ; i<9 ; i++) {
1483 psl->
m[iadr+i] = dbuf[i];
1488 if ( psl->
dim ==2 ) {
1489 assert ( dbuf[1] == dbuf[3] );
1491 psl->
m[iadr ] = dbuf[0];
1492 psl->
m[iadr+1] = dbuf[1];
1493 psl->
m[iadr+2] = dbuf[4];
1496 assert ( dbuf[1]==dbuf[3] || dbuf[2]==dbuf[6] || dbuf[5]==dbuf[7] );
1498 psl->
m[iadr+0] = dbuf[0];
1499 psl->
m[iadr+1] = dbuf[1];
1500 psl->
m[iadr+2] = dbuf[2];
1501 psl->
m[iadr+3] = dbuf[4];
1502 psl->
m[iadr+4] = dbuf[5];
1503 psl->
m[iadr+5] = dbuf[8];
1531 double mtmp[3],r[3][3];
1541 mtmp[0] =
sol->m[
sol->size*(ip)];
1542 mtmp[1] =
sol->m[
sol->size*(ip)+1];
1543 mtmp[2] =
sol->m[
sol->size*(ip)+3];
1546 r[0][0] = ppt->
n[0];
1547 r[1][0] = ppt->
n[1];
1548 r[2][0] = ppt->
n[2];
1560 dbuf[0] = mtmp[0]*r[0][0]*r[0][0] + mtmp[1]*r[0][1]*r[0][1] + mtmp[2]*r[0][2]*r[0][2];
1561 dbuf[1] = mtmp[0]*r[0][0]*r[1][0] + mtmp[1]*r[0][1]*r[1][1] + mtmp[2]*r[0][2]*r[1][2];
1562 dbuf[2] = mtmp[0]*r[0][0]*r[2][0] + mtmp[1]*r[0][1]*r[2][1] + mtmp[2]*r[0][2]*r[2][2];
1563 dbuf[3] = mtmp[0]*r[1][0]*r[1][0] + mtmp[1]*r[1][1]*r[1][1] + mtmp[2]*r[1][2]*r[1][2];
1564 dbuf[4] = mtmp[0]*r[1][0]*r[2][0] + mtmp[1]*r[1][1]*r[2][1] + mtmp[2]*r[1][2]*r[2][2];
1565 dbuf[5] = mtmp[0]*r[2][0]*r[2][0] + mtmp[1]*r[2][1]*r[2][1] + mtmp[2]*r[2][2]*r[2][2];
1568 for (i=0; i<
sol->size; i++) dbuf[i] = 0.;
1572 for (i=0; i<
sol->size; i++) dbuf[i] =
sol->m[
sol->size*ip+i];
1599 MMG5_int header[3],nq,ne,npr,np,nt,na,k,iadr,nelts,word;
1602 static char mmgWarn = 0;
1609 ptr = strstr(data,
".msh");
1612 strcat(data,
".mshb");
1613 if (!(inm = fopen(data,
"wb")) ) {
1614 ptr = strstr(data,
".msh");
1616 strcat(data,
".msh");
1617 if( !(inm = fopen(data,
"wb")) ) {
1618 fprintf(stderr,
" ** UNABLE TO OPEN %s.\n",data);
1626 ptr = strstr(data,
".mshb");
1628 if( !(inm = fopen(data,
"wb")) ) {
1629 fprintf(stderr,
" ** UNABLE TO OPEN %s.\n",data);
1636 fprintf(stdout,
" %%%% %s OPENED\n",data);
1640 fprintf(inm,
"$MeshFormat\n");
1641 fprintf(inm,
"2.2 %d %d\n",bin,8);
1647 fprintf(inm,
"$EndMeshFormat\n");
1651 for (k=1; k<=
mesh->
np; k++) {
1655 if (
mesh->
dim==2 ) ppt->
c[2] = 0.;
1658 fprintf(inm,
"$Nodes\n");
1659 fprintf(inm,
"%" MMG5_PRId
"\n",np);
1661 for (k=1; k<=
mesh->
np; k++) {
1665 fprintf(inm,
" %" MMG5_PRId
"",ppt->
tmp);
1666 for ( i=0; i<3; ++i )
1667 fprintf(inm,
" %.15lg",ppt->
c[i]);
1675 if ( bin ) fprintf(inm,
"\n");
1676 fprintf(inm,
"$EndNodes\n");
1681 for (k=1; k<=
mesh->
ne; k++) {
1683 if ( !
MG_EOK(pt) )
continue;
1689 if ( !
MG_EOK(pp) )
continue;
1695 if ( !
MG_EOK(pq) )
continue;
1699 for (k=1; k<=
mesh->
nt; k++) {
1701 if ( !
MG_EOK(ptt) )
continue;
1705 for (k=1; k<=
mesh->
na; k++) {
1707 if ( (!pa || !pa->
a) )
continue;
1711 fprintf(inm,
"$Elements\n");
1712 fprintf(inm,
"%" MMG5_PRId
"\n", np + ne + npr + nt + nq + na );
1723 fwrite(header,
MMG5_SW, 3, inm);
1726 for ( k=1; k<=
mesh->
np; ++k)
1729 if ( !
MG_VOK(ppt) )
continue;
1732 if ( !bin ) fprintf(inm,
"%" MMG5_PRId
" 15 2 %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
"\n",nelts,MMG5_abs(ppt->
ref),
1733 MMG5_abs(ppt->
ref),ppt->
tmp);
1736 word = MMG5_abs(ppt->
ref);
1748 fwrite(header,
MMG5_SW, 3, inm);
1751 for (k=1; k<=
mesh->
na; ++k) {
1754 if ( !pa || !pa->
a )
continue;
1758 fprintf(inm,
"%" MMG5_PRId
" 1 2 %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
"\n",nelts,pa->
ref,pa->
ref,
1774 fwrite(header,
MMG5_SW, 3, inm);
1777 for (k=1; k<=
mesh->
nt; ++k) {
1780 if ( !
MG_EOK(ptt) )
continue;
1784 fprintf(inm,
"%" MMG5_PRId
" 2 2 %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
"\n",nelts,ptt->
ref,ptt->
ref,
1802 fwrite(header,
MMG5_SW, 3, inm);
1807 if ( !
MG_EOK(pq) )
continue;
1811 fprintf(inm,
"%" MMG5_PRId
" 3 2 %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
"\n",nelts,pq->
ref,pq->
ref,
1830 fwrite(header,
MMG5_SW, 3, inm);
1833 for (k=1; k<=
mesh->
ne; ++k) {
1835 if ( !
MG_EOK(pt) )
continue;
1839 fprintf(inm,
"%" MMG5_PRId
" 4 2 %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
"\n",nelts,pt->
ref,pt->
ref,
1858 fwrite(header,
MMG5_SW, 3, inm);
1863 if ( !
MG_EOK(pp) )
continue;
1867 fprintf(inm,
"%" MMG5_PRId
" 6 2 %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
"\n",nelts,pp->
ref,pp->
ref,
1883 if ( bin ) fprintf(inm,
"\n");
1884 fprintf(inm,
"$EndElements\n");
1888 fprintf(stdout,
" NUMBER OF VERTICES %8" MMG5_PRId
"\n",np);
1889 fprintf(stdout,
" NUMBER OF TETRAHEDRA %8" MMG5_PRId
"\n",ne);
1891 fprintf(stdout,
" NUMBER OF PRISMS %8" MMG5_PRId
"\n",npr);
1893 fprintf(stdout,
" NUMBER OF TRIANGLES %8" MMG5_PRId
"\n",nt);
1895 fprintf(stdout,
" NUMBER OF QUADRILATERALS %8" MMG5_PRId
"\n",nq);
1897 fprintf(stdout,
" NUMBER OF EDGES %8" MMG5_PRId
"\n",na);
1903 if ( metricData==1 ) {
1916 for ( isol=0; isol<nsols; ++isol) {
1926 fprintf(stderr,
" ## Warning: %s: missing data for at least 1 solution."
1927 " Skipped.\n",__func__);
1932 fprintf(inm,
"$NodeData\n");
1938 if ( psl->
size == 1 ) {
1941 else if ( psl->
size == psl->
dim ) {
1951 fprintf(inm,
"\"%s:metric\"\n",
tmp);
1954 fprintf(inm,
"\"%s\"\n",
tmp);
1960 fprintf(inm,
"\"solution:metric\"\n");
1963 fprintf(inm,
"\"solution\"\n");
1969 fprintf(inm,
"0.0\n");
1974 fprintf(inm,
"%d\n",typ);
1975 fprintf(inm,
"%" MMG5_PRId
"\n",np);
1979 if ( psl->
size!= (psl->
dim*(psl->
dim+1))/2 ) {
1980 for (k=1; k<=
mesh->
np; k++) {
1982 if ( !
MG_VOK(ppt) )
continue;
1985 if ( psl->
dim == 2 )
1988 for ( i=0; i<psl->
size; ++i )
1989 dbuf[i] = psl->
m[iadr+i];
1992 fprintf(inm,
"%" MMG5_PRId
"",ppt->
tmp);
1993 for ( i=0; i<typ; ++i )
1994 fprintf(inm,
" %lg",dbuf[i]);
1999 fwrite(&dbuf,
MMG5_SD,typ,inm);
2004 for (k=1; k<=
mesh->
np; k++) {
2006 if ( !
MG_VOK(ppt) )
continue;
2008 if ( psl->
dim == 3 ) {
2014 for (i=0; i<psl->
size; i++) dbuf[i] = psl->
m[psl->
size*k+i];
2019 fprintf(inm,
"%" MMG5_PRId
"",ppt->
tmp);
2020 if ( psl->
dim==2 ) {
2022 fprintf(inm,
" %.15lg %.15lg %.15lg %.15lg %.15lg %.15lg"
2023 " %.15lg %.15lg %.15lg \n",
2024 psl->
m[iadr],psl->
m[iadr+1],0.,psl->
m[iadr+1],psl->
m[iadr+2],0.,0.,0.,1.);
2027 fprintf(inm,
" %.15lg %.15lg %.15lg %.15lg %.15lg %.15lg"
2028 " %.15lg %.15lg %.15lg \n", dbuf[0],dbuf[1],dbuf[2],
2029 dbuf[1],dbuf[3],dbuf[4],dbuf[2],dbuf[4],dbuf[5]);
2034 if ( psl->
dim==2 ) {
2036 fwrite(&psl->
m[iadr],
MMG5_SD,2,inm);
2037 dbuf[0] = dbuf[1] = dbuf[2] = 0.;
2040 fwrite(&psl->
m[iadr+1],
MMG5_SD,2,inm);
2044 fwrite(&dbuf[0],
MMG5_SD,3,inm);
2045 fwrite(&dbuf[1],
MMG5_SD,1,inm);
2046 fwrite(&dbuf[3],
MMG5_SD,2,inm);
2047 fwrite(&dbuf[2],
MMG5_SD,1,inm);
2048 fwrite(&dbuf[4],
MMG5_SD,2,inm);
2053 if ( bin ) fprintf(inm,
"\n");
2054 fprintf(inm,
"$EndNodeData\n");
2081 int *bin,
int *iswp,MMG5_int *np,
int *dim,
int *nsols,
int **type,
2082 long *posnp,
int imprim) {
2095 ptr = strstr(data,
".mesh");
2096 if ( ptr ) *ptr =
'\0';
2098 ptr = strstr(data,
".sol");
2102 strcat(data,
".solb");
2103 if (!(*inm = fopen(data,
"rb")) ) {
2105 ptr = strstr(data,
".solb");
2107 strcat(data,
".sol");
2108 if (!(*inm = fopen(data,
"rb")) ) {
2110 fprintf(stderr,
" ** %s NOT FOUND. USE DEFAULT METRIC.\n",data);
2119 ptr = strstr(data,
".solb");
2120 if ( ptr ) *bin = 1;
2122 if (!(*inm = fopen(data,
"rb")) ) {
2124 fprintf(stderr,
" ** %s NOT FOUND. USE DEFAULT METRIC.\n",data);
2130 fprintf(stdout,
" %%%% %s OPENED\n",data);
2135 strcpy(chaine,
"DDD");
2136 while(fscanf(*inm,
"%127s",&chaine[0])!=EOF && strncmp(chaine,
"End",strlen(
"End")) ) {
2137 if(!strncmp(chaine,
"Dimension",strlen(
"Dimension"))) {
2139 if ( *dim!=meshDim ) {
2140 fprintf(stderr,
"BAD SOL DIMENSION: %d\n",*dim);
2145 }
else if(!strncmp(chaine,
"SolAtVertices",strlen(
"SolAtVertices"))) {
2149 for ( i=0; i<*nsols; ++i ) {
2152 *posnp = ftell(*inm);
2158 if(binch==16777216) (*iswp)=1;
2160 fprintf(stdout,
"BAD FILE ENCODING\n");
2166 while(fread(&binch,
MMG5_SW,1,*inm)!=EOF && binch!=54 ) {
2168 if(binch==54)
break;
2174 if ( *dim!=meshDim ) {
2175 fprintf(stderr,
"BAD SOL DIMENSION: %d\n",*dim);
2176 printf(
" Exit program.\n");
2181 }
else if(binch==62) {
2190 for ( i=0; i<*nsols; ++i ) {
2194 *posnp = ftell(*inm);
2200 fseek(*inm,bpos,SEEK_SET);
2224 switch (
sol->size ) {
2227 for (i=0; i<
sol->size; i++) {
2234 sol->m[
sol->size*pos+i] = fbuf[0];
2240 for(i=0 ; i<
sol->size ; i++)
2243 for(i=0 ; i<
sol->size ; i++) {
2251 for (i=0; i<6; i++)
sol->m[6*pos+i] = fbuf[i];
2270 double dbuf[6],tmpd;
2273 switch (
sol->size ) {
2276 for (i=0; i<
sol->size; i++) {
2283 sol->m[
sol->size*pos+i] = dbuf[i];
2290 for(i=0 ; i<
sol->size ; i++)
2293 for(i=0 ; i<
sol->size ; i++) {
2301 for (i=0; i<
sol->size; i++)
sol->m[6*pos+i] = dbuf[i];
2319 MMG5_int pos,
int metricData) {
2323 switch (
sol->size ) {
2326 for (i=0; i<
sol->size; i++) {
2327 for (i=0; i<
sol->size; i++) dbuf[i] =
sol->m[
sol->size*pos+i];
2329 for (i=0; i<
sol->size; i++)
2330 fprintf(inm,
" %.15lg",dbuf[i]);
2332 for(i=0; i<
sol->size; i++)
2333 fwrite((
unsigned char*)&dbuf[i],
MMG5_SD,1,inm);
2346 for (i=0; i<
sol->size; i++)
2348 dbuf[i] =
sol->m[6*pos+i];
2357 for(i=0; i<
sol->size; i++)
2358 fprintf(inm,
" %.15lg",dbuf[i]);
2360 for(i=0; i<
sol->size; i++)
2361 fwrite((
unsigned char*)&dbuf[i],
MMG5_SD,1,inm);
2388 FILE **inm,
int ver,
int *bin,MMG5_int *bpos,MMG5_int np,
int dim,
2389 int nsols,
int *entities,
int *type,
int *size) {
2399 ptr = strstr(data,
".sol");
2402 ptr = strstr(data,
".solb");
2404 if ( ptr ) *bin = 1;
2406 if( !(*inm = fopen(data,
"wb")) ) {
2407 fprintf(stderr,
" ** UNABLE TO OPEN %s.\n",data);
2415 ptr = strstr(data,
".mesh");
2416 if ( ptr ) *ptr =
'\0';
2418 strcat(data,
".sol");
2419 if (!(*inm = fopen(data,
"wb")) ) {
2420 ptr = strstr(data,
".solb");
2422 strcat(data,
".sol");
2423 if (!(*inm = fopen(data,
"wb")) ) {
2424 fprintf(stderr,
" ** UNABLE TO OPEN %s.\n",data);
2433 fprintf(stdout,
" %%%% %s OPENED\n",data);
2439 strcpy(&chaine[0],
"MeshVersionFormatted\n");
2440 fprintf(*inm,
"%s %d",chaine,ver);
2441 strcpy(&chaine[0],
"\n\nDimension\n");
2442 fprintf(*inm,
"%s %d",chaine,dim);
2445 fwrite(&binch,
MMG5_SW,1,*inm);
2447 fwrite(&binch,
MMG5_SW,1,*inm);
2449 fwrite(&binch,
MMG5_SW,1,*inm);
2453 fwrite(&binch,
MMG5_SW,1,*inm);
2457 for (k=1; k<=
mesh->
np; k++) {
2464 for (k=0; k<nsols; ++k ) {
2472 strcpy(&chaine[0],
"\n\nSolAtVertices\n");
2473 fprintf(*inm,
"%s",chaine);
2474 fprintf(*inm,
"%" MMG5_PRId
"\n",np);
2475 fprintf(*inm,
"%d",npointSols);
2476 for (k=0; k<nsols; ++k ) {
2480 fprintf(*inm,
" %d",type[k]);
2485 fwrite(&binch,
MMG5_SW,1,*inm);
2488 for (k=0; k<nsols; ++k ) {
2492 (*bpos) += 4 + (size[k]*ver)*4*np;
2497 fwrite(&npointSols,
MMG5_SW,1,*inm);
2498 for (k=0; k<nsols; ++k ) {
2502 fwrite(&type[k],
MMG5_SW,1,*inm);
2525 FILE *inm,
int ver,
int bin,MMG5_int *bpos,
2526 int nsols,
int nsolsAtTriangles,
2527 int *entities,
int *type,
int *size) {
2533 for (k=1; k<=
mesh->
nt; k++) {
2542 fprintf(inm,
"\n\nSolAtTriangles\n");
2543 fprintf(inm,
"%" MMG5_PRId
"\n",nt);
2544 fprintf(inm,
"%d",nsolsAtTriangles);
2545 for (k=0; k<nsols; ++k ) {
2549 fprintf(inm,
" %d",type[k]);
2557 for (k=0; k<nsols; ++k ) {
2561 (*bpos) += 4 + (size[k]*ver)*4*nt;
2566 fwrite(&nsolsAtTriangles,
MMG5_SW,1,inm);
2567 for (k=0; k<nsols; ++k ) {
2571 fwrite(&type[k],
MMG5_SW,1,inm);
2594 FILE *inm,
int ver,
int bin,MMG5_int *bpos,
2595 int nsols,
int nsolsAtTetra,
2596 int *entities,
int *type,
int *size) {
2602 for (k=1; k<=
mesh->
ne; k++) {
2611 fprintf(inm,
"\n\nSolAtTetrahedra\n");
2612 fprintf(inm,
"%" MMG5_PRId
"\n",ne);
2613 fprintf(inm,
"%d",nsolsAtTetra);
2614 for (k=0; k<nsols; ++k ) {
2618 fprintf(inm,
" %d",type[k]);
2626 for (k=0; k<nsols; ++k ) {
2630 (*bpos) += 4 + (size[k]*ver)*4*ne;
2635 fwrite(&nsolsAtTetra,
MMG5_SW,1,inm);
2636 for (k=0; k<nsols; ++k ) {
2640 fwrite(&type[k],
MMG5_SW,1,inm);
2665 fprintf(stderr,
" ## Error: %s: Metric should apply on vertices.\n"
2666 " If your input file is at a non Medit"
2667 " file format, please ensure to remove non metric fields from your"
2668 " file and that the metric field"
2669 " contains the \":metric\" string.\n",__FILE__);
2670 if ( inm ) fclose(inm);
2678 if ( type[0]!=1 && type[0]!=3) {
2679 fprintf(stderr,
" ** DATA TYPE IGNORED %d \n",type[0]);
2680 fprintf(stderr,
" ## Error: %s: if your input file is at a non Medit"
2681 " file format, please ensure that the metric field"
2682 " contains the \":metric\" string.\n",__FILE__);
2683 if ( inm ) fclose(inm);
2688 if ( type[0] != 2 ) {
2689 fprintf(stderr,
" ** MISMATCH DATA TYPE FOR LAGRANGIAN MODE %d \n",
2691 if ( inm ) fclose(inm);
2707 if ( met->
size == 1 )
2708 fprintf(stdout,
" NUMBER OF SCALAR VALUES %8" MMG5_PRId
"\n",met->
np);
2709 else if ( met->
size == 3 )
2710 fprintf(stdout,
" NUMBER OF VECTOR VALUES %8" MMG5_PRId
"\n",met->
np);
2712 fprintf(stdout,
" NUMBER OF TENSOR VALUES %8" MMG5_PRId
"\n",met->
np);
2727 fprintf(stdout,
" NUMBER OF SOLUTIONS PER ENTITY %8d\n",
mesh->
nsols);
2728 fprintf(stdout,
" TYPE OF SOLUTIONS:\n ");
2730 if ( (*
sol)[j].size == 1 )
2731 fprintf(stdout,
" SCALAR");
2732 else if ( (*
sol)[j].size == 3 )
2733 fprintf(stdout,
" VECTOR");
2735 fprintf(stdout,
" TENSOR");
2737 fprintf(stdout,
"\n");
2756 printf(
"\n ## Error: %s: unable to save a file without a valid filename\n.",
2764 ptr = strstr(data,
".node");
2770 strcat(data,
".node");
2771 if( !(inm = fopen(data,
"wb")) ) {
2772 fprintf(stderr,
" ** UNABLE TO OPEN %s.\n",data);
2777 fprintf(stdout,
" %%%% %s OPENED\n",data);
2782 for (k=1; k<=
mesh->
np; k++) {
2791 fprintf(inm,
"%" MMG5_PRId
" %d %d %d\n\n",np,
mesh->
dim,0,1);
2793 for ( k=1; k<=
mesh->
np; ++k ) {
2797 fprintf(inm,
"%" MMG5_PRId
" ",ppt->
tmp);
2800 for ( i=0; i<
mesh->
dim; ++i ) {
2801 fprintf(inm,
" %.15lf",ppt->
c[i]);
2805 fprintf(inm,
" %" MMG5_PRId
"\n",ppt->
ref);
2809 fprintf(stdout,
" NUMBER OF VERTICES %8" MMG5_PRId
"\n",np);
2832 if ( (!
filename) || !(*filename) ) {
2835 if ( (!
filename) || !(*filename) ) {
2836 printf(
"\n ## Error: %s: unable to save a file without a valid filename\n.",
2844 ptr = strstr(data,
".node");
2851 if( !(inm = fopen(data,
"wb")) ) {
2852 fprintf(stderr,
" ** UNABLE TO OPEN %s.\n",data);
2857 fprintf(stdout,
" %%%% %s OPENED\n",data);
2861 if ( !strcmp(ext,
".poly") ) {
2871 fprintf(inm,
"0 %d 0 1\n",
mesh->
dim);
2879 ptr_c = ptr_c-
sizeof(size_t);
2880 na_tot = (*((
size_t*)ptr_c));
2887 fprintf(inm,
"%zu %d\n",na_tot,1);
2889 for ( k=1; k<=na_tot; ++k ) {
2891 fprintf(inm,
"%" MMG5_PRId
" ",k);
2902 fprintf(inm,
"0 \n");
2905 fprintf(stdout,
" NUMBER OF EDGES %8zu\n",na_tot);
char * MMG5_Get_basename(char *path)
int MMG5_Set_inputSolName(MMG5_pMesh mesh, MMG5_pSol sol, const char *solin)
MMG5_pMesh MMG5_pSol * sol
if(!ier) exit(EXIT_FAILURE)
MMG5_pMesh char * filename
int MMG5_readDoubleSol3D(MMG5_pSol sol, FILE *inm, int bin, int iswp, MMG5_int pos)
int MMG5_chkMetricType(MMG5_pMesh mesh, int *type, int *entities, FILE *inm)
void MMG5_build3DMetric(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int ip, double dbuf[6])
void MMG5_printSolStats(MMG5_pMesh mesh, MMG5_pSol *sol)
float MMG5_swapf(float sbin)
int MMG5_check_readedMesh(MMG5_pMesh mesh, MMG5_int nref)
static int MMG5_countBinaryElts(FILE **inm, const int nelts, const int iswp, int *np, int *na, int *nt, int *nq, int *ne, int *npr)
int MMG5_saveSolAtTrianglesHeader(MMG5_pMesh mesh, FILE *inm, int ver, int bin, MMG5_int *bpos, int nsols, int nsolsAtTriangles, int *entities, int *type, int *size)
int MMG5_saveNode(MMG5_pMesh mesh, const char *filename)
int MMG5_saveEdge(MMG5_pMesh mesh, const char *filename, const char *ext)
int MMG5_saveSolHeader(MMG5_pMesh mesh, const char *filename, FILE **inm, int ver, int *bin, MMG5_int *bpos, MMG5_int np, int dim, int nsols, int *entities, int *type, int *size)
int MMG5_loadMshMesh_part1(MMG5_pMesh mesh, const char *filename, FILE **inm, long *posNodes, long *posElts, long **posNodeData, int *bin, int *iswp, MMG5_int *nelts, int *nsols)
void MMG5_writeDoubleSol3D(MMG5_pMesh mesh, MMG5_pSol sol, FILE *inm, int bin, MMG5_int pos, int metricData)
MMG5_int MMG5_swapbin_int(MMG5_int sbin)
int MMG5_saveSolAtTetrahedraHeader(MMG5_pMesh mesh, FILE *inm, int ver, int bin, MMG5_int *bpos, int nsols, int nsolsAtTetra, int *entities, int *type, int *size)
int MMG5_readFloatSol3D(MMG5_pSol sol, FILE *inm, int bin, int iswp, int pos)
double MMG5_swapd(double sbin)
int MMG5_loadMshMesh_part2(MMG5_pMesh mesh, MMG5_pSol *sol, FILE **inm, const long posNodes, const long posElts, const long *posNodeData, const int bin, const int iswp, const MMG5_int nelts, const int nsols)
int MMG5_saveMshMesh(MMG5_pMesh mesh, MMG5_pSol *sol, const char *filename, int metricData)
void MMG5_printMetStats(MMG5_pMesh mesh, MMG5_pSol met)
int MMG5_loadSolHeader(const char *filename, int meshDim, FILE **inm, int *ver, int *bin, int *iswp, MMG5_int *np, int *dim, int *nsols, int **type, long *posnp, int imprim)
int MMG5_swapbin(int sbin)
#define MMG5_SAFE_CALLOC(ptr, size, type, law)
double MMG2D_quickarea(double a[2], double b[2], double c[2])
#define MMG5_ADD_MEM(mesh, size, message, law)
#define MMG_FREAD(ptr, size, count, stream)
double MMG5_orvol(MMG5_pPoint point, MMG5_int *v)
#define MMG5_FILESTR_LGTH
#define MMG5_SAFE_FREE(ptr)
#define MMG_FSCANF(stream, format,...)
#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.