Salome HOME
Homard executable
[modules/homard.git] / src / tool / Utilitaire / utb13c.F
1       subroutine utb13c ( coonoe,
2      >                    somare,
3      >                    hettri, aretri,
4      >                    hetqua, arequa,
5      >                    famtri, cfatri,
6      >                    famqua, cfaqua,
7      >                    nbfmed, numfam,
8      >                    grfmpo, grfmtl, grfmtb,
9      >                    nbgrfm, nomgro, lgnogr,
10      >                    famnum, famval,
11      >                    lifagr,
12      >                    ulbila,
13      >                    ulsort, langue, codret )
14 c ______________________________________________________________________
15 c
16 c                             H O M A R D
17 c
18 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
19 c
20 c Version originale enregistree le 18 juin 1996 sous le numero 96036
21 c aupres des huissiers de justice Simart et Lavoir a Clamart
22 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
23 c aupres des huissiers de justice
24 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
25 c
26 c    HOMARD est une marque deposee d'Electricite de France
27 c
28 c Copyright EDF 1996
29 c Copyright EDF 1998
30 c Copyright EDF 2002
31 c Copyright EDF 2020
32 c ______________________________________________________________________
33 c
34 c    UTilitaire - Bilan sur le maillage - option 13 - phase c
35 c    --           -                              --         -
36 c ______________________________________________________________________
37 c
38 c surfaces des sous-domaines du maillage de calcul
39 c ______________________________________________________________________
40 c .        .     .        .                                            .
41 c .  nom   . e/s . taille .           description                      .
42 c .____________________________________________________________________.
43 c . coonoe . e   . nbnoto . coordonnees des noeuds                     .
44 c .        .     . * sdim .                                            .
45 c . somare . e   .2*nbarto. numeros des extremites d'arete             .
46 c . hettri . e   . nbtrto . historique de l'etat des triangles         .
47 c . aretri . e   .nbtrto*3. numeros des 3 aretes des triangles         .
48 c . hetqua . e   . nbquto . historique de l'etat des quadrangles       .
49 c . arequa . e   .nbquto*4. numeros des 4 aretes des quadrangles       .
50 c . famtri . e   . nbtrto . famille des triangles                      .
51 c . cfatri . e   . nctftr*. codes des familles des triangles           .
52 c .        .     . nbftri .   1 : famille MED                          .
53 c .        .     .        .   2 : type de triangle                     .
54 c .        .     .        .   3 : numero de surface de frontiere       .
55 c .        .     .        .   4 : famille des aretes internes apres raf.
56 c .        .     .        . + l : appartenance a l'equivalence l       .
57 c . famqua . e   . nbquto . famille des quadrangles                    .
58 c . cfaqua . e   . nctfqu*. codes des familles des quadrangles         .
59 c .        .     . nbfqua .   1 : famille MED                          .
60 c .        .     .        .   2 : type de quadrangle                   .
61 c .        .     .        .   3 : numero de surface de frontiere       .
62 c .        .     .        .   4 : famille des aretes internes apres raf.
63 c .        .     .        .   5 : famille des triangles de conformite  .
64 c .        .     .        .   6 : famille de sf active/inactive        .
65 c .        .     .        . + l : appartenance a l'equivalence l       .
66 c . nbfmed . e   .    1   . nombre de familles au sens MED             .
67 c . numfam . e   . nbfmed . numero des familles au sens MED            .
68 c . grfmpo . e   .0:nbfmed. pointeur des groupes des familles          .
69 c . grfmtl . e   .   *    . taille des groupes des familles            .
70 c . grfmtb . e   .10ngrouc. table des groupes des familles             .
71 c . nbgrfm . e   .    1   . nombre de groupes                          .
72 c . nomgro . e   .char*(*). noms des groupes (paquets de 10char8)      .
73 c . lgnogr . e   . nbgrfm . longueur des noms des groupes              .
74 c . famnum .  a  .   *    . famille : numero avec une valeur           .
75 c . famval .  a  .   *    . famille : la valeur                        .
76 c . lifagr .  a  .   *    . liste des familles contenant le groupe     .
77 c . ulbila . e   .   1    . unite logique d'ecriture du bilan          .
78 c . ulsort . e   .   1    . unite logique de la sortie generale        .
79 c . langue . e   .    1   . langue des messages                        .
80 c .        .     .        . 1 : francais, 2 : anglais                  .
81 c . codret .  s  .    1   . code de retour des modules                 .
82 c .        .     .        . 0 : pas de probleme                        .
83 c .        .     .        . 1 : probleme                               .
84 c .____________________________________________________________________.
85 c
86 c====
87 c 0. declarations et dimensionnement
88 c====
89 c
90 c 0.1. ==> generalites
91 c
92       implicit none
93       save
94 c
95       character*6 nompro
96       parameter ( nompro = 'UTB13C' )
97 c
98 #include "nblang.h"
99 #include "fracta.h"
100 #include "coftex.h"
101 c
102 c 0.2. ==> communs
103 c
104 #include "nbfami.h"
105 #include "nombno.h"
106 #include "nombar.h"
107 #include "nombtr.h"
108 #include "nombqu.h"
109 #include "envca1.h"
110 c
111 #include "dicfen.h"
112 #include "impr02.h"
113 c
114 c 0.3. ==> arguments
115 c
116       double precision coonoe(nbnoto,sdim)
117 c
118       integer somare(2,nbarto)
119       integer hettri(nbtrto), aretri(nbtrto,3)
120       integer hetqua(nbquto), arequa(nbquto,4)
121 c
122       integer famtri(nbtrto), cfatri(nctftr,nbftri)
123       integer famqua(nbquto), cfaqua(nctfqu,nbfqua)
124 c
125       integer nbfmed, numfam(nbfmed)
126       integer grfmpo(0:nbfmed)
127       integer grfmtl(*)
128       integer nbgrfm, lgnogr(nbgrfm)
129 c
130       character*8 grfmtb(*)
131       character*8 nomgro(*)
132 c
133       integer famnum(*)
134       double precision famval(*)
135 c
136       integer  lifagr(*)
137 c
138       integer ulbila
139       integer ulsort, langue, codret
140 c
141 c 0.4. ==> variables locales
142 c
143       integer iaux, jaux, kaux
144       integer sa1a2, sa2a3, sa3a4, sa4a1, sa3a1
145       integer a1, a2, a3, a4
146       integer letria, lequad
147       integer etat
148       integer famnbv
149 c
150       double precision v1(3), v2(3), v3(3), vn(3), vdiag(3)
151       double precision daux, daux1, daux2
152 c
153       integer nbmess
154       parameter (nbmess = 20 )
155       character*80 texte(nblang,nbmess)
156 c
157 c 0.5. ==> initialisations
158 c ______________________________________________________________________
159 c
160 c====
161 c 1. messages
162 c====
163 c
164 #include "impr01.h"
165 c
166 #ifdef _DEBUG_HOMARD_
167       write (ulsort,texte(langue,1)) 'Entree', nompro
168       call dmflsh (iaux)
169 #endif
170 c
171       texte(1,4) = '(''Nombre de '',a,'' actifs : '',i8)'
172       texte(1,5) = '(''. Examen du '',a,i8)'
173       texte(1,6) = '(''... Surface du '',a,i8,'' :'',g16.8)'
174       texte(1,7) = '(''..... Stockage'',i8,'' pour la famille '',i8)'
175 c
176       texte(2,4) = '(''Number of active '',a,'' : '',i8)'
177       texte(2,5) = '(''. Examination of '',a,''#'',i8)'
178       texte(2,6) = '(''... Surface of '',a,''#'',i8,'' :'',g14.6)'
179       texte(2,7) = '(''..... Save'',i8,'' for familiy # '',i8)'
180 c
181 #include "impr03.h"
182 c
183 #ifdef _DEBUG_HOMARD_
184       write (ulsort,texte(langue,4)) mess14(langue,3,2), nbtrac
185       write (ulsort,texte(langue,4)) mess14(langue,3,4), nbquac
186 #endif
187 c
188       codret = 0
189 c
190 c====
191 c 2. calcul des surfaces
192 c====
193 c
194 c 2.1. ==> initialisation
195 c
196       famnbv = 0
197 c
198       if ( nbtrac.gt.0 .or. nbquac.gt.0 ) then
199 c
200         jaux = nbtrac + nbquac
201         do 21 , iaux = 1 , jaux
202           famnum(iaux) = 0
203           famval(iaux) = 0.d0
204    21   continue
205 #ifdef _DEBUG_HOMARD_
206       write (ulsort,*) 'jaux = ', jaux
207 #endif
208 c
209       endif
210 c
211 c 2.2. ==> les zones maillees en triangles
212 c
213       if ( nbtrac.gt.0 ) then
214 c
215         do 22 , letria = 1, nbtrto
216 c
217 #ifdef _DEBUG_HOMARD_
218       write (ulsort,texte(langue,5)) mess14(langue,1,2), letria
219 #endif
220 c
221           if ( cfatri(cotyel,famtri(letria)).ne.0 ) then
222 c
223           etat = mod( hettri(letria) , 10 )
224 c
225           if ( etat.eq.0 ) then
226 c
227 c 2.2.1. ==> les aretes et les noeuds du triangle
228 c
229             iaux = aretri(letria,1)
230             jaux = aretri(letria,2)
231             kaux = aretri(letria,3)
232 c
233             call utsotr ( somare, iaux, jaux, kaux,
234      >                    sa1a2, sa2a3, sa3a1 )
235 c
236 c 2.2.2. ==> calcul de la surface
237 c            on rappelle que la surface d'un triangle est egale
238 c            a la moitie de la norme du produit vectoriel de deux
239 c            des vecteurs representant les aretes.
240 c
241             if ( sdim.eq.2 ) then
242 c
243               v2(1) = coonoe(sa2a3,1) - coonoe(sa1a2,1)
244               v2(2) = coonoe(sa2a3,2) - coonoe(sa1a2,2)
245 c
246               v3(1) = coonoe(sa3a1,1) - coonoe(sa1a2,1)
247               v3(2) = coonoe(sa3a1,2) - coonoe(sa1a2,2)
248 c
249               daux = abs( v2(1)*v3(2) - v2(2)*v3(1) )
250 c
251             else
252 c
253               v2(1) = coonoe(sa2a3,1) - coonoe(sa1a2,1)
254               v2(2) = coonoe(sa2a3,2) - coonoe(sa1a2,2)
255               v2(3) = coonoe(sa2a3,3) - coonoe(sa1a2,3)
256 c
257               v3(1) = coonoe(sa3a1,1) - coonoe(sa1a2,1)
258               v3(2) = coonoe(sa3a1,2) - coonoe(sa1a2,2)
259               v3(3) = coonoe(sa3a1,3) - coonoe(sa1a2,3)
260 c
261               vn(1) = v2(2)*v3(3) - v2(3)*v3(2)
262               vn(2) = v2(3)*v3(1) - v2(1)*v3(3)
263               vn(3) = v2(1)*v3(2) - v2(2)*v3(1)
264 c
265               daux = sqrt ( vn(1)*vn(1) + vn(2)*vn(2) + vn(3)*vn(3) )
266 c
267             endif
268 c
269             daux = unsde * daux
270 #ifdef _DEBUG_HOMARD_
271       write (ulsort,texte(langue,6)) mess14(langue,1,2), letria, daux
272 #endif
273 c
274 c 2.2.3. ==> stockage dans la bonne famille
275 c
276             jaux = 0
277             do 2231 , iaux = 1 , famnbv
278               if ( famnum(iaux).eq.cfatri(cofamd,famtri(letria)) ) then
279                 jaux = iaux
280                 goto 2232
281               endif
282  2231       continue
283             famnbv = famnbv + 1
284             jaux = famnbv
285             famnum(jaux) = cfatri(cofamd,famtri(letria))
286 #ifdef _DEBUG_HOMARD_
287             write (ulsort,texte(langue,7)) jaux, famnum(jaux)
288 #endif
289 c
290  2232       continue
291 c
292             famval(jaux) = famval(jaux) + daux
293 c
294           endif
295 c
296           endif
297 c
298    22   continue
299 c
300       endif
301 c
302 c 2.3. ==> les zones maillees en quadrangles
303 c
304       if ( nbquac.gt.0 ) then
305 c
306         do 23 , lequad = 1, nbquto
307 c
308 #ifdef _DEBUG_HOMARD_
309       write (ulsort,texte(langue,5)) mess14(langue,1,4), lequad
310 #endif
311 c
312           if ( cfaqua(cotyel,famqua(lequad)).ne.0 ) then
313 c
314           etat = mod( hetqua(lequad) , 100 )
315 c
316           if ( etat.eq.0 ) then
317 c
318 c 2.3.1. ==> les aretes et les noeuds du quadrangle
319 c
320             a1 = arequa(lequad,1)
321             a2 = arequa(lequad,2)
322             a3 = arequa(lequad,3)
323             a4 = arequa(lequad,4)
324 c
325             call utsoqu ( somare, a1, a2, a3, a4,
326      >                    sa1a2, sa2a3, sa3a4, sa4a1 )
327 c
328 c 2.3.2. ==> calcul de la surface
329 c            pour la calculer, on coupe le quadrangle en deux triangles
330 c            on rappelle que la surface d'un triangle est egale
331 c            a la moitie de la norme du produit vectoriel de deux
332 c            des vecteurs representant les aretes.
333 c           v1 : arete a1 (sa4a1-sa1a2)
334 c           v2 : arete a4 (sa4a1-sa3a4)
335 c           vdiag = diagonale(sa4a1-sa2a3)
336 c
337 c                      sa4a1  a4  sa3a4
338 c                          .______.
339 c                          ..     .
340 c                          . .    .
341 c                        a1.  .   .a3
342 c                          .   .  .
343 c                          .    . .
344 c                          .     ..
345 c                          .______.
346 c                      sa1a2   a2  sa2a3
347 c
348             if ( sdim.eq.2 ) then
349 c
350               v1(1)    = coonoe(sa1a2,1) - coonoe(sa4a1,1)
351               v1(2)    = coonoe(sa1a2,2) - coonoe(sa4a1,2)
352 c
353               v2(1)    = coonoe(sa3a4,1) - coonoe(sa4a1,1)
354               v2(2)    = coonoe(sa3a4,2) - coonoe(sa4a1,2)
355 c
356               vdiag(1) = coonoe(sa2a3,1) - coonoe(sa4a1,1)
357               vdiag(2) = coonoe(sa2a3,2) - coonoe(sa4a1,2)
358 c
359               daux1 = abs ( v1(1)*vdiag(2) - v1(2)*vdiag(1) )
360 c
361               daux2 = abs ( v2(1)*vdiag(2) - v2(2)*vdiag(1) )
362 c
363             else
364 c
365               v1(1)    = coonoe(sa1a2,1) - coonoe(sa4a1,1)
366               v1(2)    = coonoe(sa1a2,2) - coonoe(sa4a1,2)
367               v1(3)    = coonoe(sa1a2,3) - coonoe(sa4a1,3)
368 c
369               v2(1)    = coonoe(sa3a4,1) - coonoe(sa4a1,1)
370               v2(2)    = coonoe(sa3a4,2) - coonoe(sa4a1,2)
371               v2(3)    = coonoe(sa3a4,3) - coonoe(sa4a1,3)
372 c
373               vdiag(1) = coonoe(sa2a3,1) - coonoe(sa4a1,1)
374               vdiag(2) = coonoe(sa2a3,2) - coonoe(sa4a1,2)
375               vdiag(3) = coonoe(sa2a3,3) - coonoe(sa4a1,3)
376 c
377               vn(1) = v1(2)*vdiag(3) - v1(3)*vdiag(2)
378               vn(2) = v1(3)*vdiag(1) - v1(1)*vdiag(3)
379               vn(3) = v1(1)*vdiag(2) - v1(2)*vdiag(1)
380 c
381               daux1 = sqrt ( vn(1)*vn(1) + vn(2)*vn(2) + vn(3)*vn(3) )
382 c
383               vn(1) = v2(2)*vdiag(3) - v2(3)*vdiag(2)
384               vn(2) = v2(3)*vdiag(1) - v2(1)*vdiag(3)
385               vn(3) = v2(1)*vdiag(2) - v2(2)*vdiag(1)
386 c
387               daux2 = sqrt ( vn(1)*vn(1) + vn(2)*vn(2) + vn(3)*vn(3) )
388 c
389             endif
390 c
391             daux = unsde * ( daux1 + daux2 )
392 c
393 #ifdef _DEBUG_HOMARD_
394       write (ulsort,texte(langue,6)) mess14(langue,1,4), lequad, daux
395 #endif
396 c
397 c 2.3.3. ==> stockage dans la bonne famille
398 c
399             jaux = 0
400             do 2331 , iaux = 1 , famnbv
401               if ( famnum(iaux).eq.cfaqua(cofamd,famqua(lequad)) ) then
402                 jaux = iaux
403                 goto 2332
404               endif
405  2331       continue
406             famnbv = famnbv + 1
407             jaux = famnbv
408             famnum(jaux) = cfaqua(cofamd,famqua(lequad))
409 c
410  2332       continue
411 #ifdef _DEBUG_HOMARD_
412             write (ulsort,texte(langue,7)) jaux, famnum(jaux)
413 #endif
414 c
415             famval(jaux) = famval(jaux) + daux
416 c
417           endif
418 c
419           endif
420 c
421    23   continue
422 c
423       endif
424 c
425 c====
426 c 3. impression
427 c====
428 #ifdef _DEBUG_HOMARD_
429       write (ulsort,*) '3. impression ; codret =', codret
430       write (ulsort,90002) 'famnbv', famnbv
431 #endif
432 c
433       if ( famnbv.ne.0 ) then
434 c
435       iaux = 1
436       kaux = 2
437 #ifdef _DEBUG_HOMARD_
438       write (ulsort,texte(langue,3)) 'UTB13E_fac', nompro
439 #endif
440       call utb13e ( kaux, iaux,
441      >              nbfmed, numfam,
442      >              grfmpo, grfmtl, grfmtb,
443      >              nbgrfm, nomgro, lgnogr,
444      >              famnbv, famnum, famval,
445      >              lifagr,
446      >              ulbila,
447      >              ulsort, langue, codret )
448 c
449       endif
450 c
451       end