00001 #include "import_T3d.h"
00002 #include "siftop_element_types.h"
00003 #include "iotools.h"
00004 #include <stdlib.h>
00005 #include <stdio.h>
00006
00007
00008
00009 siftop *S=NULL;
00010 XFILE *f;
00011
00012
00013
00014 long type,degree,renum,mode ;
00015 long nodes,edges,trias,quads,tetras,pyrams,vedges,bricks,elements ;
00016 long modeI[6] ;
00017 long nodeI[20] ;
00018
00019 #define Vertex 1
00020 #define Curve 2
00021 #define Surface 3
00022 #define Region 4
00023 #define Patch 5
00024 #define Shell 6
00025
00026 #define Parameters 0
00027 #define Tangent 1
00028 #define Normal 2
00029 #define BoundaryEntities 3
00030 #define AssociatedElements 4
00031 #define Neighbourhood 5
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 long import_T3d_set_topology_pointer ( siftop &oS )
00046 {
00047 S=&oS ;
00048 return 0 ;
00049 }
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 void decode_mode ( void )
00060 {
00061 long i ;
00062 for ( i=0 ; i<6 ; i++ )
00063 modeI[i]=( mode>>i ) & 1 ;
00064 }
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 long import_T3d_nodes ( long paral )
00078 {
00079 long i,id,property,entity,eid ;
00080 double x,y,z ;
00081
00082 if (paral)
00083 S->gnn = new long[nodes];
00084 for ( i=0 ; i<nodes ; i++ )
00085 {
00086 xfscanf(f, "%ld", &id);
00087 if (paral)
00088 xfscanf(f, "%ld", &S->gnn[id-1]);
00089
00090 xfscanf(f, "%le", &x);
00091 xfscanf(f, "%le", &y);
00092 xfscanf(f, "%le", &z);
00093 xfscanf(f, "%ld", &entity);
00094 xfscanf(f, "%ld", &eid);
00095 xfscanf(f, "%ld", &property);
00096
00097 S->nodes[id-1].alloc(1);
00098 S->nodes[id-1].x = x;
00099 S->nodes[id-1].y = y;
00100 S->nodes[id-1].z = z;
00101 S->nodes[id-1].entid[0] = evertex;
00102 S->nodes[id-1].prop[0] = property;
00103
00104
00105 switch ( entity )
00106 {
00107 case Vertex:
00108 case Region:
00109 break ;
00110 case Curve:
00111 if ( modeI[Parameters] || modeI[Tangent] )
00112 skipline(f);
00113 break ;
00114 case Surface:
00115 case Patch:
00116 case Shell:
00117 if ( modeI[Parameters] || modeI[Normal] )
00118 skipline(f);
00119 break ;
00120 }
00121 }
00122 return(0);
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 long import_T3d_edges ( void )
00137 {
00138 long id,esize,i,j,dummy,property;
00139 gtypel etype;
00140
00141 switch ( degree )
00142 {
00143 case 1:
00144 etype=isolinear1d;
00145 esize=2;
00146 break ;
00147 case 2:
00148 etype=isoquadratic1d;
00149 esize=3;
00150 break ;
00151 default:
00152 print_err("unknown degree of element is required", __FILE__, __LINE__, __func__);
00153 }
00154
00155 for ( i=0 ; i<edges ; i++ )
00156 {
00157 xfscanf(f, "%ld", &id);
00158 for ( j=0 ; j<esize ; j++ )
00159 xfscanf(f, "%ld", nodeI+j);
00160
00161 xfscanf(f, "%ld", &dummy);
00162 xfscanf(f, "%ld", &dummy);
00163 xfscanf(f, "%ld", &property);
00164
00165 S->elements[id-1].type = etype;
00166 S->elements[id-1].alloc(1);
00167 for(j=0; j<esize; j++)
00168 S->elements[id-1].nodes[j] = nodeI[j];
00169 S->elements[id-1].prop = property;
00170 }
00171 return(0);
00172 }
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 long import_T3d_trias ( void )
00186 {
00187 long id,esize,i,j,dummy,property ;
00188 gtypel etype;
00189
00190 switch (degree)
00191 {
00192 case 1:
00193 etype=trianglelinear;
00194 esize=3;
00195 break ;
00196 case 2:
00197 etype=trianglequadratic;
00198 esize=6;
00199 break ;
00200 default:
00201 print_err("unknown degree of element is required", __FILE__, __LINE__, __func__);
00202 }
00203
00204 for ( i=0 ; i<trias ; i++ )
00205 {
00206 xfscanf(f, "%ld", &id);
00207 for ( j=0 ; j<esize ; j++ )
00208 xfscanf(f, "%ld", nodeI+j);
00209
00210 xfscanf(f, "%ld", &dummy);
00211 xfscanf(f, "%ld", &dummy);
00212 xfscanf(f, "%ld", &property);
00213
00214 S->elements[id-1].type = etype;
00215 S->elements[id-1].alloc(1);
00216 for(j=0; j<esize; j++)
00217 S->elements[id-1].nodes[j] = nodeI[j];
00218 S->elements[id-1].prop = property;
00219
00220 if ( modeI[Neighbourhood] )
00221 {
00222
00223 skipline(f);
00224 }
00225 if (modeI[BoundaryEntities])
00226 {
00227 for (j = 0; j < S->elements[id-1].ned; j++)
00228 {
00229 xfscanf(f, "%ld", &dummy);
00230 }
00231 for (j = 0; j < S->elements[id-1].ned; j++)
00232 {
00233 xfscanf(f, "%ld", &S->elements[id-1].propedg+j);
00234 }
00235 }
00236 else
00237 skipline(f);
00238 }
00239 return(0);
00240 }
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253 long import_T3d_quads ( void )
00254 {
00255 long id,esize,i,j,dummy,property ;
00256 gtypel etype;
00257
00258 switch (degree)
00259 {
00260 case 1:
00261 etype=isolinear2d;
00262 esize=4;
00263 break ;
00264 case 2:
00265 etype=isoquadratic2d;
00266 esize=8;
00267 break ;
00268 default:
00269 print_err("unknown degree of element is required", __FILE__, __LINE__, __func__);
00270 }
00271
00272 for ( i=0 ; i<quads ; i++ )
00273 {
00274 xfscanf(f, "%ld", &id);
00275 for ( j=0 ; j<esize ; j++ )
00276 xfscanf(f, "%ld", nodeI+j);
00277
00278 xfscanf(f, "%ld", &dummy);
00279 xfscanf(f, "%ld", &dummy);
00280 xfscanf(f, "%ld", &property);
00281
00282 S->elements[id-1].type = etype;
00283 S->elements[id-1].alloc(1);
00284 for(j=0; j<esize; j++)
00285 S->elements[id-1].nodes[j] = nodeI[j];
00286 S->elements[id-1].prop = property;
00287
00288 if ( modeI[Neighbourhood] )
00289 {
00290 skipline(f);
00291 }
00292 if (modeI[BoundaryEntities])
00293 {
00294 for (j = 0; j < S->elements[id-1].ned; j++)
00295 {
00296 xfscanf(f, "%ld", &dummy);
00297 }
00298 for (j = 0; j < S->elements[id-1].ned; j++)
00299 {
00300 xfscanf(f, "%ld", &S->elements[id-1].propedg+j);
00301 }
00302 }
00303 else
00304 skipline(f);
00305 }
00306 return(0);
00307 }
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321 long import_T3d_tetras ( void )
00322 {
00323 long id,esize,i,j,dummy,property ;
00324 gtypel etype;
00325
00326 switch (degree)
00327 {
00328 case 1:
00329 etype=tetrahedronlinear;
00330 esize=4;
00331 break ;
00332 case 2:
00333 etype=tetrahedronquadratic;
00334 esize=10;
00335 break ;
00336 default:
00337 print_err("unknown degree of element is required", __FILE__, __LINE__, __func__);
00338 }
00339
00340 for ( i=0 ; i<tetras ; i++ )
00341 {
00342 xfscanf(f, "%ld", &id);
00343 for ( j=0 ; j<esize ; j++ )
00344 xfscanf(f, "%ld", nodeI+j);
00345
00346 xfscanf(f, "%ld", &dummy);
00347 xfscanf(f, "%ld", &dummy);
00348 xfscanf(f, "%ld", &property);
00349
00350 S->elements[id-1].type = etype;
00351 S->elements[id-1].alloc(1);
00352 for(j=0; j<esize; j++)
00353 S->elements[id-1].nodes[j] = nodeI[j];
00354 S->elements[id-1].prop = property;
00355
00356 if ( modeI[Neighbourhood] || modeI[AssociatedElements] )
00357 {
00358 skipline(f);
00359 }
00360 if (modeI[BoundaryEntities])
00361 {
00362 for (j = 0; j < S->elements[id-1].nsurf; j++)
00363 {
00364 xfscanf(f, "%ld", &dummy);
00365 xfscanf(f, "%ld", &dummy);
00366 }
00367 for (j = 0; j < S->elements[id-1].nsurf; j++)
00368 {
00369 xfscanf(f, "%ld", &S->elements[id-1].propsurf+j);
00370 }
00371 skipline(f);
00372 }
00373 else
00374 skipline(f);
00375 }
00376 return(0);
00377 }
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390 long import_T3d_pyrams ( void )
00391 {
00392 long id,esize,i,j,dummy,property ;
00393 gtypel etype;
00394
00395 switch (degree)
00396 {
00397 case 1:
00398 etype=pyramidelinear;
00399 esize=5;
00400 break ;
00401 case 2:
00402 etype=pyramidequadratic;
00403 esize=13;
00404 break ;
00405 default:
00406 print_err("unknown degree of element is required", __FILE__, __LINE__, __func__);
00407 }
00408
00409 for ( i=0 ; i<pyrams ; i++ )
00410 {
00411 xfscanf(f, "%ld", &id);
00412 for ( j=0 ; j<esize ; j++ )
00413 xfscanf(f, "%ld", nodeI+j);
00414
00415 xfscanf(f, "%ld", &dummy);
00416 xfscanf(f, "%ld", &dummy);
00417 xfscanf(f, "%ld", &property);
00418
00419 S->elements[id-1].type = etype;
00420 S->elements[id-1].alloc(1);
00421 for(j=0; j<esize; j++)
00422 S->elements[id-1].nodes[j] = nodeI[j];
00423 S->elements[id-1].prop = property;
00424
00425 if ( modeI[BoundaryEntities] || modeI[Neighbourhood] || modeI[AssociatedElements] )
00426 {
00427 skipline(f);
00428 }
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440 }
00441 return(0);
00442 }
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455 long import_T3d_vedges ( void )
00456 {
00457 long id,esize,i,j,dummy,property ;
00458 gtypel etype;
00459
00460 switch (degree)
00461 {
00462 case 1:
00463 etype=vedgelinear;
00464 esize=6;
00465 break ;
00466 case 2:
00467 etype=vedgequadratic;
00468 esize=15;
00469 break ;
00470 default:
00471 print_err("unknown degree of element is required", __FILE__, __LINE__, __func__);
00472 }
00473
00474 for ( i=0 ; i<vedges ; i++ )
00475 {
00476 xfscanf(f, "%ld", &id);
00477 for ( j=0 ; j<esize ; j++ )
00478 xfscanf(f, "%ld", nodeI+j);
00479
00480 xfscanf(f, "%ld", &dummy);
00481 xfscanf(f, "%ld", &dummy);
00482 xfscanf(f, "%ld", &property);
00483
00484 S->elements[id-1].type = etype;
00485 S->elements[id-1].alloc(1);
00486 for(j=0; j<esize; j++)
00487 S->elements[id-1].nodes[j] = nodeI[j];
00488 S->elements[id-1].prop = property;
00489
00490 if ( modeI[BoundaryEntities] || modeI[Neighbourhood] || modeI[AssociatedElements] )
00491 {
00492 skipline(f);
00493 }
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505 }
00506 return(0);
00507 }
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521 long import_T3d_bricks ( void )
00522 {
00523 long id,esize,i,j,dummy,property ;
00524 gtypel etype;
00525
00526 switch (degree)
00527 {
00528 case 1:
00529 etype=isolinear3d;
00530 esize=8;
00531 break ;
00532 case 2:
00533 etype=isoquadratic3d;
00534 esize=20;
00535 break ;
00536 default:
00537 print_err("unknown degree of element is required", __FILE__, __LINE__, __func__);
00538 }
00539
00540 for ( i=0 ; i<bricks ; i++ )
00541 {
00542 xfscanf(f, "%ld", &id);
00543 for ( j=0 ; j<esize ; j++ )
00544 xfscanf(f, "%ld", nodeI+j);
00545
00546 xfscanf(f, "%ld", &dummy);
00547 xfscanf(f, "%ld", &dummy);
00548 xfscanf(f, "%ld", &property);
00549
00550 S->elements[id-1].type = etype;
00551 S->elements[id-1].alloc(1);
00552 for(j=0; j<esize; j++)
00553 S->elements[id-1].nodes[j] = nodeI[j];
00554 S->elements[id-1].prop = property;
00555
00556
00557 if ( modeI[Neighbourhood] || modeI[AssociatedElements] )
00558 {
00559 skipline(f);
00560 }
00561
00562 if (modeI[BoundaryEntities])
00563 {
00564 for (j = 0; j < S->elements[id-1].nsurf; j++)
00565 {
00566 xfscanf(f, "%ld", &dummy);
00567 xfscanf(f, "%ld", &dummy);
00568 }
00569 for (j = 0; j < S->elements[id-1].nsurf; j++)
00570 {
00571 xfscanf(f, "%ld", &S->elements[id-1].propsurf+j);
00572 }
00573 }
00574 else
00575 skipline(f);
00576 }
00577 return(0);
00578 }
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595 long import_T3d ( char *ofname, long paral )
00596 {
00597 long temp;
00598 char emsg[1100];
00599
00600 if ( !S )
00601 {
00602 print_err("topology pointer is not set",__FILE__, __LINE__, __func__ ) ;
00603 return -1 ;
00604 }
00605 f=xfopen( ofname,"rt" ) ;
00606 if ( !f )
00607 {
00608 sprintf(emsg, "cannot open T3d output file %s for reading",ofname);
00609 print_err(emsg, __FILE__, __LINE__, __func__);
00610 return -2 ;
00611 }
00612 f->warning = 1;
00613 f->kwdmode = ignore;
00614 f->ignorecase = 1;
00615
00616 xfscanf(f, "%ld", &type);
00617 xfscanf(f, "%ld", °ree);
00618 xfscanf(f, "%ld", &renum);
00619 xfscanf(f, "%ld", &mode);
00620
00621 if (paral==1){
00622 xfscanf(f, "%ld", &temp);
00623 }
00624
00625 decode_mode() ;
00626
00627 xfscanf(f, "%ld", &nodes);
00628
00629
00630 switch ( type )
00631 {
00632 case 3:
00633 xfscanf(f, "%ld", &edges);
00634 xfscanf(f, "%ld", &trias);
00635 xfscanf(f, "%ld", &tetras);
00636 quads=0 ;
00637 pyrams=0 ;
00638 vedges=0 ;
00639 bricks=0 ;
00640 break ;
00641 case 4:
00642 xfscanf(f, "%ld", &edges);
00643 xfscanf(f, "%ld", &quads);
00644 xfscanf(f, "%ld", &bricks);
00645 trias=0 ;
00646 tetras=0 ;
00647 pyrams=0 ;
00648 vedges=0 ;
00649 break ;
00650 case 7:
00651 xfscanf(f, "%ld", &edges);
00652 xfscanf(f, "%ld", &trias);
00653 xfscanf(f, "%ld", &quads);
00654 xfscanf(f, "%ld", &tetras);
00655 xfscanf(f, "%ld", &pyrams);
00656 xfscanf(f, "%ld", &vedges);
00657 xfscanf(f, "%ld", &bricks);
00658 break ;
00659 }
00660
00661 S->nn = nodes;
00662 import_T3d_nodes(paral) ;
00663
00664
00665 elements=edges+trias+quads+tetras+pyrams+vedges+bricks ;
00666 S->ne = elements;
00667
00668 import_T3d_edges();
00669 import_T3d_trias();
00670 import_T3d_quads();
00671 import_T3d_tetras();
00672 import_T3d_pyrams();
00673 import_T3d_vedges();
00674 import_T3d_bricks();
00675
00676 return 1 ;
00677 }
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687