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