1 /***********************************************************************
2 *
3 * ***** *** ***
4 * * * * * *
5 * * *** ***
6 * * * * * *
7 * ***** *** ***
8 *
9 * A FREE Finite Elements Analysis Program in ANSI C for the Windows OS.
10 *
11 * Composed and edited and copyright by
12 * Professor Dr.-Ing. Frank Rieg, University of Bayreuth, Germany
13 *
14 * eMail:
15 * frank.rieg@uni-bayreuth.de
16 * dr.frank.rieg@t-online.de
17 *
18 * V15.0 November 18, 2015, 2011
19 *
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2, or (at your option)
23 * any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
29 *
30 * You should have received a copy of the GNU General Public License
31 * along with this program; see the file COPYING. If not, write to
32 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
33 ***********************************************************************/
34 /***********************************************************************
35 * Z88H fuer Windows
36 * 7.3.2017 Rieg
37 * Cuthill- McKee Algorithmus fuer Z88I1.TXT, Z88I2.TXT und Z88I5.TXT.
38 * besonders fuer Files, die mit Z88G aus Pro/ENGINEER/Pro/MESH
39 * erzeugt wurden
40 ***********************************************************************/
41 /***********************************************************************
42 * Windows
43 ***********************************************************************/
44 #ifdef FR_WIN
45 #include <z88h.h>
46 #include <windows.h>
47 #include <commctrl.h>
48 #include <stdio.h> /* FILE */
49 #include <stdlib.h> /* exit */
50 #include <string.h> /* strcpy */
51 #endif
52
53 /***********************************************************************
54 * Formatbeschreiber
55 ***********************************************************************/
56 #ifdef FR_XINT
57 #define CFORMA "%s %d"
58 #define PDB "%d "
59 #define PD "%d"
60 #define PD9B "%9d "
61 #define PD9 "%9d"
62 #endif
63
64 #ifdef FR_XLONG
65 #define CFORMA "%s %ld"
66 #define PDB "%ld "
67 #define PD "%ld"
68 #define PD9B "%9ld "
69 #define PD9 "%9ld"
70 #endif
71
72 #ifdef FR_XLOLO
73 #define CFORMA "%s %lld"
74 #define PDB "%lld "
75 #define PD "%lld"
76 #define PD9B "%9lld "
77 #define PD9 "%9lld"
78 #endif
79
80 #ifdef FR_XDOUB
81 #define PFB "%lf "
82 #define PF "%lf"
83 #define PE13B "%+#13.5lE "
84 #define PE13 "%+#13.5lE"
85 #endif
86
87 #ifdef FR_XQUAD
88 #define PFB "%Lf "
89 #define PF "%Lf"
90 #define PE13B "%+#13.5LE "
91 #define PE13 "%+#13.5LE"
92 #endif
93
94 /***********************************************************************
95 * Window- Function-Declarationen
96 ***********************************************************************/
97 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
98
99 HWND InitToolBar (HWND hParent);
100
101 HFONT EzCreateFont (HDC hdc, char * szFaceName, int iDeciPtHeight,
102 int iDeciPtWidth, int iAttributes, BOOL fLogRes);
103
104 /***********************************************************************
105 * externe Variable
106 ***********************************************************************/
107 HDC hDC;
108 HINSTANCE hInstance;
109 HFONT hFont;
110 HWND hToolBar;
111 HMENU hMenuGer,hMenuEng;
112 HCURSOR waitcur;
113
114 /***********************************************************************
115 * Functions
116 ***********************************************************************/
117 int z882cut(void);
118 int cut88(void);
119 int cut2z88(void);
120 int rdy88h(void);
121 int wrim88h(FR_INT4,int);
122 int wlog88h(FR_INT4,int);
123 int ale88h(int);
124 int lan88h(void);
125 FR_INT4 FR_MAX(FR_INT4,FR_INT4);
126 FR_INT4 FR_MIN(FR_INT4,FR_INT4);
127
128 /****************************************************************************
129 * globale Variable
130 ****************************************************************************/
131 /*--------------------------------------------------------------------------
132 * Files
133 *-------------------------------------------------------------------------*/
134 FILE *fdyn,*fwlo,*fcfg;
135
136 char cdyn[8] = "z88.dyn";
137 char clgd[9] = "z88h.log";
138 char cfg[11] = "z88com.cfg";
139
140 /*--------------------------------------------------------------------------
141 * Char-Arrays
142 *-------------------------------------------------------------------------*/
143 char cstore[256];
144 char cbcall[128];
145 char cbpref[128];
146 char cbhelp[512];
147 char callbrow[512];
148 char cmess[512];
149 char cbytes[128];
150 char *comli;
151
152 /*--------------------------------------------------------------------------
153 * Variable
154 *-------------------------------------------------------------------------*/
155 FR_INT4 ICFLAG=1; /* Reverse Cuthill-McKee ist voreingestellt */
156 FR_INT4 LANG=2;
157 FR_INT4 MAXGRA,MAXNDL;
158 FR_INT4 iqflag;
159
160 int *pp;
161
162 /***********************************************************************
163 * Typen
164 ***********************************************************************/
165 typedef int BOOL;
166
167 #define TRUE 1
168 #define FALSE 0
169
170 /***********************************************************************
171 * WinMain
172 ***********************************************************************/
WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpszCmdLine,int nCmdShow)173 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
174 PSTR lpszCmdLine, int nCmdShow)
175 {
176 HWND hWnd;
177 MSG msg;
178 WNDCLASSEX wndclass;
179
180 char capname[10];
181
182 /***********************************************************************
183 * Handles kommen lassen, window oeffnen
184 ***********************************************************************/
185 comli= (char *)calloc(256,sizeof(char));
186 comli= lpszCmdLine;
187
188 strcpy(capname, "Z88H");
189
190 wndclass.cbSize = sizeof(wndclass);
191 wndclass.style = CS_HREDRAW | CS_VREDRAW;
192 wndclass.lpfnWndProc = WndProc;
193 wndclass.cbClsExtra = 0;
194 wndclass.cbWndExtra = 0;
195 wndclass.hInstance = hInstance;
196 wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_Z88H));
197 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
198 wndclass.hbrBackground = CreateSolidBrush(RGB(255,255,255));
199 wndclass.lpszMenuName = capname;
200 wndclass.lpszClassName = capname;
201 wndclass.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_Z88H));
202
203 RegisterClassEx(&wndclass);
204
205 hWnd = CreateWindow(capname,"Z88 Cuthill-McKee Program Z88H",
206 WS_OVERLAPPEDWINDOW,
207 0, 150,
208 440, 326,
209 NULL, NULL, hInstance, NULL);
210
211 InitCommonControls();
212
213 ShowWindow(hWnd, nCmdShow);
214 UpdateWindow(hWnd);
215
216 while(GetMessage(&msg, NULL, 0, 0))
217 {
218 TranslateMessage(&msg);
219 DispatchMessage(&msg);
220 }
221
222 DeleteObject(hFont);
223
224 return msg.wParam;
225 }
226
227 /***********************************************************************
228 * Main Window Procedure
229 ***********************************************************************/
WndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)230 LRESULT CALLBACK WndProc(HWND hWnd, UINT Message,
231 WPARAM wParam, LPARAM lParam)
232 {
233 extern HDC hDC;
234 extern HINSTANCE hInstance;
235 extern HFONT hFont;
236 extern HWND hToolBar;
237 extern HMENU hMenuGer,hMenuEng;
238 extern HCURSOR waitcur;
239
240 extern FR_INT4 LANG;
241
242 extern char cstore[];
243 extern char cbcall[];
244 extern char cbpref[];
245 extern char cbhelp[];
246 extern char cmess[];
247 extern char *comli;
248
249 PAINTSTRUCT ps;
250
251 static int ixClient,iyClient;
252
253 int imess,iret;
254
255 size_t laenge;
256
257 /*----------------------------------------------------------------------
258 * Los gehts
259 *---------------------------------------------------------------------*/
260 switch (Message)
261 {
262 /*----------------------------------------------------------------------
263 * case WM_CREATE
264 *---------------------------------------------------------------------*/
265 case WM_CREATE:
266 /*======================================================================
267 * hInstance kommen lassen
268 *=====================================================================*/
269 #ifdef FR_XWIN64
270 hInstance= (HINSTANCE)GetWindowLongPtr(hWnd,GWLP_HINSTANCE);
271 #endif
272 #ifdef FR_XWIN32
273 hInstance= (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
274 #endif
275
276 /*======================================================================
277 * Wartecursor anlegen
278 *=====================================================================*/
279 waitcur= LoadCursor(hInstance,MAKEINTRESOURCE(CUR_Z88H));
280
281 /*======================================================================
282 * Sprache feststellen
283 *=====================================================================*/
284 iret= lan88h();
285 if(iret != 0)
286 {
287 ale88h(iret);
288 PostQuitMessage(0);
289 return(1);
290 }
291
292 hMenuGer= LoadMenu(hInstance,"GERMAN");
293 hMenuEng= LoadMenu(hInstance,"ENGLISH");
294
295 if(LANG == 1) SetMenu(hWnd,hMenuGer);
296 if(LANG == 2) SetMenu(hWnd,hMenuEng);
297
298 /*======================================================================
299 * Toolbar
300 *=====================================================================*/
301 hToolBar= InitToolBar(hWnd);
302
303 /*======================================================================
304 * Commandline auswerten
305 *=====================================================================*/
306 if( (strstr(comli,"-run"))!= NULL)
307 PostMessage(hWnd,WM_COMMAND,IDM_GO,0);
308
309 return 0; /* Ende WM_CREATE */
310
311 /*----------------------------------------------------------------------
312 * case WM_MOVE
313 *---------------------------------------------------------------------*/
314 case WM_MOVE:
315 return 0;
316
317 /*----------------------------------------------------------------------
318 * case WM_SIZE
319 *---------------------------------------------------------------------*/
320 case WM_SIZE:
321 iyClient= HIWORD(lParam);
322 ixClient= LOWORD(lParam);
323 return 0;
324
325 /*----------------------------------------------------------------------
326 * WM_NOTIFY
327 *---------------------------------------------------------------------*/
328 case WM_NOTIFY:
329 {
330 LPNMHDR pnmh= (LPNMHDR) lParam;
331 LPSTR pReply;
332
333 if(pnmh->code == TTN_NEEDTEXT)
334 {
335 LPTOOLTIPTEXT lpttt= (LPTOOLTIPTEXT) lParam;
336
337 switch(lpttt->hdr.idFrom)
338 {
339 case ITC_GO:
340 if(LANG == 1) pReply= "Berechne";
341 if(LANG == 2) pReply= "Run";
342 break;
343
344 case ITC_HELP:
345 if(LANG == 1) pReply= "OnLine-Hilfe";
346 if(LANG == 2) pReply= "OnLine Help";
347 break;
348
349 case ITC_XIT:
350 if(LANG == 1) pReply= "Beende";
351 if(LANG == 2) pReply= "Exit";
352 break;
353
354 }
355 lstrcpy(lpttt->szText,pReply);
356 }
357 return 0; /* sehr wichtig */
358 }
359
360 /*----------------------------------------------------------------------
361 * case WM_COMMAND
362 *---------------------------------------------------------------------*/
363 case WM_COMMAND:
364 switch (LOWORD(wParam))
365 {
366
367 /*======================================================================
368 * COMMAND : Wer ist es
369 *=====================================================================*/
370 case IDM_WER:
371 if(LANG == 1) strcpy(cmess,
372 "Cuthill-McKee Programm Z88H fuer Windows\n\
373 Version 15OS\n\
374 Copyright Univ.-Prof.Dr.-Ing. Frank Rieg,\n\
375 Universitaet Bayreuth, 2017\n\
376 Alle Rechte vorbehalten\n");
377
378 if(LANG == 2) strcpy(cmess,
379 "Cuthill-McKee Program Z88H for Windows\n\
380 Version 15OS\n\
381 Copyright Prof.Dr. Frank Rieg,\n\
382 University of Bayreuth, Germany 2017\n\
383 All rights reserved\n");
384
385 #ifdef FR_XQUAD
386 sprintf(cbytes,"Floats: %d Bytes\n",(int)sizeof(long double));
387 strcat(cmess,cbytes);
388 #endif
389 #ifdef FR_XDOUB
390 sprintf(cbytes,"Floats: %d Bytes\n",(int)sizeof(double));
391 strcat(cmess,cbytes);
392 #endif
393 #ifdef FR_XINT
394 sprintf(cbytes,"Integers: %d Bytes\n",(int)sizeof(int));
395 strcat(cmess,cbytes);
396 #endif
397 #ifdef FR_XLONG
398 sprintf(cbytes,"Integers: %d Bytes\n",(int)sizeof(long));
399 strcat(cmess,cbytes);
400 #endif
401 #ifdef FR_XLOLO
402 sprintf(cbytes,"Integers: %d Bytes\n",(int)sizeof(long long));
403 strcat(cmess,cbytes);
404 #endif
405 sprintf(cbytes,"Pointers: %d Bytes\n",(int)sizeof(pp));
406 strcat(cmess,cbytes);
407
408 MessageBox(NULL,cmess,"Z88H", MB_OK | MB_ICONINFORMATION);
409 return 0;
410
411 /*======================================================================
412 * COMMAND : Xit
413 *=====================================================================*/
414 case IDM_XIT:
415 case ITC_XIT:
416 PostQuitMessage(0);
417 return 0;
418
419 /*======================================================================
420 * COMMAND : Hilfe
421 *=====================================================================*/
422 case ITC_HELP:
423 fcfg= fopen(cfg,"r"); /* Z88COM.CFG oeffnen */
424 if(fcfg == NULL)
425 {
426 if(LANG == 1) strcpy(cmess,
427 "Datei Z88COM.CFG nicht vorhanden oder zerschossen !");
428 if(LANG == 2) strcpy(cmess,
429 "File Z88COM.CFG not available or destroyed !");
430 MessageBox(NULL,cmess,"Z88G", MB_OK | MB_ICONHAND);
431 }
432
433 rewind(fcfg);
434
435 fgets(cstore,128,fcfg);
436 fgets(cstore,128,fcfg);
437
438 fgets(cstore,128,fcfg);
439 laenge= strlen(cstore);
440 strncpy(cbpref,cstore,laenge-1);
441 strcat (cbpref,"\0");
442
443 fgets(cstore,128,fcfg);
444 laenge= strlen(cstore);
445 strncpy(cbcall,cstore,laenge-1);
446 strcat (cbcall,"\0");
447
448 fclose(fcfg);
449
450 strcpy(callbrow,cbcall);
451 strcat(callbrow," ");
452 strcat(callbrow,cbpref);
453 if(LANG == 1) strcat(callbrow,"z88mang.pdf");
454 if(LANG == 2) strcat(callbrow,"z88mane.pdf");
455 imess= WinExec(callbrow,SW_SHOW);
456 if(imess < 33)
457 {
458 wlog88h(0L,LOG_NOACROBAT);
459 ale88h(AL_NOACROBAT);
460 }
461 return 0;
462
463 /*======================================================================
464 * COMMAND : Go
465 *=====================================================================*/
466 case IDM_GO:
467 case ITC_GO:
468 SetCursor(waitcur);
469 ShowCursor(TRUE);
470
471 hDC= GetDC(hWnd);
472 hFont= EzCreateFont(hDC,"Times New Roman",120,0,2,TRUE);
473 SelectObject(hDC,hFont);
474 SetBkColor(hDC,RGB(255,255,255));
475
476 laenge= strlen(comli);
477 TextOut(hDC,10,30,comli,laenge);
478
479 iret= z882cut(); /* Z88I1.TXT in Z88H.IN */
480
481 if(iret == 0) iret= cut88(); /* Cuthill-McKee --> Z88H.OUT */
482 else
483 {
484 PostQuitMessage(0);
485 return(1);
486 }
487
488 if(iret == 0) iret= cut2z88(); /* Z88I1.TXT + Z88I2.TXT umbauen */
489 else
490 {
491 PostQuitMessage(0);
492 return(1);
493 }
494
495 /*---------------------------------------------------------------------------
496 * Ende Case Go
497 *--------------------------------------------------------------------------*/
498 ReleaseDC(hWnd,hDC);
499 SetCursor(LoadCursor(NULL,IDC_ARROW));
500 if(LANG == 1) strcpy(cmess,"Cuthill-McKee Programm Z88H gelaufen");
501 if(LANG == 2) strcpy(cmess,"Cuthill-McKee Program Z88H done");
502 MessageBox(NULL,cmess,"Z88H", MB_OK | MB_ICONINFORMATION);
503 PostQuitMessage(0);
504 return 0; /* end case GO */
505
506 default:
507 return DefWindowProc(hWnd, Message, wParam, lParam);
508 } /* end switch command */
509
510 /*----------------------------------------------------------------------
511 * case WM_PAINT
512 *---------------------------------------------------------------------*/
513 case WM_PAINT:
514 memset(&ps, 0x00, sizeof(PAINTSTRUCT));
515 hDC = BeginPaint(hWnd, &ps);
516
517 SetBkMode(hDC, TRANSPARENT);
518
519 EndPaint(hWnd, &ps);
520 return 0;
521
522 /*----------------------------------------------------------------------
523 * case WM_CLOSE
524 *---------------------------------------------------------------------*/
525 case WM_CLOSE:
526 PostQuitMessage(0);
527 return 0;
528
529 /*----------------------------------------------------------------------
530 * case WM_DESTROY
531 *---------------------------------------------------------------------*/
532 case WM_DESTROY:
533 PostQuitMessage(0);
534 return 0;
535
536 default:
537 return DefWindowProc(hWnd, Message, wParam, lParam);
538 }
539 }
540
541 /***********************************************************************
542 * Z882CUT
543 ***********************************************************************/
z882cut(void)544 int z882cut(void)
545 {
546 extern FR_INT4 iqflag;
547
548 FILE *fz88i1,*fcut,*fz88i5;
549
550 FR_INT4 nkp,ndim,ne,newnum,ianz,nfg,kflag,npr;
551 FR_INT4 koi[21];
552 FR_INT4 idummy,ityp;
553 FR_INT4 i;
554
555 char cstring[255];
556 char cfcut[]="z88h.in";
557 char cfi1[]= "z88i1.txt";
558 char cfi5[]= "z88i5.txt";
559
560 /*----------------------------------------------------------------------
561 * Files oeffnen
562 *---------------------------------------------------------------------*/
563 /*======================================================================
564 * Z88H.IN
565 *=====================================================================*/
566 if ((fcut=fopen(cfcut,"w"))==NULL)
567 {
568 ale88h(AL_NOIN);
569 wlog88h(0,LOG_NOIN);
570 return 1;
571 }
572 else
573 wrim88h(0,TX_INOPEN);
574
575 rewind(fcut);
576
577 /*======================================================================
578 * Z88I1.TXT
579 *=====================================================================*/
580 if ((fz88i1=fopen(cfi1,"r"))==NULL)
581 {
582 ale88h(AL_NOI1);
583 return 1;
584 }
585 else
586 wrim88h(0,TX_I1OPEN);
587
588 rewind(fz88i1);
589
590 /*======================================================================
591 * Z88I5.TXT
592 *=====================================================================*/
593 if ((fz88i5=fopen(cfi5,"r"))==NULL)
594 {
595 ale88h(AL_NOI5);
596 return 1;
597 }
598 else
599 wrim88h(0,TX_I5OPEN);
600
601 rewind(fz88i5);
602
603 /*----------------------------------------------------------------------
604 * Vorbereiten
605 *---------------------------------------------------------------------*/
606 newnum= -1; /* nur eine Startnummer */
607
608 fgets(cstring,254,fz88i1);
609 sscanf(cstring,PDB PDB PDB PD,&ndim,&nkp,&ne,&nfg);
610
611 fprintf(fcut,PD9B PD9 "\n",nkp,newnum);
612
613 fgets(cstring,254,fz88i5);
614 sscanf(cstring,PD,&npr);
615
616 if(npr > 0) iqflag= 1;
617 else iqflag= 0;
618
619 /*----------------------------------------------------------------------
620 * 1. Durchlauf: Rewind, Leerlesen Koordinaten, Elementtyp feststellen
621 *---------------------------------------------------------------------*/
622 rewind(fz88i1);
623
624 fgets(cstring,254,fz88i1); /* leerlesen 1. Zeile */
625
626 for(i = 1;i <= nkp; i++) /* leerlesen Koordinaten */
627 fgets(cstring,254,fz88i1);
628
629 fgets(cstring,254,fz88i1);
630 sscanf(cstring,PDB PD,&idummy,&ityp); /* Typ des 1.Elements */
631
632 /*----------------------------------------------------------------------
633 * 2. Durchlauf: Rewind, Leerlesen Koordinaten
634 *---------------------------------------------------------------------*/
635 rewind(fz88i1);
636
637 fgets(cstring,254,fz88i1); /* leerlesen 1. Zeile */
638
639 for(i = 1;i <= nkp; i++) /* leerlesen Koordinaten */
640 fgets(cstring,254,fz88i1);
641
642 /*----------------------------------------------------------------------
643 * Schreiben der Elemente Nr.1, Nr.7, Nr.8, Nr.20 und Nr.23
644 *---------------------------------------------------------------------*/
645 if (ityp == 1 || ityp == 7 || ityp == 8 || ityp == 20 || ityp == 23)
646 {
647 ianz= 8;
648 fprintf(fcut,PD "\n",ianz);
649
650 for (i = 1; i <= ne; i++)
651 {
652 fgets (cstring,254,fz88i1);
653 sscanf(cstring,PDB PD,&idummy,&ityp);
654 fgets (cstring,254,fz88i1);
655
656 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
657 &koi[1],&koi[2],&koi[3],&koi[4],&koi[5],&koi[6],&koi[7],&koi[8],&koi[9],&koi[10]);
658
659 fprintf(fcut,PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
660 koi[1],koi[2],koi[3],koi[4],koi[5],koi[6],koi[7],koi[8],koi[9],koi[10]);
661 }
662 fprintf(fcut, "-1 0 0 0 0 0 0 0 0 0\n");
663 goto L999;
664 }
665
666 /*----------------------------------------------------------------------
667 * Schreiben der Balken Nr.2, 13, 25, Welle Nr.5, Stab Nr.4, Nr.9
668 *---------------------------------------------------------------------*/
669 if (ityp == 2 || ityp == 4 || ityp == 5
670 || ityp == 9 || ityp == 13 || ityp == 25)
671 {
672 ianz= 2;
673 fprintf(fcut,PD "\n",ianz);
674
675 for (i = 1; i <= ne; i++)
676 {
677 fgets (cstring,254,fz88i1);
678 sscanf(cstring,PDB PD,&idummy,&ityp);
679 fgets (cstring,254,fz88i1);
680
681 sscanf(cstring,PDB PD,&koi[1],&koi[2]);
682
683 fprintf(fcut,PD9B PD9 "\n",koi[1],koi[2]);
684 }
685 fprintf(fcut, "-1 0\n");
686 goto L999;
687 }
688
689 /*----------------------------------------------------------------------
690 * Schreiben der Dreiecke Nr.3, 14, 15, 18 und 24
691 *---------------------------------------------------------------------*/
692 if (ityp == 3 || ityp == 14 || ityp == 15 || ityp == 18 || ityp == 24)
693 {
694 ianz= 6;
695 fprintf(fcut,PD "\n",ianz);
696
697 for (i = 1; i <= ne; i++)
698 {
699 fgets (cstring,254,fz88i1);
700 sscanf(cstring,PDB PD,&idummy,&ityp);
701 fgets (cstring,254,fz88i1);
702
703 sscanf(cstring,PDB PDB PDB PDB PDB PD,
704 &koi[1],&koi[2],&koi[3],&koi[4],&koi[5],&koi[6]);
705
706 fprintf(fcut,PD9B PD9B PD9B PD9B PD9B PD9 "\n",
707 koi[1],koi[2],koi[3],koi[4],koi[5],koi[6]);
708 }
709 fprintf(fcut, "-1 0 0 0 0 0\n");
710 goto L999;
711 }
712
713 /*----------------------------------------------------------------------
714 * Schreiben der Torus Nr.6
715 *---------------------------------------------------------------------*/
716 if (ityp == 6)
717 {
718 ianz= 3;
719 fprintf(fcut,PD "\n",ianz);
720
721 for (i = 1; i <= ne; i++)
722 {
723 fgets (cstring,254,fz88i1);
724 sscanf(cstring,PDB PD,&idummy,&ityp);
725 fgets (cstring,254,fz88i1);
726
727 sscanf(cstring,PDB PDB PD,&koi[1],&koi[2],&koi[3]);
728
729 fprintf(fcut,PD9B PD9B PD9 "\n",koi[1],koi[2],koi[3]);
730 }
731 fprintf(fcut, "-1 0 0 0 0 0\n");
732 goto L999;
733 }
734
735 /*----------------------------------------------------------------------
736 * Schreiben der Hexaeder Typ 10
737 *---------------------------------------------------------------------*/
738 if (ityp == 10)
739 {
740 ianz= 20;
741 fprintf(fcut,PD "\n",ianz);
742
743 for (i = 1; i <= ne; i++)
744 {
745 fgets (cstring,254,fz88i1);
746 sscanf(cstring,PDB PD,&idummy,&ityp);
747 fgets (cstring,254,fz88i1);
748
749 sscanf(cstring,
750 PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
751 &koi[ 1],&koi[ 2],&koi[ 3],&koi[ 4],&koi[ 5],
752 &koi[ 6],&koi[ 7],&koi[ 8],&koi[ 9],&koi[10],
753 &koi[11],&koi[12],&koi[13],&koi[14],&koi[15],
754 &koi[16],&koi[17],&koi[18],&koi[19],&koi[20]);
755
756 fprintf(fcut,PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B
757 PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
758 koi[ 1],koi[ 2],koi[ 3],koi[ 4],koi[ 5],
759 koi[ 6],koi[ 7],koi[ 8],koi[ 9],koi[10],
760 koi[11],koi[12],koi[13],koi[14],koi[15],
761 koi[16],koi[17],koi[18],koi[19],koi[20]);
762 }
763 fprintf(fcut, "-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n");
764 goto L999;
765 }
766
767 /*----------------------------------------------------------------------
768 * Schreiben der Platte Typ 19 und der Volumenschale 21
769 *---------------------------------------------------------------------*/
770 if (ityp == 19 || ityp == 21)
771 {
772 ianz= 16;
773 fprintf(fcut,PD "\n",ianz);
774
775 for (i = 1; i <= ne; i++)
776 {
777 fgets (cstring,254,fz88i1);
778 sscanf(cstring,PDB PD,&idummy,&ityp);
779 fgets (cstring,254,fz88i1);
780
781 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
782 &koi[ 1],&koi[ 2],&koi[ 3],&koi[ 4],&koi[ 5],&koi[ 6],&koi[ 7],&koi[ 8],
783 &koi[ 9],&koi[10],&koi[11],&koi[12],&koi[13],&koi[14],&koi[15],&koi[16]);
784
785 fprintf(fcut,PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B
786 PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
787 koi[ 1],koi[ 2],koi[ 3],koi[ 4],koi[ 5],koi[ 6],koi[ 7],koi[ 8],
788 koi[ 9],koi[10],koi[11],koi[12],koi[13],koi[14],koi[15],koi[16]);
789 }
790 fprintf(fcut, "-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n");
791 goto L999;
792 }
793
794 /*----------------------------------------------------------------------
795 * Schreiben der Scheiben Nr.11,Torus Nr.12 u. Volumenschale 22
796 *---------------------------------------------------------------------*/
797 if (ityp == 11 || ityp == 12 || ityp == 22)
798 {
799 ianz= 12;
800 fprintf(fcut,PD "\n",ianz);
801
802 for (i = 1; i <= ne; i++)
803 {
804 fgets (cstring,254,fz88i1);
805 sscanf(cstring,PDB PD,&idummy,&ityp);
806 fgets (cstring,254,fz88i1);
807
808 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
809 &koi[ 1],&koi[ 2],&koi[ 3],&koi[ 4],&koi[ 5], &koi[ 6],
810 &koi[ 7],&koi[ 8],&koi[ 9],&koi[10],&koi[11],&koi[12]);
811
812 fprintf(fcut,PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
813 koi[ 1],koi[ 2],koi[ 3],koi[ 4],koi[ 5],koi[ 6],
814 koi[ 7],koi[ 8],koi[ 9],koi[10],koi[11],koi[12]);
815 }
816 fprintf(fcut, "-1 0 0 0 0 0 0 0 0 0 0 0\n");
817 goto L999;
818 }
819
820 /*----------------------------------------------------------------------
821 * Schreiben der Tetraeder Nr.16
822 *---------------------------------------------------------------------*/
823 if (ityp == 16)
824 {
825 ianz= 10;
826 fprintf(fcut,PD "\n",ianz);
827
828 for (i = 1; i <= ne; i++)
829 {
830 fgets (cstring, 254,fz88i1);
831 sscanf(cstring,PDB PD,&idummy,&ityp);
832 fgets (cstring,254,fz88i1);
833
834 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
835 &koi[1],&koi[2],&koi[3],&koi[4],&koi[5],
836 &koi[6],&koi[7],&koi[8],&koi[9],&koi[10]);
837
838 fprintf(fcut,PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
839 koi[1],koi[2],koi[3],koi[4],koi[5],
840 koi[6],koi[7],koi[8],koi[9],koi[10]);
841 }
842 fprintf(fcut, "-1 0 0 0 0 0 0 0 0 0\n");
843 goto L999;
844 }
845
846 /*----------------------------------------------------------------------
847 * Schreiben der Tetraeder Nr.17
848 *---------------------------------------------------------------------*/
849 if (ityp == 17)
850 {
851 ianz= 4;
852 fprintf(fcut,PD "\n",ianz);
853
854 for (i = 1; i <= ne; i++)
855 {
856 fgets (cstring,254,fz88i1);
857 sscanf(cstring,PDB PD,&idummy,&ityp);
858 fgets (cstring,254,fz88i1);
859
860 sscanf(cstring,PDB PDB PDB PD,&koi[1],&koi[2],&koi[3],&koi[4]);
861 fprintf(fcut,PD9B PD9B PD9B PD9 "\n",koi[1],koi[2],koi[3],koi[4]);
862 }
863 fprintf(fcut, "-1 0 0 0\n");
864 goto L999;
865 }
866
867 /*----------------------------------------------------------------------
868 * Files schliessen
869 *---------------------------------------------------------------------*/
870 L999:;
871
872 fprintf(fcut, "-1\n");
873 fclose(fz88i1);
874 fclose(fz88i5);
875 fclose(fcut);
876
877 return 0;
878 }
879
880 /***********************************************************************
881 * CUT88
882 ***********************************************************************/
cut88(void)883 int cut88(void)
884 {
885 extern FR_INT4 MAXGRA,MAXNDL;
886
887 FILE *fcut,*fpermdat;
888
889 FR_INT4 *igraph,*igrad,*istart;
890 FR_INT4 *neu,*irneu,*neuin,*irneuin;
891 FR_INT4 *level,*ipermb,*iperme;
892
893 FR_INT4 np[21];
894
895 FR_INT4 nkp,maxgr,ndl;
896 FR_INT4 igradzp,ifcm,ifrcm,krcm;
897 FR_INT4 isizegr,neunum,nknot,izeile= 0;
898 FR_INT4 i,j,k,is,nzp,nnp,maxgd,mingd;
899 FR_INT4 nstart,levs,leve,nlev,l;
900 FR_INT4 mingr,m,nprcm,nprrcm,nzprcm,iflag=0;
901
902 int iret;
903
904 BOOL *num;
905
906 char cpermdat[]="z88h.out";
907 char cutfile[]= "z88h.in";
908 char cstring[255];
909
910 /*----------------------------------------------------------------------
911 * File- Operationen
912 *---------------------------------------------------------------------*/
913 if((fpermdat=fopen(cpermdat,"w"))==NULL)
914 {
915 ale88h(AL_NOOUT);;
916 return 1;
917 }
918 else
919 wrim88h(0,TX_OUTOPEN);
920
921 rewind(fpermdat);
922
923 if((fcut=fopen(cutfile,"r"))==NULL)
924 {
925 ale88h(AL_NOIN);
926 return 1;
927 }
928 else
929 wrim88h(0,TX_INOPEN);
930
931 rewind(fcut);
932
933 /*----------------------------------------------------------------------
934 * max. Groesse maxgr und ndl
935 *---------------------------------------------------------------------*/
936 iret= rdy88h();
937 if(iret != 0)
938 {
939 ale88h(iret);
940 #ifdef FR_WIN
941 return(iret);
942 #endif
943 #ifdef FR_UNIX
944 stop88h();
945 #endif
946 }
947
948 maxgr= MAXGRA;
949 ndl= MAXNDL;
950
951 /*----------------------------------------------------------------------
952 * File- Operationen
953 *---------------------------------------------------------------------*/
954 fgets(cstring,254,fcut);
955 sscanf(cstring,PDB PD,&nkp,&neunum); /* neunum = -1 */
956
957 isizegr= (maxgr+1)*(nkp+1); /* +1 wg. FORTAN 77 */
958
959 /*----------------------------------------------------------------------
960 * Memory anlegen
961 *---------------------------------------------------------------------*/
962 if(((igraph =(FR_INT4 *)calloc((size_t)isizegr,sizeof(FR_INT4)))==NULL) ||
963 ((igrad =(FR_INT4 *)calloc((size_t)(nkp+1),sizeof(FR_INT4)))==NULL) ||
964 ((istart =(FR_INT4 *)calloc((size_t)(nkp+1),sizeof(FR_INT4)))==NULL) ||
965 ((neu =(FR_INT4 *)calloc((size_t)(nkp+1),sizeof(FR_INT4)))==NULL) ||
966 ((irneu =(FR_INT4 *)calloc((size_t)(nkp+1),sizeof(FR_INT4)))==NULL) ||
967 ((neuin =(FR_INT4 *)calloc((size_t)(nkp+1),sizeof(FR_INT4)))==NULL) ||
968 ((irneuin=(FR_INT4 *)calloc((size_t)(nkp+1),sizeof(FR_INT4)))==NULL) ||
969 ((level =(FR_INT4 *)calloc((size_t)(ndl+1),sizeof(FR_INT4)))==NULL) ||
970 ((ipermb =(FR_INT4 *)calloc((size_t)(nkp+1),sizeof(FR_INT4)))==NULL) ||
971 ((iperme =(FR_INT4 *)calloc((size_t)(nkp+1),sizeof(FR_INT4)))==NULL) ||
972 ((num =(BOOL *) calloc((size_t)(nkp+1),sizeof(BOOL )))==NULL) )
973 {
974 ale88h(AL_NOMEM);
975 wlog88h(0,LOG_NOMEM);
976 return 1;
977 }
978
979 wrim88h(0,TX_MEMOK);
980
981 /*----------------------------------------------------------------------
982 * Aufbau des Graphen auf Grund Knotennummern der Elemente
983 *---------------------------------------------------------------------*/
984 L30:;
985
986 fgets(cstring,254,fcut);
987 sscanf(cstring,PD,&nknot);
988
989 if (nknot > 0)
990 {
991 L40:;
992 fgets(cstring,254,fcut);
993 izeile++;
994
995 if (nknot == 2)
996 sscanf(cstring,PDB PD,&np[1],&np[2]);
997
998 if (nknot == 3)
999 sscanf(cstring,PDB PDB PD,&np[1],&np[2],&np[3]);
1000
1001 if (nknot == 4)
1002 sscanf(cstring,PDB PDB PDB PD,&np[1],&np[2],&np[3],&np[4]);
1003
1004 if (nknot == 6)
1005 sscanf(cstring,PDB PDB PDB PDB PDB PD,
1006 &np[1],&np[2],&np[3],&np[4],&np[5],&np[6]);
1007
1008 if (nknot == 8)
1009 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PD,&np[1],&np[2],&np[3],
1010 &np[4],&np[5],&np[6],&np[7],&np[8]);
1011
1012 if (nknot == 10)
1013 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
1014 &np[1],&np[2],&np[3],&np[4],&np[5],
1015 &np[6],&np[7],&np[8],&np[9],&np[10]);
1016
1017 if (nknot == 12)
1018 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
1019 &np[ 1],&np[ 2],&np[ 3],&np[ 4],&np[ 5],&np[ 6],
1020 &np[ 7],&np[ 8],&np[ 9],&np[10],&np[11],&np[12]);
1021
1022 if (nknot == 16)
1023 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
1024 &np[ 1],&np[ 2],&np[ 3],&np[ 4],&np[ 5],&np[ 6],&np[ 7],&np[ 8],
1025 &np[ 9],&np[10],&np[11],&np[12],&np[13],&np[14],&np[15],&np[16]);
1026
1027 if (nknot == 20)
1028 sscanf(cstring,
1029 PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
1030 &np[ 1],&np[ 2],&np[ 3],&np[ 4],&np[ 5],&np[ 6],&np[ 7],&np[ 8],&np[ 9],&np[10],
1031 &np[11],&np[12],&np[13],&np[14],&np[15],&np[16],&np[17],&np[18],&np[19],&np[20]);
1032
1033 if (np[1] <= 0) goto L30;
1034
1035 for (i = 1; i <= nknot-1; i++)
1036 {
1037 nzp = np[i];
1038 for (j= i+1; j <= nknot; j++)
1039 {
1040 nnp = np[j];
1041 for (k = 1; k <= maxgr; k++)
1042 {
1043 if (igraph[(k-1)*nkp + nzp] == nnp) goto L80;
1044 if (igraph[(k-1)*nkp + nzp] > 0 ) continue;
1045 igraph[(k-1)*nkp + nzp] = nnp;
1046 igrad[nzp]++;
1047 goto L60;
1048 }
1049
1050 wlog88h(igrad[nzp],LOG_1STOP);
1051 wrim88h(igrad[nzp],TX_1STOP);
1052 ale88h(AL_1STOP);
1053 return 1;
1054
1055 L60:;
1056 igrad[nnp]++;
1057 if (igrad[nnp] <= maxgr) goto L70;
1058 wlog88h(igrad[nzp],LOG_1STOP);
1059 wrim88h(igrad[nzp],TX_1STOP);
1060 ale88h(AL_1STOP);
1061 return 1;
1062 L70:;
1063 igraph[(igrad[nnp]-1)*nkp + nnp]= nzp;
1064 L80:;
1065 }
1066 }
1067
1068 goto L40;
1069 }
1070
1071 maxgd= igrad[1];
1072 mingd= igrad[1];
1073
1074 for (i = 2; i <= nkp; i++)
1075 {
1076 maxgd= FR_MAX(maxgd,igrad[i]);
1077 mingd= FR_MIN(mingd,igrad[i]);
1078 }
1079
1080 wrim88h(maxgd,TX_MAXGR);
1081
1082 /*----------------------------------------------------------------------
1083 * Vorgabe bzw. Bestimmung der Startpunkte
1084 *---------------------------------------------------------------------*/
1085 if (neunum > 0)
1086 {
1087 for (i = 1; i <= neunum; i++)
1088 fscanf(fcut,PD,&istart[i]);
1089 }
1090 else
1091 {
1092 neunum= -neunum;
1093 k=0;
1094
1095 L110:;
1096
1097 for (i = 1; i <= nkp; i++)
1098 {
1099 if (igrad[i]== mingd)
1100 {
1101 k++;
1102 istart[k]= i;
1103 if (k >= neunum) goto L130;
1104 }
1105 }
1106 mingd++;
1107 goto L110;
1108
1109 L130:;
1110
1111 for (i = 1; i <= neunum; i++)
1112 wrim88h(istart[i],TX_STARTNUM);
1113 }
1114
1115 /*----------------------------------------------------------------------
1116 * Neunummerierung der Knotenpunkte
1117 *---------------------------------------------------------------------*/
1118 for(is = 1; is <= neunum; is++)
1119 {
1120 nstart= istart[is];
1121 neu[1]= nstart;
1122 neuin[nstart] = 1;
1123 irneu[nkp]= nstart;
1124 irneuin[nstart]= nkp;
1125
1126 for(i = 1; i <= nkp; i++) num[i] = FALSE;
1127
1128 num[nstart]= TRUE;
1129 level[1]= 1;
1130 levs= 1;
1131 leve= 1;
1132 nlev= 1;
1133 l= 1;
1134
1135 L150:;
1136
1137 for (j = levs; j <= leve; j++)
1138 {
1139 nzp= neu[j];
1140 igradzp= igrad[nzp];
1141
1142 L160:;
1143
1144 mingr= maxgr;
1145 k= 0;
1146
1147 for (i = 1; i <= igradzp; i++)
1148 {
1149 nnp= igraph[(i-1)*nkp + nzp];
1150 if (num[nnp] || igrad[nnp] > mingr) continue;
1151 mingr = igrad[nnp];
1152 k = nnp;
1153 }
1154
1155 if (k == 0) goto L180;
1156 l++;
1157 neu[l]= k;
1158 neuin[k]= l;
1159 irneu[nkp-l+1]= k;
1160 irneuin[k]= nkp-l+1;
1161 num[k]= TRUE;
1162 goto L160;
1163
1164 L180:;
1165 }
1166
1167 levs+= level[nlev];
1168 nlev++;
1169 wrim88h(nlev,TX_LEVEL);
1170 level[nlev] = l - levs + 1;
1171 leve+= level[nlev];
1172 if (leve < nkp) goto L150;
1173
1174 /*----------------------------------------------------------------------
1175 * Bandbreite m und Profil nprcm der Neunumerierung
1176 *---------------------------------------------------------------------*/
1177 m= 0;
1178 nprcm= 0;
1179 nprrcm= 0;
1180
1181 for (i = 1; i <= nkp; i++)
1182 {
1183 nzp= neuin[i];
1184 nzprcm= irneuin[i];
1185 ifcm= nzp;
1186 ifrcm= nzprcm;
1187 igradzp= igrad[i];
1188
1189 for (j = 1; j <= igradzp; j++)
1190 {
1191 k= neuin[igraph[(j-1)*nkp + i]];
1192 m= FR_MAX(m, abs(k-nzp));
1193 ifcm= FR_MIN(ifcm, k);
1194 krcm= irneuin[igraph[(j-1)*nkp + i]];
1195 ifrcm=FR_MIN(ifrcm, krcm);
1196 }
1197
1198 nprcm= nprcm + nzp - ifcm + 1;
1199 nprrcm= nprrcm + nzprcm - ifrcm + 1;
1200 }
1201
1202 wrim88h(nprcm,TX_NPRCM);
1203 wrim88h(nprrcm,TX_NPRRCM);
1204
1205 if (ICFLAG == 1) /* reverse Cuthill-McKee */
1206 {
1207 iflag= 1;
1208 for (i = 1; i <= nkp; i++) iperme[i]= irneuin[i];
1209 }
1210
1211 if (ICFLAG == 2) /* normaler Cuthill-McKee */
1212 {
1213 iflag= 2;
1214 for (i = 1; i <= nkp; i++) iperme[i]= neuin[i];
1215 }
1216
1217 }
1218
1219 /*----------------------------------------------------------------------
1220 * Abspeichern des Permutationsvektors
1221 *---------------------------------------------------------------------*/
1222 wrim88h(iflag,TX_STOPERM);
1223
1224 j= 1;
1225 for (i = 1; i <= nkp; i++)
1226 {
1227 if (j < 10)
1228 {
1229 fprintf(fpermdat,PD9,iperme[i]);
1230 j++;
1231 }
1232 else
1233 {
1234 fprintf(fpermdat,PD9 "\n",iperme[i]);
1235 j= 1;
1236 }
1237 }
1238
1239 /*----------------------------------------------------------------------
1240 * Files schliessen, Speicher freigeben fuer CUT2Z88
1241 *---------------------------------------------------------------------*/
1242 fclose(fcut);
1243 fclose(fpermdat);
1244
1245 free(igraph);
1246 free(igrad);
1247 free(istart);
1248 free(neu);
1249 free(irneu);
1250 free(neuin);
1251 free(irneuin);
1252 free(level);
1253 free(ipermb);
1254 free(iperme);
1255 free(num);
1256
1257 return 0;
1258 }
1259
1260 /***********************************************************************
1261 * max
1262 ***********************************************************************/
FR_MAX(FR_INT4 i,FR_INT4 j)1263 FR_INT4 FR_MAX(FR_INT4 i, FR_INT4 j)
1264 {
1265 if (i > j) return i;
1266 else return j;
1267 }
1268
1269 /***********************************************************************
1270 * min
1271 ***********************************************************************/
FR_MIN(FR_INT4 i,FR_INT4 j)1272 FR_INT4 FR_MIN(FR_INT4 i, FR_INT4 j)
1273 {
1274 if (i < j) return i;
1275 else return j;
1276 }
1277
1278 /***********************************************************************
1279 * CUT2Z88
1280 ***********************************************************************/
cut2z88(void)1281 int cut2z88(void)
1282 {
1283 extern FR_INT4 iqflag;
1284
1285 FILE *fpermdat,*fz88i1old,*fz88i2old,*fz88i5old,*fz88i1,*fz88i2,*fz88i5;
1286
1287 FR_DOUBLE *x,*y,*z;
1288 FR_DOUBLE *wert;
1289 FR_DOUBLE pree,tr1e,tr2e;
1290
1291 FR_INT4 *iperm;
1292 FR_INT4 koi[21];
1293
1294 FR_INT4 i,j;
1295 FR_INT4 nkp=0,ne=0,ndim=0,nfg=0,ifrei=0,idummy=0,ityp=0;
1296
1297 FR_INT4 nrb,npr,jele;
1298 FR_INT4 k1,k2,k3,k4,k5,k6,k7,k8;
1299
1300 FR_INT4 *node;
1301 FR_INT4 *kfrei;
1302 FR_INT4 *iflag;
1303 FR_INT4 *ktyp;
1304
1305 char cpermdat[]= "z88h.out";
1306 char cz88i1[]= "z88i1.txt";
1307 char cz88i2[]= "z88i2.txt";
1308 char cz88i5[]= "z88i5.txt";
1309 char cz88i1old[]="z88i1.old";
1310 char cz88i2old[]="z88i2.old";
1311 char cz88i5old[]="z88i5.old";
1312
1313 char cstring[255];
1314
1315 /*----------------------------------------------------------------------
1316 * Vektor koi loeschen
1317 *---------------------------------------------------------------------*/
1318 wrim88h(0,TX_UMSPEI);
1319
1320 for(i = 0;i <= 20; i++) koi[i]= 0;
1321
1322 /*----------------------------------------------------------------------
1323 * File- Operationen: Z88I1.TXT, Z88I2.TXT, Z88I5.TXT ->
1324 * Z88I1.OLD, Z88I2.OLD, Z88I5.OLD
1325 *---------------------------------------------------------------------*/
1326 if ((fz88i1old= fopen(cz88i1old,"r")) != NULL)
1327 {
1328 fclose(fz88i1old);
1329 remove(cz88i1old);
1330 }
1331
1332 if ((fz88i2old= fopen(cz88i2old,"r")) != NULL)
1333 {
1334 fclose(fz88i2old);
1335 remove(cz88i2old);
1336 }
1337
1338 if(iqflag == 1)
1339 {
1340 if ((fz88i5old= fopen(cz88i5old,"r")) != NULL)
1341 {
1342 fclose(fz88i5old);
1343 remove(cz88i5old);
1344 }
1345 }
1346
1347 rename(cz88i1,cz88i1old);
1348 rename(cz88i2,cz88i2old);
1349 if(iqflag == 1) rename(cz88i5,cz88i5old);
1350
1351 fpermdat= fopen(cpermdat,"r");
1352
1353 fz88i1old= fopen(cz88i1old,"r");
1354 fz88i2old= fopen(cz88i2old,"r");
1355 if(iqflag == 1) fz88i5old= fopen(cz88i5old,"r");
1356
1357 fz88i1= fopen(cz88i1,"w");
1358 fz88i2= fopen(cz88i2,"w");
1359 if(iqflag == 1) fz88i5= fopen(cz88i5,"w");
1360
1361 wrim88h(0,TX_TXT2OLD);
1362
1363 /*----------------------------------------------------------------------
1364 * Z88I1.TXT
1365 *---------------------------------------------------------------------*/
1366
1367 /*======================================================================
1368 * 1.Zeile
1369 *=====================================================================*/
1370 fgets(cstring,254,fz88i1old);
1371 fputs(cstring,fz88i1);
1372
1373 sscanf(cstring,PDB PDB PDB PD,&ndim,&nkp,&ne,&nfg);
1374
1375 /*======================================================================
1376 * Memory anlegen
1377 *=====================================================================*/
1378 if(((iperm= (FR_INT4 *) calloc((size_t)nkp+1,sizeof(FR_INT4 )))==NULL) ||
1379 (( x = (FR_DOUBLE *) calloc((size_t)nkp+1,sizeof(FR_DOUBLE)))==NULL) ||
1380 (( y = (FR_DOUBLE *) calloc((size_t)nkp+1,sizeof(FR_DOUBLE)))==NULL) ||
1381 (( z = (FR_DOUBLE *) calloc((size_t)nkp+1,sizeof(FR_DOUBLE)))==NULL) ||
1382 ((ktyp = (FR_INT4 *) calloc((size_t)ne+1, sizeof(FR_INT4 )))==NULL))
1383 {
1384 ale88h(AL_NOMEM);
1385 wlog88h(0,LOG_NOMEM);
1386 return 1;
1387 }
1388
1389 wrim88h(0,TX_MEMOK);
1390
1391 /*======================================================================
1392 * Knoten
1393 *=====================================================================*/
1394 wrim88h(0,TX_WRII1);
1395
1396 for(i = 1; i <= nkp; i++)
1397 fscanf(fpermdat,PD,&iperm[i]);
1398
1399 for(i = 1; i <= nkp; i++)
1400 {
1401 fgets(cstring,254,fz88i1old);
1402 sscanf(cstring,PDB PDB PFB PFB PF,
1403 &idummy,&ifrei,&x[iperm[i]],&y[iperm[i]],&z[iperm[i]]);
1404 }
1405
1406 for(i = 1; i <= nkp; i++)
1407 fprintf(fz88i1,PD9B PD9B PE13B PE13B PE13 "\n",i,ifrei,x[i],y[i],z[i]);
1408
1409 /*======================================================================
1410 * Koinzidenz
1411 *=====================================================================*/
1412 for(i = 1; i <= ne; i++)
1413 {
1414 fgets (cstring,254,fz88i1old);
1415 sscanf(cstring,PDB PD,&idummy,&ityp);
1416 fputs (cstring,fz88i1);
1417
1418 ktyp[i]= ityp;
1419
1420 fgets (cstring,254,fz88i1old);
1421
1422 if(ityp == 1 || ityp == 7 || ityp == 8 || ityp == 20 || ityp == 23)
1423 {
1424 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PD,
1425 &koi[1],&koi[2],&koi[3],&koi[4],&koi[5],&koi[6],&koi[7],&koi[8]);
1426
1427 fprintf(fz88i1,PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
1428 iperm[koi[1]],iperm[koi[2]],iperm[koi[3]],iperm[koi[4]],
1429 iperm[koi[5]],iperm[koi[6]],iperm[koi[7]],iperm[koi[8]]);
1430 }
1431
1432 if(ityp == 2 || ityp == 4 || ityp == 5 || ityp == 9 || ityp == 13 || ityp == 25)
1433 {
1434 sscanf(cstring,PDB PD,&koi[1],&koi[2]);
1435
1436 fprintf(fz88i1,PD9B PD9 "\n",iperm[koi[1]],iperm[koi[2]]);
1437 }
1438
1439 if(ityp == 3 || ityp == 14 || ityp == 15 || ityp == 18 || ityp == 24)
1440 {
1441 sscanf(cstring,PDB PDB PDB PDB PDB PD,
1442 &koi[1],&koi[2],&koi[3],&koi[4],&koi[5],&koi[6]);
1443
1444 fprintf(fz88i1,PD9B PD9B PD9B PD9B PD9B PD9 "\n",
1445 iperm[koi[1]],iperm[koi[2]],iperm[koi[3]],
1446 iperm[koi[4]],iperm[koi[5]],iperm[koi[6]]);
1447 }
1448
1449 if(ityp == 6)
1450 {
1451 sscanf(cstring,PDB PDB PD,&koi[1],&koi[2],&koi[3]);
1452
1453 fprintf(fz88i1,PD9B PD9B PD9 "\n",
1454 iperm[koi[1]],iperm[koi[2]],iperm[koi[3]]);
1455 }
1456
1457 if(ityp == 10)
1458 {
1459 sscanf(cstring,
1460 PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
1461 &koi[ 1],&koi[ 2],&koi[ 3],&koi[ 4],&koi[ 5],
1462 &koi[ 6],&koi[ 7],&koi[ 8],&koi[ 9],&koi[10],
1463 &koi[11],&koi[12],&koi[13],&koi[14],&koi[15],
1464 &koi[16],&koi[17],&koi[18],&koi[19],&koi[20]);
1465
1466 fprintf(fz88i1,
1467 PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B
1468 PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
1469 iperm[koi[ 1]],iperm[koi[ 2]],iperm[koi[ 3]],iperm[koi[ 4]],iperm[koi[ 5]],
1470 iperm[koi[ 6]],iperm[koi[ 7]],iperm[koi[ 8]],iperm[koi[ 9]],iperm[koi[10]],
1471 iperm[koi[11]],iperm[koi[12]],iperm[koi[13]],iperm[koi[14]],iperm[koi[15]],
1472 iperm[koi[16]],iperm[koi[17]],iperm[koi[18]],iperm[koi[19]],iperm[koi[20]]);
1473 }
1474
1475 if(ityp == 19 || ityp == 21)
1476 {
1477 sscanf(cstring,
1478 PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
1479 &koi[ 1],&koi[ 2],&koi[ 3],&koi[ 4],&koi[ 5],
1480 &koi[ 6],&koi[ 7],&koi[ 8],&koi[ 9],&koi[10],
1481 &koi[11],&koi[12],&koi[13],&koi[14],&koi[15],
1482 &koi[16]);
1483
1484 fprintf(fz88i1,
1485 PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
1486 iperm[koi[ 1]],iperm[koi[ 2]],iperm[koi[ 3]],iperm[koi[ 4]],iperm[koi[ 5]],
1487 iperm[koi[ 6]],iperm[koi[ 7]],iperm[koi[ 8]],iperm[koi[ 9]],iperm[koi[10]],
1488 iperm[koi[11]],iperm[koi[12]],iperm[koi[13]],iperm[koi[14]],iperm[koi[15]],
1489 iperm[koi[16]]);
1490 }
1491
1492 if(ityp == 11 || ityp == 12 || ityp == 22)
1493 {
1494 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
1495 &koi[ 1],&koi[ 2],&koi[ 3],&koi[ 4],&koi[ 5],&koi[ 6],
1496 &koi[ 7],&koi[ 8],&koi[ 9],&koi[10],&koi[11],&koi[12]);
1497
1498 fprintf(fz88i1,PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
1499 iperm[koi[ 1]],iperm[koi[ 2]],iperm[koi[ 3]],iperm[koi[ 4]],
1500 iperm[koi[ 5]],iperm[koi[ 6]],iperm[koi[ 7]],iperm[koi[ 8]],
1501 iperm[koi[ 9]],iperm[koi[10]],iperm[koi[11]],iperm[koi[12]]);
1502 }
1503
1504 if(ityp == 16)
1505 {
1506 sscanf(cstring,PDB PDB PDB PDB PDB PDB PDB PDB PDB PD,
1507 &koi[1],&koi[2],&koi[3],&koi[4],&koi[5],
1508 &koi[6],&koi[7],&koi[8],&koi[9],&koi[10]);
1509
1510 fprintf(fz88i1,PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
1511 iperm[koi[1]],iperm[koi[2]],iperm[koi[3]],iperm[koi[4]],iperm[koi[5]],
1512 iperm[koi[6]],iperm[koi[7]],iperm[koi[8]],iperm[koi[9]],iperm[koi[10]]);
1513 }
1514
1515 if(ityp == 17)
1516 {
1517 sscanf(cstring,PDB PDB PDB PD,&koi[1],&koi[2],&koi[3],&koi[4]);
1518
1519 fprintf(fz88i1,PD9B PD9B PD9B PD9 "\n",
1520 iperm[koi[1]],iperm[koi[2]],iperm[koi[3]],iperm[koi[4]]);
1521 }
1522 }
1523
1524 /*======================================================================
1525 * Files schliessen
1526 *=====================================================================*/
1527 fclose(fz88i1);
1528 fclose(fz88i1old);
1529 fclose(fpermdat);
1530
1531 /*----------------------------------------------------------------------
1532 * Z88I2.TXT
1533 *---------------------------------------------------------------------*/
1534 /*======================================================================
1535 * Anzahl Randbedingungen
1536 *=====================================================================*/
1537 fgets(cstring,254,fz88i2old);
1538 sscanf(cstring,PD,&nrb);
1539 fputs(cstring,fz88i2);
1540
1541 /*======================================================================
1542 * Memory anlegen
1543 *=====================================================================*/
1544 if(
1545 ((node = (FR_INT4 *)calloc((size_t)nrb+1,sizeof(FR_INT4)))==NULL) ||
1546 ((kfrei= (FR_INT4 *)calloc((size_t)nrb+1,sizeof(FR_INT4)))==NULL) ||
1547 ((iflag= (FR_INT4 *)calloc((size_t)nrb+1,sizeof(FR_INT4)))==NULL) ||
1548 ((wert = (FR_DOUBLE *)calloc((size_t)nrb+1,sizeof(FR_DOUBLE )))==NULL))
1549 {
1550 ale88h(AL_NOMEM);
1551 wlog88h(0,LOG_NOMEM);
1552 return 1;
1553 }
1554
1555 wrim88h(0,TX_MEMOK);
1556 wrim88h(0,TX_WRII2);
1557
1558 for(i = 1; i <= nrb; i++)
1559 {
1560 fgets(cstring,254,fz88i2old);
1561 sscanf(cstring,PDB PDB PDB PF,&node[i],&kfrei[i],&iflag[i],&wert[i]);
1562 }
1563
1564 for (i = 1; i <= nkp; i++)
1565 {
1566 for (j = 1; j <= nrb; j++)
1567 {
1568 if(i == iperm[node[j]])
1569 fprintf(fz88i2,PD9B PD9B PD9B PE13 "\n",i,kfrei[j],iflag[j],wert[j]);
1570 }
1571 }
1572
1573 /*======================================================================
1574 * Files schliessen
1575 *=====================================================================*/
1576 fclose(fz88i2);
1577 fclose(fz88i2old);
1578
1579 /*----------------------------------------------------------------------
1580 * Z88I5.TXT
1581 *---------------------------------------------------------------------*/
1582 /*======================================================================
1583 * Anzahl Elemente mit Lasten
1584 *=====================================================================*/
1585 if(iqflag == 1)
1586 {
1587 fgets(cstring,254,fz88i5old);
1588 sscanf(cstring,PD,&npr);
1589 fputs(cstring,fz88i5);
1590
1591 wrim88h(0,TX_MEMOK);
1592 wrim88h(0,TX_WRII5);
1593
1594 for(j = 1; j <= npr; j++)
1595 {
1596 fgets(cstring,254,fz88i5old);
1597 sscanf(cstring,PD,&jele);
1598
1599 /*======================================================================
1600 * Elemente 7,8,14 und 15:
1601 *=====================================================================*/
1602 if(ktyp[jele]== 7 || ktyp[jele]== 8 ||
1603 ktyp[jele]== 14 || ktyp[jele]== 15)
1604 {
1605 sscanf(cstring,PDB PFB PFB PDB PDB PD,&jele,&pree,&tr1e,&k1,&k2,&k3);
1606 fprintf(fz88i5,PD9B PE13B PE13B PD9B PD9B PD9 "\n",
1607 jele,pree,tr1e,iperm[k1],iperm[k2],iperm[k3]);
1608 }
1609
1610 /*======================================================================
1611 * Element 17:
1612 *=====================================================================*/
1613 if(ktyp[jele]== 17)
1614 {
1615 sscanf(cstring,PDB PFB PDB PDB PD,&jele,&pree,&k1,&k2,&k3);
1616 fprintf(fz88i5,PD9B PE13B PD9B PD9B PD9 "\n",
1617 jele,pree,iperm[k1],iperm[k2],iperm[k3]);
1618 }
1619
1620 /*======================================================================
1621 * Elemente 11 und 12:
1622 *=====================================================================*/
1623 if(ktyp[jele]== 11 || ktyp[jele]== 12)
1624 {
1625 sscanf(cstring,PDB PFB PFB PDB PDB PDB PD,&jele,&pree,&tr1e,&k1,&k2,&k3,&k4);
1626 fprintf(fz88i5,PD9B PE13B PE13B PD9B PD9B PD9B PD9 "\n",
1627 jele,pree,tr1e,iperm[k1],iperm[k2],iperm[k3],iperm[k4]);
1628 }
1629
1630 /*======================================================================
1631 * Element 1:
1632 *=====================================================================*/
1633 if(ktyp[jele]== 1)
1634 {
1635 sscanf(cstring,PDB PFB PFB PFB PDB PDB PDB PD,
1636 &jele,&pree,&tr1e,&tr2e,&k1,&k2,&k3,&k4);
1637 fprintf(fz88i5,PD9B PE13B PE13B PE13B PD9B PD9B PD9B PD9 "\n",
1638 jele,pree,tr1e,tr2e,iperm[k1],iperm[k2],iperm[k3],iperm[k4]);
1639 }
1640
1641 /*======================================================================
1642 * Element 16
1643 *=====================================================================*/
1644 if(ktyp[jele]== 16)
1645 {
1646 sscanf(cstring,PDB PFB PDB PDB PDB PDB PDB PD,
1647 &jele,&pree,&k1,&k2,&k3,&k4,&k5,&k6);
1648 fprintf(fz88i5,PD9B PE13B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
1649 jele,pree,iperm[k1],iperm[k2],iperm[k3],iperm[k4],iperm[k5],iperm[k6]);
1650 }
1651
1652 /*======================================================================
1653 * Element 10 u. 21:
1654 *=====================================================================*/
1655 if(ktyp[jele]== 10 || ktyp[jele]== 21)
1656 {
1657 sscanf(cstring,PDB PFB PFB PFB PDB PDB PDB PDB PDB PDB PDB PD,
1658 &jele,&pree,&tr1e,&tr2e,&k1,&k2,&k3,&k4,&k5,&k6,&k7,&k8);
1659 fprintf(fz88i5,
1660 PD9B PE13B PE13B PE13B PD9B PD9B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
1661 jele,pree,tr1e,tr2e,iperm[k1],iperm[k2],iperm[k3],iperm[k4],
1662 iperm[k5],iperm[k6],iperm[k7],iperm[k8]);
1663 }
1664
1665 /*======================================================================
1666 * Element 22:
1667 *=====================================================================*/
1668 if(ktyp[jele]== 22)
1669 {
1670 sscanf(cstring,PDB PFB PFB PFB PDB PDB PDB PDB PDB PD,
1671 &jele,&pree,&tr1e,&tr2e,&k1,&k2,&k3,&k4,&k5,&k6);
1672 fprintf(fz88i5,
1673 PD9B PE13B PE13B PE13B PD9B PD9B PD9B PD9B PD9B PD9 "\n",
1674 jele,pree,tr1e,tr2e,iperm[k1],iperm[k2],iperm[k3],iperm[k4],
1675 iperm[k5],iperm[k6]);
1676 }
1677
1678 /*======================================================================
1679 * die drei Plattenelemente 18,19 und 20 und Schalen 23 & 24
1680 *=====================================================================*/
1681 if(ktyp[jele]== 18 || ktyp[jele]== 19 || ktyp[jele]== 20 ||
1682 ktyp[jele]== 23 || ktyp[jele]== 24)
1683 {
1684 sscanf(cstring,PDB PF,&jele,&pree);
1685 fprintf(fz88i5,PD9B PE13 "\n",jele,pree);
1686 }
1687
1688 }
1689
1690 fclose(fz88i5);
1691 fclose(fz88i5old);
1692 }
1693
1694 /*----------------------------------------------------------------------
1695 * Ende Z88H
1696 *---------------------------------------------------------------------*/
1697 wrim88h(0,TX_Z88DONE);
1698
1699 return 0;
1700 }
1701