1 /*     CalculiX - A 3-dimensional finite element program                 */
2 /*              Copyright (C) 1998-2021 Guido Dhondt                          */
3 
4 /*     This program is free software; you can redistribute it and/or     */
5 /*     modify it under the terms of the GNU General Public License as    */
6 /*     published by the Free Software Foundation(version 2);    */
7 /*                    */
8 
9 /*     This program is distributed in the hope that it will be useful,   */
10 /*     but WITHOUT ANY WARRANTY; without even the implied warranty of    */
11 /*     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the      */
12 /*     GNU General Public License for more details.                      */
13 
14 /*     You should have received a copy of the GNU General Public License */
15 /*     along with this program; if not, write to the Free Software       */
16 /*     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.         */
17 
18 #include <stdio.h>
19 #include <math.h>
20 #include <stdlib.h>
21 #include <string.h>
22 #include "CalculiX.h"
23 
inicont(ITG * nk,ITG * ncont,ITG * ntie,char * tieset,ITG * nset,char * set,ITG * istartset,ITG * iendset,ITG * ialset,ITG ** itietrip,char * lakon,ITG * ipkon,ITG * kon,ITG ** koncontp,ITG * nslavs,double * tietol,ITG * ismallsliding,ITG ** itiefacp,ITG ** islavsurfp,ITG ** islavnodep,ITG ** imastnodep,ITG ** nslavnodep,ITG ** nmastnodep,ITG * mortar,ITG ** imastopp,ITG * nkon,ITG ** iponoelsp,ITG ** inoelsp,ITG ** ipep,ITG ** imep,ITG * ne,ITG * ifacecount,ITG * iperturb,ITG * ikboun,ITG * nboun,double * co,ITG * istep,double ** xnoelsp)24 void inicont(ITG * nk,ITG *ncont, ITG *ntie, char *tieset, ITG *nset, char *set,
25                ITG *istartset, ITG *iendset, ITG *ialset, ITG **itietrip,
26                char *lakon, ITG *ipkon, ITG *kon, ITG **koncontp,
27                ITG *nslavs, double *tietol, ITG *ismallsliding, ITG **itiefacp,
28                ITG **islavsurfp, ITG **islavnodep, ITG **imastnodep,
29                ITG **nslavnodep, ITG **nmastnodep, ITG *mortar,
30                ITG **imastopp,ITG *nkon,ITG **iponoelsp,ITG **inoelsp,
31 	       ITG **ipep, ITG **imep, ITG *ne, ITG *ifacecount,
32 	       ITG *iperturb, ITG *ikboun, ITG *nboun, double *co,
33 	       ITG *istep,double **xnoelsp){
34 
35   char kind1[2]="C",kind2[2]="-";
36 
37   ITG *itietri=NULL,*koncont=NULL,*itiefac=NULL, *islavsurf=NULL,im,
38       *islavnode=NULL,*imastnode=NULL,*nslavnode=NULL,*nmastnode=NULL,
39       nmasts,*ipe=NULL,*ime=NULL,*imastop=NULL,
40       *iponoels=NULL,*inoels=NULL,ifreenoels,ifreeme,*ipoface=NULL,
41       *nodface=NULL,ncone;
42 
43   double *xnoels=NULL;
44 
45   itietri=*itietrip;koncont=*koncontp;itiefac=*itiefacp;islavsurf=*islavsurfp;
46   islavnode=*islavnodep;imastnode=*imastnodep;nslavnode=*nslavnodep;
47   nmastnode=*nmastnodep;imastop=*imastopp,iponoels=*iponoelsp;
48   inoels=*inoelsp;ipe=*ipep;ime=*imep;xnoels=*xnoelsp;
49 
50   /* determining the number of slave entities (nodes or faces, ncone),
51      and the number of master triangles (ncont) */
52 
53   FORTRAN(allocont,(ncont,ntie,tieset,nset,set,istartset,iendset,
54 	  ialset,lakon,&ncone,tietol,ismallsliding,kind1,kind2,mortar,
55           istep));
56   if(*ncont==0) return;
57 
58   NNEW(itietri,ITG,2**ntie);
59   NNEW(koncont,ITG,4**ncont);
60 
61   /* triangulation of the master side */
62 
63   FORTRAN(triangucont,(ncont,ntie,tieset,nset,set,istartset,iendset,ialset,
64 		       itietri,lakon,ipkon,kon,koncont,kind1,kind2,co,nk,
65 		       mortar));
66 
67   NNEW(ipe,ITG,*nk);
68   NNEW(ime,ITG,12**ncont);
69   DMEMSET(ipe,0,*nk,0.);
70   DMEMSET(ime,0,12**ncont,0.);
71   NNEW(imastop,ITG,3**ncont);
72 
73   FORTRAN(trianeighbor,(ipe,ime,imastop,ncont,koncont,
74 		        &ifreeme));
75 
76   if((*mortar==-1)||(*mortar==0)){SFREE(ipe);SFREE(ime);}
77   else{RENEW(ime,ITG,4*ifreeme);}
78 
79   /* catalogueing the external faces (only for node-to-face
80      contact with a nodal slave surface */
81 
82   NNEW(ipoface,ITG,*nk);
83   NNEW(nodface,ITG,5*6**ne);
84   FORTRAN(findsurface,(ipoface,nodface,ne,ipkon,kon,lakon,ntie,
85 		 tieset));
86 
87   NNEW(itiefac,ITG,2**ntie);
88   RENEW(islavsurf,ITG,2*6**ne);DMEMSET(islavsurf,0,12**ne,0);
89   NNEW(islavnode,ITG,8*ncone);
90   NNEW(nslavnode,ITG,*ntie+1);
91   NNEW(iponoels,ITG,*nk);
92   NNEW(inoels,ITG,2**nkon);
93   NNEW(xnoels,double,*nkon);
94 
95   NNEW(imastnode,ITG,3**ncont);
96   NNEW(nmastnode,ITG,*ntie+1);
97 
98   /* catalogueing the slave faces and slave nodes
99      catalogueing the master nodes (only for Mortar contact) */
100 
101   FORTRAN(tiefaccont,(lakon,ipkon,kon,ntie,tieset,nset,set,
102        istartset,iendset,ialset,itiefac,islavsurf,islavnode,
103        imastnode,nslavnode,nmastnode,nslavs,&nmasts,ifacecount,
104        iponoels,inoels,&ifreenoels,mortar,ipoface,nodface,nk,
105        xnoels));
106 
107   RENEW(islavsurf,ITG,2**ifacecount+2);
108   RENEW(islavnode,ITG,*nslavs);
109   RENEW(inoels,ITG,2*ifreenoels);
110   RENEW(xnoels,double,ifreenoels);
111   SFREE(ipoface);SFREE(nodface);
112 
113   RENEW(imastnode,ITG,nmasts);
114 
115   *itietrip=itietri;*koncontp=koncont;
116   *itiefacp=itiefac;*islavsurfp=islavsurf;
117   *islavnodep=islavnode;*imastnodep=imastnode;
118   *nslavnodep=nslavnode;*nmastnodep=nmastnode;
119   *imastopp=imastop;*iponoelsp=iponoels;*inoelsp=inoels;
120   *ipep=ipe;*imep=ime;*xnoelsp=xnoels;
121 
122   return;
123 }
124