Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/post/src/modules/readfile.c
3203 views
1
/*****************************************************************************
2
*
3
* Elmer, A Finite Element Software for Multiphysical Problems
4
*
5
* Copyright 1st April 1995 - , CSC - IT Center for Science Ltd., Finland
6
*
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 2
10
* of the License, or (at your option) any later version.
11
*
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
*
17
* You should have received a copy of the GNU General Public License
18
* along with this program (in file fem/GPL-2); if not, write to the
19
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20
* Boston, MA 02110-1301, USA.
21
*
22
*****************************************************************************/
23
24
/*******************************************************************************
25
*
26
* File reading + MATC model setting command
27
*
28
*******************************************************************************
29
*
30
* Author: Juha Ruokolainen
31
*
32
* Address: CSC - IT Center for Science Ltd.
33
* Keilaranta 14, P.O. BOX 405
34
* 02101 Espoo, Finland
35
* Tel. +358 0 457 2723
36
* Telefax: +358 0 457 2302
37
* EMail: [email protected]
38
*
39
* Date: 27 Sep 1995
40
*
41
* Modified by:
42
*
43
* Date of modification:
44
*
45
******************************************************************************/
46
47
48
#include "../elmerpost.h"
49
#include <tcl.h>
50
51
extern double XMin,XMax,YMin,YMax,ZMin,ZMax;
52
extern double xmin,xmax,ymin,ymax,zmin,zmax;
53
extern int CurrentTimeStep,KeepScale;
54
static int E[50],code,NV,NE,NF,NT;
55
56
#define BUFFER_SIZE 8192
57
58
static int epReadFile( ClientData cl,Tcl_Interp *interp,int argc,char **argv )
59
{
60
int i,j,k,n,t = 0,total = 0,NamesGiven;
61
62
FILE *fp;
63
64
static vertex_t vertex;
65
element_type_t *EL;
66
67
static char *str,name[512],*ptr;
68
69
double s,*NodeArray,*Velo,*Vabs,*Temp,*Pres,fdummy;
70
71
double *Vector[1000], *Scalar[1000], *Times,*tvar;
72
73
VARIABLE *Var1;
74
75
group_t *grp;
76
77
struct {
78
int type;
79
char name[256];
80
} variable[64];
81
82
int groupid,gid,StartTime=1,EndTime=1,IncTime=1,ToRead,last,gotit;
83
static char groupname[128];
84
85
group_t *group;
86
extern Tcl_Interp *TCLInterp;
87
88
int geo_group_id();
89
90
if ( argc < 2 ) return TCL_ERROR;
91
92
fp = fopen( argv[1], "r" );
93
if ( !fp )
94
{
95
sprintf( interp->result, "ReadModel: can't open file [%s]\n",argv[1] );
96
return TCL_ERROR;
97
}
98
99
if ( argc > 2 ) StartTime=atoi(argv[2]);
100
if ( argc > 3 ) EndTime=atoi(argv[3]);
101
if ( argc > 4 ) IncTime=atoi(argv[4]);
102
103
str = (char *)malloc( BUFFER_SIZE*sizeof(char) );
104
if ( !str ) {
105
fprintf( stderr, "ERROR: ElmerPost: memory allocation error.\n" );
106
exit(0);
107
}
108
109
NV = NE = NT = 0;
110
fgets( str, BUFFER_SIZE-1, fp );
111
sscanf( str, "%d %d %d %d", &NV,&NE,&NF,&NT );
112
113
if ( NV <= 0 || NE <=0 )
114
{
115
Tcl_SetResult( interp, "Bad element model file.\n",TCL_STATIC );
116
return TCL_ERROR;
117
}
118
119
ptr = str;
120
for( i=0; i<4; i++ )
121
{
122
while( *ptr && isspace(*ptr) ) ptr++;
123
while( *ptr && !isspace(*ptr) ) ptr++;
124
}
125
while( *ptr && isspace(*ptr) ) ptr++;
126
127
i = 0;
128
while ( *ptr )
129
{
130
if ( sscanf( ptr, "vector:%s", name ) == 1 )
131
{
132
variable[i].type = 1;
133
#if 0
134
variable[i].name = (char *)malloc( strlen(name)+1 );
135
#endif
136
strcpy( variable[i].name, name );
137
138
i++;
139
} else if ( sscanf( ptr, "scalar:%s", name ) == 1 )
140
{
141
variable[i].type = 2;
142
#if 0
143
variable[i].name = (char *)malloc( strlen(name)+1 );
144
#endif
145
strcpy( variable[i].name, name );
146
147
i++;
148
}
149
150
while( *ptr && !isspace(*ptr) ) ptr++;
151
while( *ptr && isspace(*ptr) ) ptr++;
152
153
while( *ptr && !isspace(*ptr) ) ptr++;
154
while( *ptr && isspace(*ptr) ) ptr++;
155
}
156
NamesGiven = i;
157
158
if ( !CurrentObject->ElementModel )
159
CurrentObject->ElementModel = (element_model_t *)calloc( 1,sizeof(element_model_t) );
160
161
if ( CurrentObject == &VisualObject )
162
CurrentObject->ElementModel->NodeArray = NodeArray =
163
MATR( var_new( "nodes", TYPE_DOUBLE, 3, NV ) );
164
else
165
{
166
sprintf( str, "nodes_%s", CurrentObject->Name );
167
168
CurrentObject->ElementModel->NodeArray = NodeArray =
169
MATR( var_new( str, TYPE_DOUBLE, 3, NV ) );
170
}
171
172
Tcl_LinkVar( TCLInterp, "NumberOfTimesteps", (char *)&CurrentObject->ElementModel->NofTimesteps, TCL_LINK_INT );
173
174
xmin = ymin = zmin = DBL_MAX;
175
xmax = ymax = zmax = -DBL_MAX;
176
for( i=0; i<NV; i++ )
177
{
178
fgets(str,BUFFER_SIZE-1,fp);
179
if ( *str == '#' ) { i--; continue; }
180
181
sscanf( str, "%lf %lf %lf", &NodeArray[i],&NodeArray[NV+i],&NodeArray[2*NV+i] );
182
183
xmin = MIN( xmin, NodeArray[i] );
184
ymin = MIN( ymin, NodeArray[NV+i] );
185
zmin = MIN( zmin, NodeArray[2*NV+i] );
186
187
xmax = MAX( xmax, NodeArray[i] );
188
ymax = MAX( ymax, NodeArray[NV+i] );
189
zmax = MAX( zmax, NodeArray[2*NV+i] );
190
}
191
192
if (CurrentObject->ElementModel->Elements )
193
{
194
for( i=0; i<CurrentObject->ElementModel->NofElements; i++ )
195
if (CurrentObject->ElementModel->Elements[i].Topology )
196
{
197
free( CurrentObject->ElementModel->Elements[i].Topology );
198
}
199
free(CurrentObject->ElementModel->Elements );
200
}
201
CurrentObject->ElementModel->Elements = Elements = (element_t *)calloc( NE,sizeof(element_t) );
202
203
geo_free_groups(CurrentObject->ElementModel->Groups );
204
CurrentObject->ElementModel->Groups = NULL;
205
206
for( i=0; i<NE; i++ )
207
{
208
fgets(str,BUFFER_SIZE-1,fp);
209
210
if ( *str == '#' )
211
{
212
if ( strncmp( str, "#group ", 7 ) == 0 )
213
{
214
sscanf( str, "#group %s", groupname );
215
groupid = geo_group_id( CurrentObject->ElementModel,groupname,1 );
216
} else if ( strncmp( str, "#endgroup ",10 ) == 0 )
217
{
218
sscanf( str, "#endgroup %s", groupname );
219
groupid = geo_group_id( CurrentObject->ElementModel,groupname,0 );
220
}
221
i--;
222
continue;
223
}
224
225
for( gid=0; gid<MAX_GROUP_IDS; gid++ )CurrentObject->ElementModel->Elements[i].GroupIds[gid] = -1;
226
227
n = sscanf( str, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
228
groupname, &code, &E[0],&E[1],&E[2],&E[3],&E[4],&E[5],&E[6],&E[7],&E[8],&E[9],
229
&E[10],&E[11],&E[12],&E[13],&E[14],&E[15],&E[16],&E[17],&E[18],&E[19],
230
&E[20],&E[21],&E[22],&E[23],&E[24],&E[25],&E[26] );
231
232
n = n - 2;
233
234
while( n < (code - 100 * (code / 100)) )
235
{
236
fgets( str,BUFFER_SIZE-1,fp );
237
n = n + sscanf( str, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
238
&E[n],&E[n+1],&E[n+2],&E[n+3],&E[n+4],&E[n+5],&E[n+6],&E[n+7],&E[n+8],&E[n+9],
239
&E[n+10],&E[n+11],&E[n+12],&E[n+13],&E[n+14],&E[n+15],&E[n+16],&E[n+17],&E[n+18],
240
&E[n+19],&E[n+20],&E[n+21],&E[n+22],&E[n+23],&E[n+24],&E[n+25],&E[n+26] );
241
}
242
243
244
groupid = geo_group_id( CurrentObject->ElementModel,groupname,1 );
245
246
for( EL=ElementDefs.ElementTypes; EL!=NULL; EL=EL->Next )
247
if ( code == EL->ElementCode )
248
{
249
Elements[total].ElementType = EL;
250
Elements[total].DisplayFlag = TRUE;
251
252
for( gid=0; gid<MAX_GROUP_IDS; gid++ ) if ( Elements[total].GroupIds[gid] < 0 ) break;
253
254
groupid = 0;
255
for( grp=CurrentObject->ElementModel->Groups; grp != NULL; grp=grp->Next, groupid++ )
256
if ( grp->Open ) if ( gid < MAX_GROUP_IDS ) Elements[total].GroupIds[gid++] = groupid;
257
258
Elements[total].Topology = (int *)malloc( EL->NumberOfNodes*sizeof(int) );
259
260
if ( !Elements[total].Topology )
261
{
262
Tcl_SetResult( interp,"FATAL: can't alloc element connection tables.\n",TCL_STATIC );
263
return TCL_ERROR;
264
}
265
266
for( j=0; j<EL->NumberOfNodes; j++ ) Elements[total].Topology[j] = E[j];
267
268
total++;
269
270
break;
271
}
272
273
groupid = geo_group_id( CurrentObject->ElementModel,groupname,0 );
274
275
if ( EL == NULL )
276
{
277
if ( code != 101 )
278
fprintf( stderr,"Unknown element type: [%d]. Skipping Element.\n", code );
279
}
280
}
281
282
CurrentObject->ElementModel->NofElements = NE = total;
283
CurrentObject->ElementModel->NofNodes = NV;
284
CurrentObject->ElementModel->NofTimesteps = (EndTime-StartTime+IncTime) / IncTime;
285
ToRead = CurrentObject->ElementModel->NofTimesteps;
286
287
last = 0;
288
t = 0;
289
if ( NF>0 )
290
{
291
Times = malloc( 3*ToRead*sizeof(double) );
292
for( i=0; i<ToRead; i++ )
293
{
294
Times[0*ToRead+i] = i+1;
295
Times[1*ToRead+i] = i+1;
296
Times[2*ToRead+i] = i+1;
297
}
298
299
if ( !NamesGiven ) {
300
if ( NF>=3 )
301
{
302
Vabs = MATR( var_new( "vabs", TYPE_DOUBLE, 1, ToRead*NV ) );
303
Velo = MATR( var_new( "velo", TYPE_DOUBLE, 3, ToRead*NV ) );
304
}
305
Pres = MATR( var_new( "pres", TYPE_DOUBLE, 1, ToRead*NV ) );
306
Temp = MATR( var_new( "temp", TYPE_DOUBLE, 1, ToRead*NV ) );
307
308
if ( NF>=3 )
309
{
310
t = 0;
311
for( i=0; i<EndTime; i++ )
312
{
313
if ( feof(fp) ) goto exit_loop;
314
315
if ( i<StartTime-1 || ((i-StartTime+1)%IncTime) ) {
316
for( k=0; k<NV; k++ ) {
317
fgets( str,BUFFER_SIZE-1,fp );
318
if ( feof(fp) ) goto exit_loop;
319
if ( *str == '#' ) k--;
320
}
321
} else {
322
for( k=0; k<NV; k++ )
323
{
324
fgets( str,BUFFER_SIZE-1,fp );
325
if ( feof( fp ) ) goto exit_loop;
326
if ( *str == '#' ) { k--; continue; }
327
sscanf( str, "%lf %lf %lf %lf %lf",&Velo[t*NV+k], &Velo[NV*(t+ToRead)+k],
328
&Velo[NV*(t+2*ToRead)+k], &Pres[t*NV+k],&Temp[t*NV+k] );
329
}
330
t++;
331
}
332
}
333
334
for( i=0; i<NV*ToRead; i++ )
335
{
336
Vabs[i] = sqrt( Velo[i]*Velo[i]+Velo[NV*ToRead+i]*Velo[NV*ToRead+i]+
337
Velo[2*NV*ToRead+i]*Velo[2*NV*ToRead+i] );
338
}
339
} else {
340
t = 0; last = 0;
341
for( i=0; i<EndTime; i++ )
342
{
343
if ( feof(fp) ) goto exit_loop;
344
if ( i < StartTime-1 || ((i-StartTime+1)%IncTime) )
345
{
346
for( k=0; k<NV; k++ ) {
347
fgets( str,BUFFER_SIZE-1,fp );
348
if ( feof( fp ) ) goto exit_loop;
349
if ( *str == '#' ) k--;
350
}
351
} else {
352
for( k=0; k<NV; k++ )
353
{
354
fgets( str,BUFFER_SIZE-1,fp );
355
if ( feof( fp ) ) goto exit_loop;
356
if ( *str == '#' ) { k--; continue; }
357
sscanf( str, "%lf %lf", &Pres[t*NV+k],&Temp[t*NV+k] );
358
}
359
t++;
360
}
361
}
362
}
363
} else {
364
for( i=0; i<NamesGiven; i++ ) {
365
if ( variable[i].type == 1 ) {
366
Vector[i] = MATR( var_new( variable[i].name, TYPE_DOUBLE, 3, ToRead*NV ) );
367
strcpy( str, variable[i].name ); strcat( str, "_abs" );
368
Scalar[i] = MATR( var_new( str, TYPE_DOUBLE, 1, ToRead*NV ) );
369
} else {
370
Scalar[i] = MATR( var_new( variable[i].name, TYPE_DOUBLE, 1, ToRead*NV ) );
371
}
372
}
373
374
t = 0;
375
for( i=0; i<EndTime; i++ )
376
{
377
#if 0
378
if ( feof(fp) ) goto exit_loop;
379
if ( i<StartTime-1 || ((i-StartTime+1)%IncTime) )
380
{
381
for( j=0; j<NV*NF; j++ )
382
{
383
if ( feof(fp) ) goto exit_loop;
384
while ( 1 != fscanf( fp, "%lf", &fdummy ) )
385
{
386
fgets( str, BUFFER_SIZE-1, fp );
387
if ( feof( fp ) ) goto exit_loop;
388
if ( strncmp( str, "#time ", 6 ) == 0 )
389
{
390
double t1,t2,t3;
391
392
sscanf( str, "#time %lf %lf %lf", &t1,&t2,&t3 );
393
Times[0*ToRead+t] = t1;
394
Times[1*ToRead+t] = t2;
395
Times[2*ToRead+t] = t3;
396
}
397
}
398
}
399
} else
400
#endif
401
{
402
for( k=0; k<NV; k++ )
403
{
404
if ( feof( fp ) ) goto exit_loop;
405
for( j=0; j<NamesGiven; j++ )
406
{
407
if ( feof(fp) ) goto exit_loop;
408
409
if ( variable[j].type == 1 )
410
{
411
if ( feof(fp) ) goto exit_loop;
412
while ( 1 != fscanf( fp, "%lf",&Vector[j][t*NV+k] ) ) {
413
fgets( str,BUFFER_SIZE-1,fp );
414
if ( feof( fp ) ) goto exit_loop;
415
if ( strncmp( str, "#time ", 6 ) == 0 )
416
{
417
double t1,t2,t3;
418
419
sscanf( str, "#time %lf %lf %lf", &t1,&t2,&t3 );
420
Times[0*ToRead+t] = t1;
421
Times[1*ToRead+t] = t2;
422
Times[2*ToRead+t] = t3;
423
}
424
}
425
426
if ( feof(fp) ) goto exit_loop;
427
while ( 1 != fscanf( fp, "%lf",&Vector[j][(t+ToRead)*NV+k] ) ) {
428
fgets( str,BUFFER_SIZE-1,fp );
429
if ( feof(fp) ) goto exit_loop;
430
if ( strncmp( str, "#time ", 6 ) == 0 )
431
{
432
double t1,t2,t3;
433
434
sscanf( str, "#time %lf %lf %lf", &t1,&t2,&t3 );
435
Times[0*ToRead+t] = t1;
436
Times[1*ToRead+t] = t2;
437
Times[2*ToRead+t] = t3;
438
}
439
}
440
441
if ( feof(fp) ) goto exit_loop;
442
while ( 1 != fscanf( fp, "%lf",&Vector[j][(t+2*ToRead)*NV+k] ) ) {
443
fgets( str,BUFFER_SIZE-1,fp );
444
if ( feof(fp) ) goto exit_loop;
445
if ( strncmp( str, "#time ", 6 ) == 0 )
446
{
447
double t1,t2,t3;
448
449
sscanf( str, "#time %lf %lf %lf", &t1,&t2,&t3 );
450
Times[0*ToRead+t] = t1;
451
Times[1*ToRead+t] = t2;
452
Times[2*ToRead+t] = t3;
453
}
454
}
455
456
Scalar[j][t*NV+k] = sqrt(
457
Vector[j][t*NV+k]*Vector[j][t*NV+k]+
458
Vector[j][NV*(t+ToRead)+k]*Vector[j][NV*(t+ToRead)+k] +
459
Vector[j][NV*(t+2*ToRead)+k]*Vector[j][NV*(t+2*ToRead)+k] );
460
461
} else {
462
if ( feof(fp) ) goto exit_loop;
463
while ( 1 != fscanf( fp, "%lf",&Scalar[j][t*NV+k] ) )
464
{
465
fgets( str,BUFFER_SIZE-1,fp );
466
if ( feof(fp) ) goto exit_loop;
467
if ( strncmp( str, "#time ", 6 ) == 0 )
468
{
469
double t1,t2,t3;
470
471
sscanf( str, "#time %lf %lf %lf", &t1,&t2,&t3 );
472
Times[0*ToRead+t] = t1;
473
Times[1*ToRead+t] = t2;
474
Times[2*ToRead+t] = t3;
475
}
476
}
477
}
478
}
479
}
480
last = 0;
481
if ( i>=StartTime-1 && !((i-StartTime+1)%IncTime) ) { last=1; t++; }
482
if ( t >= ToRead ) goto exit_loop;
483
}
484
}
485
}
486
}
487
exit_loop:
488
489
if ( t == 0 && ToRead > 0 && i > 0 ) t++;
490
491
fclose( fp );
492
493
if ( t > 0 ) {
494
CurrentObject->ElementModel->NofTimesteps = t;
495
if ( CurrentObject == &VisualObject )
496
tvar = MATR( var_new( "times", TYPE_DOUBLE, 3, t ) );
497
else
498
{
499
sprintf( str, "times_%s", CurrentObject->Name );
500
tvar = MATR( var_new( str, TYPE_DOUBLE, 3, t ) );
501
}
502
503
for( i=0; i<t; i++ ) {
504
tvar[0*t+i] = Times[0*ToRead+i];
505
tvar[1*t+i] = Times[1*ToRead+i];
506
tvar[2*t+i] = Times[2*ToRead+i];
507
}
508
509
free( Times );
510
}
511
512
if ( t != ToRead ) {
513
fprintf( stderr,"WARNING: ElmerPost: Not enough data for all timesteps"
514
" requested. REQUEST: %d, GOT: %d\n", ToRead, t );
515
516
for( i=0; i<NamesGiven; i++ )
517
{
518
if ( t > 0 ) {
519
if ( variable[i].type == 1 )
520
{
521
Var1 = (VARIABLE *)lst_find( VARIABLES, variable[i].name );
522
#if 0
523
NCOL(Var1) = t*NV;
524
#endif
525
526
strcpy( str, variable[i].name ); strcat( str, "_abs" );
527
Var1 = (VARIABLE *)lst_find( VARIABLES, str );
528
#if 0
529
NCOL(Var1) = t*NV;
530
#endif
531
} else {
532
Var1 = (VARIABLE *)lst_find( VARIABLES, variable[i].name );
533
#if 0
534
NCOL(Var1) = t*NV;
535
#endif
536
}
537
} else {
538
if ( variable[i].type == 1 )
539
{
540
var_delete( variable[i].name );
541
strcpy( str, variable[i].name ); strcat( str, "_abs" );
542
var_delete( str );
543
} else {
544
var_delete( variable[i].name );
545
}
546
}
547
}
548
}
549
550
groupid = 0;
551
for( group =CurrentObject->ElementModel->Groups; group!=NULL; group=group->Next,groupid++ )
552
{
553
sprintf( name, "Groups(%d)", groupid );
554
Tcl_SetVar( TCLInterp, name, group->Name, TCL_GLOBAL_ONLY );
555
}
556
557
sprintf( name, "NumberOfGroups" );
558
sprintf( str, "%d", groupid );
559
Tcl_SetVar( TCLInterp, name, str, TCL_GLOBAL_ONLY );
560
561
if ( CurrentObject->Geometry )
562
{
563
geo_free_edge_tables( CurrentObject->Geometry );
564
geo_free_vertex_face_tables( CurrentObject->Geometry );
565
} else {
566
CurrentObject->Geometry = (geometry_t *)calloc( 1,sizeof(geometry_t) );
567
}
568
569
CurrentObject->Geometry->VertexCount = 0;
570
571
if ( !KeepScale ) {
572
s = MAX( MAX( xmax-xmin, ymax-ymin ), zmax-zmin );
573
} else {
574
s = CurrentObject->Geometry->Scale;
575
xmin = CurrentObject->Geometry->MinMax[0].x[0];
576
ymin = CurrentObject->Geometry->MinMax[0].x[1];
577
zmin = CurrentObject->Geometry->MinMax[0].x[2];
578
579
xmax = CurrentObject->Geometry->MinMax[1].x[0];
580
ymax = CurrentObject->Geometry->MinMax[1].x[1];
581
zmax = CurrentObject->Geometry->MinMax[1].x[2];
582
}
583
XMin = YMin = ZMin = DBL_MAX;
584
XMax = YMax = ZMax = -DBL_MAX;
585
586
for( i=0; i<NV; i++ )
587
{
588
vertex.x[0] = ( 2.0 * ( NodeArray[i] - xmin) - (xmax - xmin)) / s;
589
vertex.x[1] = ( 2.0 * ( NodeArray[NV+i] - ymin) - (ymax - ymin)) / s;
590
vertex.x[2] = ( 2.0 * ( NodeArray[2*NV+i] - zmin) - (zmax - zmin)) / s;
591
592
XMin = MIN( XMin,vertex.x[0] );
593
YMin = MIN( YMin,vertex.x[1] );
594
ZMin = MIN( ZMin,vertex.x[2] );
595
596
XMax = MAX( XMax,vertex.x[0] );
597
YMax = MAX( YMax,vertex.x[1] );
598
ZMax = MAX( ZMax,vertex.x[2] );
599
600
vertex.ElementModelNode = TRUE;
601
geo_add_vertex( CurrentObject->Geometry, &vertex );
602
}
603
604
CurrentObject->Geometry->Scale = s;
605
CurrentObject->Geometry->MinMax[0].x[0] = xmin;
606
CurrentObject->Geometry->MinMax[0].x[1] = ymin;
607
CurrentObject->Geometry->MinMax[0].x[2] = zmin;
608
609
CurrentObject->Geometry->MinMax[1].x[0] = xmax;
610
CurrentObject->Geometry->MinMax[1].x[1] = ymax;
611
CurrentObject->Geometry->MinMax[1].x[2] = zmax;
612
613
CurrentObject->Geometry->Edges = (edge_t *)calloc( CurrentObject->Geometry->VertexCount, sizeof(edge_t) );
614
615
if ( !CurrentObject->Geometry->Edges )
616
{
617
fprintf( stderr, "Can't alloc edge array.\n" );
618
exit( 0 );
619
}
620
621
CurrentObject->Geometry->TriangleCount = 0;
622
623
for( i=0; i<NE; i++ )
624
{
625
EL = CurrentObject->ElementModel->Elements[i].ElementType;
626
(*EL->Triangulate)( CurrentObject->Geometry,(element_t *)&Elements[i],(element_t *)&Elements[i] );
627
}
628
629
geo_vertex_normals( CurrentObject->Geometry,50.0 );
630
631
CurrentTimeStep = 0;
632
633
{
634
void UpdateObject(), DrawItSomeTimeWhenIdle();
635
UpdateObject( 0,NULL,0,NULL );
636
DrawItSomeTimeWhenIdle();
637
}
638
639
free( str );
640
641
return TCL_OK;
642
}
643
644
#if 0
645
static VARIABLE *SetModel( VARIABLE *ptr )
646
{
647
static vertex_t vertex;
648
element_type_t *EL;
649
650
double s,*NodeArray,*Velo,*Vabs,*Temp,*Pres;
651
652
int i,j,k,total;
653
654
double *Topology = MATR(NEXT(ptr));
655
double *Type = MATR(NEXT(NEXT(ptr)));
656
657
NV = NCOL(ptr);
658
659
NE = NROW(NEXT(ptr));
660
661
if ( NEXT(NEXT(NEXT(ptr))) )
662
NT = M(NEXT(NEXT(NEXT(ptr))),0,0);
663
else
664
NT = 1;
665
666
CurrentObject->ElementModel->NodeArray = NodeArray = MATR( ptr );
667
668
xmin = ymin = zmin = DBL_MAX;
669
xmax = ymax = zmax = -DBL_MAX;
670
for( i=0; i<NV; i++ )
671
{
672
xmin = MIN( xmin, NodeArray[i] );
673
ymin = MIN( ymin, NodeArray[NV+i] );
674
zmin = MIN( zmin, NodeArray[2*NV+i] );
675
676
xmax = MAX( xmax, NodeArray[i] );
677
ymax = MAX( ymax, NodeArray[NV+i] );
678
zmax = MAX( zmax, NodeArray[2*NV+i] );
679
}
680
681
if (CurrentObject->ElementModel.Elements )
682
{
683
for( i=0; i<ElementModel.NofElements; i++ )
684
if (CurrentObject->ElementModel.Elements[i].Topology )
685
{
686
free( CurrentObject->ElementModel.Elements[i].Topology );
687
}
688
free(CurrentObject->ElementModel.Elements );
689
}
690
CurrentObject->ElementModel.Elements = Elements = (element_t *)calloc( NE,sizeof(element_t) );
691
692
total = 0;
693
for( i=0; i<NE; i++ )
694
{
695
for( EL=ElementDefs.ElementTypes; EL != NULL; EL=EL->Next )
696
if ( Type[i] == EL->ElementCode )
697
{
698
Elements[total].ElementType = EL;
699
700
Elements[total].Topology = (int *)malloc( EL->NumberOfNodes*sizeof(int) );
701
702
if ( !Elements[total].Topology )
703
{
704
error( "FATAL: can't alloc element connection tables.\n" );
705
}
706
707
for( j=0; j<EL->NumberOfNodes; j++ ) Elements[total].Topology[j] = Topology[i*NCOL(NEXT(ptr))+j];
708
total++;
709
710
break;
711
}
712
713
if ( EL == NULL )
714
{
715
fprintf( stderr, "Unknown element type: [%d]. Skipping Element.\n", Type[i] );
716
}
717
}
718
719
CurrentObject->ElementModel.NofElements = NE = total;
720
CurrentObject->ElementModel.NofNodes = NV;
721
CurrentObject->ElementModel.NofTimesteps = NT;
722
723
geo_free_edge_tables( &Geometry );
724
geo_free_vertex_face_tables( &Geometry );
725
726
Geometry.VertexCount = 0;
727
728
s = MAX( MAX( xmax-xmin, ymax-ymin ), zmax-zmin );
729
XMin = YMin = ZMin = DBL_MAX;
730
XMax = YMax = ZMax = -DBL_MAX;
731
732
for( i=0; i<NV; i++ )
733
{
734
vertex.x[0] = ( 2.0 * ( NodeArray[i] - xmin) - (xmax - xmin)) / s;
735
vertex.x[1] = ( 2.0 * ( NodeArray[NV+i] - ymin) - (ymax - ymin)) / s;
736
vertex.x[2] = ( 2.0 * ( NodeArray[2*NV+i] - zmin) - (zmax - zmin)) / s;
737
738
XMin = MIN( XMin,vertex.x[0] );
739
YMin = MIN( YMin,vertex.x[1] );
740
ZMin = MIN( ZMin,vertex.x[2] );
741
742
XMax = MAX( XMax,vertex.x[0] );
743
YMax = MAX( YMax,vertex.x[1] );
744
ZMax = MAX( ZMax,vertex.x[2] );
745
746
vertex.ElementModelNode = TRUE;
747
geo_add_vertex( &Geometry, &vertex );
748
}
749
750
Geometry.MinMax[0].x[0] = xmin;
751
Geometry.MinMax[0].x[1] = ymin;
752
Geometry.MinMax[0].x[2] = zmin;
753
754
Geometry.MinMax[1].x[0] = xmax;
755
Geometry.MinMax[1].x[1] = ymax;
756
Geometry.MinMax[1].x[2] = zmax;
757
758
Geometry.Edges = (edge_t *)calloc( Geometry.VertexCount, sizeof(edge_t) );
759
760
if ( !Geometry.Edges )
761
{
762
error( "SetModel: FATAL: Can't alloc edge array.\n" );
763
}
764
765
Geometry.TriangleCount = 0;
766
767
for( i=0; i<NE; i++ )
768
{
769
EL = Elements[i].ElementType;
770
(*EL->Triangulate)( &Geometry,(element_t *)&Elements[i],(element_t *)&Elements[i] );
771
}
772
773
geo_vertex_normals( &Geometry,50.0 );
774
775
CurrentTimeStep = 0;
776
777
fprintf( stderr, "TRIANGLES: %d %d, TS: %d\n", Geometry.TriangleCount,Geometry.MaxTriangleCount,NT );
778
779
UpdateObject( 0,NULL,0,NULL );
780
DrawItSomeTimeWhenIdle();
781
782
return (VARIABLE *)NULL;
783
}
784
#endif
785
786
int Readfile_Init( Tcl_Interp *interp )
787
{
788
Tcl_CreateCommand( interp,"cReadFile",(void *)epReadFile,(ClientData)NULL,(Tcl_CmdDeleteProc *)NULL);
789
#if 0
790
com_init
791
(
792
"model", FALSE, FALSE,SetModel,3,4,
793
"Usage: model(node-array,topology,element-type,[timesteps])\nSet current element model."
794
);
795
#endif
796
797
return TCL_OK;
798
}
799
800