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