1 subroutine utnc01 ( nbanci, nbgemx,
7 > ulsort, langue, codret )
8 c ______________________________________________________________________
12 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
14 c Version originale enregistree le 18 juin 1996 sous le numero 96036
15 c aupres des huissiers de justice Simart et Lavoir a Clamart
16 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
17 c aupres des huissiers de justice
18 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
20 c HOMARD est une marque deposee d'Electricite de France
26 c ______________________________________________________________________
28 c UTilitaire - Non Conformite - phase 01
30 c Reperage des non conformites : on repere les aretes par des
31 c filiations "adoptives" en notant negativement les numeros d'arete
32 c ______________________________________________________________________
34 c . nom . e/s . taille . description .
35 c .____________________________________________________________________.
36 c . nbanci . s . 1 . nombre d'aretes de non conformite initiale .
37 c . . . . egal au nombre d'aretes recouvrant 2 autres.
38 c . nbgemx . s . 1 . nombre maximal de generations sous une .
40 c . coonoe . e . nbnoto . coordonnees des noeuds .
42 c . somare . e .2*nbarto. numeros des extremites d'arete .
43 c . merare . es . nbarto . mere des aretes .
44 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
45 c . povoso . e .0:nbnoto. pointeur des voisins par sommet .
46 c . voisom . e . nvosom . elements 1d, 2d ou 3d voisins par sommet .
47 c . ngenar . s . nbarto . nombre de generations au-dessus des aretes .
48 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
49 c . langue . e . 1 . langue des messages .
50 c . . . . 1 : francais, 2 : anglais .
51 c . codret . es . 1 . code de retour des modules .
52 c . . . . 0 : pas de probleme .
53 c . . . . 3 : probleme .
54 c ______________________________________________________________________
57 c 0. declarations et dimensionnement
60 c 0.1. ==> generalites
66 parameter ( nompro = 'UTNC01' )
84 integer nbanci, nbgemx
85 integer somare(2,nbarto), merare(nbarto)
86 integer aretri(nbtrto,3)
87 integer povoso(0:nbnoto), voisom(*)
88 integer ngenar(nbarto)
90 double precision coonoe(nbnoto,sdim)
92 integer ulsort, langue, codret
94 c 0.4. ==> variables locales
96 integer iaux, jaux, kaux
97 integer poind2, poinf2, point2
98 integer poind3, poinf3, point3
99 integer aret1, aretmi, aretmo, aretma
100 integer sonnnn, sopppp, soqqqq
101 integer somdep, somarr
102 integer somde3, somar3
103 integer larete(3), lenoeu(3,3)
104 #ifdef _DEBUG_HOMARD_
108 double precision daux(3), vect(3,3)
111 parameter ( nbmess = 10 )
112 character*80 texte(nblang,nbmess)
114 c 0.5. ==> initialisations
115 c ______________________________________________________________________
125 #ifdef _DEBUG_HOMARD_
126 write (ulsort,texte(langue,1)) 'Entree', nompro
131 > '(''Nombre de paires de '',a,'' non-conformes :'',i10))'
133 > '(''Nombre maximal de generations de '',a,'' :'',i10))'
134 texte(1,6) = '(/,''Examen du '',a,i10)'
135 texte(1,7) = '(a,1x,a,i10,'', de'',i10,'' a'',i10)'
136 texte(1,8) = '(a,3('' '',a,'' :'',i10))'
138 > '(''Nombre de '',a,'' de generation'',i10,'' :'',i10)'
141 > '(''Number of non-conformal situations for '',a,'':'',i10))'
143 > '(''Maximal number of generations for '',a,'':'',i10))'
144 texte(2,6) = '(/,''Examination of '',a,'' #'',i10)'
145 texte(2,7) = '(a,1x,a,'' #'',i10,'', from'',i10,'' to'',i10)'
146 texte(2,8) = '(a,3('' '',a,'' :'',i10))'
148 > '(''Number of '',a,'' from generation #'',i10,'' :'',i10)'
154 c 2. On cherche tous les triplets d'aretes (aret1,larete(2),larete(3))
155 c qui sont concourrantes.
156 c Si elles definissent un triangle, on ne fait rien.
157 c Sinon, on repere laquelle chapeaute les 2 autres : ce sera la
161 c 2.1. ==> initialisations
163 do 21 , aret1 = 1 , nbarto
168 c 2.2. ==> traitement
170 do 2 , aret1 = 1 , nbarto
172 if ( codret.eq.0 ) then
174 sonnnn = somare(1,aret1)
175 sopppp = somare(2,aret1)
176 #ifdef _DEBUG_HOMARD_
177 if ( aret1.eq.10)then
183 write (ulsort,texte(langue,6)) mess14(langue,1,1), aret1
184 write (ulsort,texte(langue,8)) ' ', 'de', sonnnn, 'a', sopppp
185 cgn write (ulsort,texte(langue,4)) mess14(langue,3,1), nbanci
189 c 2.2.1. ==> pour chacune des autres aretes contenant 'sonnnn'
191 poind2 = povoso(sonnnn-1) + 1
192 poinf2 = povoso(sonnnn)
193 do 22 , point2 = poind2, poinf2
195 if ( aret1.ne.voisom(point2) ) then
197 larete(2) = voisom(point2)
199 c les deux sommets de cette arete : P et Q
201 somdep = somare(1,larete(2))
202 somarr = somare(2,larete(2))
203 #ifdef _DEBUG_HOMARD_
205 write (ulsort,texte(langue,7)) '...', mess14(langue,1,1),
206 > larete(2), somdep, somarr
210 c celui des sommets qui n'est pas sommet de 'aret1'
212 if ( somdep.eq.sonnnn ) then
218 #ifdef _DEBUG_HOMARD_
220 write (ulsort,texte(langue,8)) ' ', 'N', sonnnn, 'P', sopppp,
225 c existe-t-il une arete joignant P et Q ?
227 poind3 = povoso(sopppp-1) + 1
228 poinf3 = povoso(sopppp)
229 do 221 , point3 = poind3, poinf3
231 larete(3) = voisom(point3)
233 c les deux sommets de cette arete
235 somde3 = somare(1,larete(3))
236 somar3 = somare(2,larete(3))
237 #ifdef _DEBUG_HOMARD_
239 write (ulsort,texte(langue,7)) '.....', mess14(langue,1,1),
240 > larete(3), somde3, somar3
244 if ( somde3.eq.soqqqq .or. somar3.eq.soqqqq ) then
246 if ( ngenar(aret1).eq.0 .and.
247 > ngenar(larete(2)).eq.0 .and.
248 > ngenar(larete(3)).eq.0 ) then
251 #ifdef _DEBUG_HOMARD_
253 write (ulsort,texte(langue,7)) '====>', mess14(langue,1,1),
254 > larete(3), somde3, somar3
255 write (ulsort,texte(langue,8)) ' ', 'A1', larete(1),
256 > 'A2', larete(2), 'A3', larete(3)
260 c existe-t-il un triangle defini par ces 3 aretes ?
262 if ( nbtrto.ne.0 ) then
264 cgn print *,'A1', larete(1),' A2', larete(2), ' A3', larete(3)
265 aretmi = min(larete(1), larete(2), larete(3))
266 aretma = max(larete(1), larete(2), larete(3))
267 if ( larete(1).ne.aretmi .and.
268 > larete(1).ne.aretma ) then
270 elseif ( larete(2).ne.aretmi .and.
271 > larete(2).ne.aretma ) then
276 #ifdef _DEBUG_HOMARD_
278 write (ulsort,*)'aretmi/mo/ma',aretmi, aretmo, aretma
281 do 2211 , iaux = 1, nbtrto
282 cgn print *,aretri(iaux,1),aretri(iaux,2),aretri(iaux,3)
283 if ( min(aretri(iaux,1),
285 > aretri(iaux,3)).eq.aretmi ) then
286 #ifdef _DEBUG_HOMARD_
288 write (ulsort,*)'triangle ',iaux,' :',
289 > aretri(iaux,1),aretri(iaux,2),aretri(iaux,3)
292 if ( max(aretri(iaux,1),
294 > aretri(iaux,3)).eq.aretma ) then
295 if ( aretri(iaux,1).eq.aretmo .or.
296 > aretri(iaux,2).eq.aretmo .or.
297 > aretri(iaux,3).eq.aretmo ) then
298 cgn print *,'c''est un vrai triangle'
307 c recherche des dependances de ces 3 aretes
308 c on cherche quel est l'alignement des noeuds
310 c l'arete 1 va de N a P
311 c l'arete 2 est entre N et Q
312 c l'arete 3 est entre Q et P
313 c l'arete i va de lenoeu(1,i) a lenoeu(2,i)
319 lenoeu(1,2) = min(sonnnn,soqqqq)
320 lenoeu(2,2) = max(sonnnn,soqqqq)
323 lenoeu(1,3) = min(sopppp,soqqqq)
324 lenoeu(2,3) = max(sopppp,soqqqq)
327 do 2212 , iaux = 1, 3
328 cgn print *,larete(iaux),lenoeu(1,iaux),lenoeu(2,iaux),lenoeu(3,iaux)
329 do 2213 , jaux = 1, sdim
330 vect(iaux,jaux) = coonoe(lenoeu(2,iaux),jaux)
331 > - coonoe(lenoeu(1,iaux),jaux)
333 cgn print *,vect(iaux,1),vect(iaux,2),vect(iaux,3)
336 c on verifie que les 3 points sont alignes :
338 c A--------C---------------------B
339 c attention : contrairement a ce que nous pensions au depart,
340 c on peut tres bien avoir des situations avec 3 aretes
341 c concourrantes sans qu'elles ne forment un triangle
342 c au sens de face HOMARD.
354 c B...................C
356 c Si des tetraedres sont batis sur les faces ACR, CRB et
357 c BRA, le triangle ABC n'existe pas
359 if ( sdim.eq.2 ) then
362 > ( vect(1,1) * vect(2,2) ) - ( vect(1,2) * vect(2,1) )
364 if ( daux(1).gt.epsima ) then
365 #ifdef _DEBUG_HOMARD_
366 write(ulsort,*) 'bizarrerie : daux(1) =',daux(1)
367 write(ulsort,*) 'arete 1 =',sonnnn,' => ', sopppp
368 write(ulsort,*) 'arete 2 =',sopppp,' => ', soqqqq
369 write(ulsort,*) 'arete 3 =',soqqqq,' => ', sonnnn
377 > ( vect(1,2) * vect(2,3) ) - ( vect(1,3) * vect(2,2) )
379 > ( vect(1,3) * vect(2,1) ) - ( vect(1,1) * vect(2,3) )
381 > ( vect(1,1) * vect(2,2) ) - ( vect(1,2) * vect(2,1) )
383 daux(1) = abs(daux(1)) + abs(daux(2)) + abs(daux(3))
385 if ( daux(1).gt.epsima ) then
386 #ifdef _DEBUG_HOMARD_
387 write(ulsort,*) 'bizarrerie : daux(1) =',daux(1)
388 write(ulsort,6661) aret1,lenoeu(1,1), lenoeu(2,1)
389 write(ulsort,6661) larete(2),lenoeu(1,2), lenoeu(2,2)
390 write(ulsort,6661) larete(3),lenoeu(1,3), lenoeu(2,3)
391 write(ulsort,6662) sonnnn,
392 >coonoe(sonnnn,1),coonoe(sonnnn,2),coonoe(sonnnn,3)
393 write(ulsort,6662) sopppp,
394 >coonoe(sopppp,1),coonoe(sopppp,2),coonoe(sopppp,3)
395 write(ulsort,6662) soqqqq,
396 >coonoe(soqqqq,1),coonoe(soqqqq,2),coonoe(soqqqq,3)
397 write(ulsort,6663) sonnnn,soqqqq,
398 >coonoe(soqqqq,1)-coonoe(sonnnn,1),
399 >coonoe(soqqqq,2)-coonoe(sonnnn,2),
400 >coonoe(soqqqq,3)-coonoe(sonnnn,3)
401 write(ulsort,6663) sopppp,soqqqq,
402 >coonoe(soqqqq,1)-coonoe(sopppp,1),
403 >coonoe(soqqqq,2)-coonoe(sopppp,2),
404 >coonoe(soqqqq,3)-coonoe(sopppp,3)
406 >(coonoe(soqqqq,1)-coonoe(sopppp,1))/
407 >(coonoe(soqqqq,1)-coonoe(sonnnn,1)),
408 >(coonoe(soqqqq,2)-coonoe(sopppp,2))/
409 >(coonoe(soqqqq,2)-coonoe(sonnnn,2)),
410 >(coonoe(soqqqq,3)-coonoe(sopppp,3))/
411 >(coonoe(soqqqq,3)-coonoe(sonnnn,3))
412 6661 format('arete',i10,' de',i10,' a',i10)
413 6662 format('noeud',i10,' :',3(g15.8,1x))
414 6663 format('de',i10,' a',i10,' :',3(g15.8,1x))
415 6664 format('rapport :',3(g15.8,1x))
422 c Calcul du produit scalaire entre le 3�me noeud et les 2 extremites
423 c de chaque arete iaux :
425 c A--------C---------------------B
427 c CA*CB = CA * CB * cos(CA,CB) = - CA * CB < 0
428 c AB*AC = AB * AC * cos(AB,AC) = + AB * AC > 0
429 c BC*BA = BC * BA * cos(BC,BA) = + BC * BA > 0
431 do 2214 , iaux = 1, 3
434 do 2215 , jaux = 1, sdim
435 daux(iaux) = daux(iaux) +
436 > ( coonoe(lenoeu(1,iaux),jaux) - coonoe(lenoeu(3,iaux),jaux) ) *
437 > ( coonoe(lenoeu(2,iaux),jaux) - coonoe(lenoeu(3,iaux),jaux) )
439 cgn print *,'daux(',iaux,') =',daux(iaux)
441 c On repere celui qui est negatif (il y en a forcement un !)
442 c On connait alors l'arete qui recouvre les deux autres : c'est iaux
443 c Les deux autres sont obtenues par pemutation circulaire de iaux
445 c - les deux "petites" aretes ont la grande comme mere adoptive
446 c cela servira dans la suite de la conversion
447 c - la "grande" arete a une fille ; il suffit de mettre un numero
448 c positif strictement car c'est utilise uniquement ici pour ne
449 c pas faire plusieurs fois la meme chose (cf test au debut de
450 c la boucle 221). On choisit de mettre 1.
452 if ( daux(iaux).lt.epsima ) then
453 jaux = per1a3(-1,iaux)
454 kaux = per1a3( 1,iaux)
455 cgn if ( aret1.eq.15931)then
456 cgn print *,larete(iaux),larete(jaux),larete(kaux)
457 cgn write (ulsort,texte(langue,6)) mess14(langue,1,1), 16334
458 cgn write (ulsort,texte(langue,8)) ' ', 'de', somare(1,16334),
459 cgn > 'a', somare(2,16334)
461 merare(larete(jaux)) = -larete(iaux)
462 merare(larete(kaux)) = -larete(iaux)
463 ngenar(larete(iaux)) = 1
464 cgn ngenar(larete(iaux)) =
465 cgn > - max(larete(jaux),larete(kaux))
472 c probleme si on arrive ici ...
487 #ifdef _DEBUG_HOMARD_
488 cgn if ( aret1.eq.15931)then
489 write (ulsort,texte(langue,4)) mess14(langue,3,1), nbanci
496 c 3. Determination du nombre de generations au-dessus de chaque arete
498 c x---------------------------0---------------------------x
499 c x-------------1-------------x-------------1-------------x
500 c x------2------x------2------x------2------x------2------x
503 c On part d'une arete quelconque. On compte le nombre d'aretes
504 c au-dessus d'elle dans l'ascendance.
507 if ( codret.eq.0 ) then
509 do 31 , iaux = 1 , nbarto
514 cgn write (ulsort,texte(langue,6)) mess14(langue,1,1), jaux
515 if ( merare(jaux).ne.0 ) then
526 do 32 , iaux = 2 , nbarto
527 nbgemx = max(nbgemx,ngenar(iaux))
532 cgn write (ulsort,*)'ngenar : ',ngenar
533 cgn write (ulsort,*)'merare : ',merare
534 cgn print *,'ngenar(190) : ',ngenar(190)
535 cgn print *,'merare(190) : ',merare(190)
537 #ifdef _DEBUG_HOMARD_
539 c 3.3. ==> impression du nombre d'aretes par generation
545 if ( codret.eq.0 ) then
548 do 33 , iaux = 1 , nbarto
550 if ( ngenar(iaux).eq.kaux ) then
556 if ( jaux.ne.0 ) then
557 write (ulsort,texte(langue,10)) mess14(langue,3,1),
570 #ifdef _DEBUG_HOMARD_
571 write (ulsort,texte(langue,4)) mess14(langue,3,1), nbanci
572 write (ulsort,texte(langue,5)) mess14(langue,3,1), nbgemx
575 if ( codret.ne.0 ) then
579 write (ulsort,texte(langue,1)) 'Sortie', nompro
580 write (ulsort,texte(langue,2)) codret
584 #ifdef _DEBUG_HOMARD_
585 write (ulsort,texte(langue,1)) 'Sortie', nompro