1 subroutine sfliso ( numnoe, lignoe, abscno,
4 > somare, hetare, filare, np2are,
7 > somseg, seglig, segnoe,
8 > ulsort, langue, codret)
9 c ______________________________________________________________________
13 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
15 c Version originale enregistree le 18 juin 1996 sous le numero 96036
16 c aupres des huissiers de justice Simart et Lavoir a Clamart
17 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
18 c aupres des huissiers de justice
19 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
21 c HOMARD est une marque deposee d'Electricite de France
27 c ______________________________________________________________________
29 c Suivi de Frontiere - LIen des SOmmets
31 c ______________________________________________________________________
33 c . nom . e/s . taille . description .
34 c .____________________________________________________________________.
35 c . numnoe . s . mcnvnf . liste des noeuds de calcul de frontiere .
36 c . lignoe . s . mcnvnf . liste lignes pour ces noeuds .
37 c . abscno . s . mcnvnf . abscisse curviligne de ces noeuds .
38 c . unst2x . e . 1 . inverse de la taille maximale au carre .
39 c . epsid2 . e . 1 . precision relative pour carre de distance .
40 c . coonoe . es . nbnoto . coordonnees des noeuds .
42 c . somare . e .2*nbarto. numeros des extremites d'arete .
43 c . hetare . e . nbarto . historique de l'etat des aretes .
44 c . filare . e . nbarto . premiere fille des aretes .
45 c . np2are . e . nbarto . noeud milieux des aretes .
46 c . cfaare . e . nctfar*. codes des familles des aretes .
47 c . . . nbfare . 1 : famille MED .
48 c . . . . 2 : type de segment .
49 c . . . . 3 : orientation .
50 c . . . . 4 : famille d'orientation inverse .
51 c . . . . 5 : numero de ligne de frontiere .
52 c . . . . > 0 si concernee par le suivi de frontiere.
53 c . . . . <= 0 si non concernee .
54 c . . . . 6 : famille frontiere active/inactive .
55 c . . . . 7 : numero de surface de frontiere .
56 c . . . . + l : appartenance a l'equivalence l .
57 c . famare . es . nbarto . famille des aretes .
58 c . geocoo . e .sfnbso**. coordonnees des sommets de la frontiere .
59 c . abscur . e . sfnbse . abscisse curviligne des somm des segments .
60 c . somseg . e . sfnbse . liste des sommets des lignes separees par .
62 c . seglig . e .0:sfnbli. pointeur dans le tableau somseg : les .
63 c . . . . segments de la ligne i sont aux places de .
64 c . . . . seglig(i-1)+1 a seglig(i)-1 inclus .
65 c . segnoe . aux . nbnoto . segments lies aux noeuds .
66 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
67 c . langue . e . 1 . langue des messages .
68 c . . . . 1 : francais, 2 : anglais .
69 c . codret . es . 1 . code de retour des modules .
70 c . . . . 0 : pas de probleme .
71 c . . . . x : probleme .
72 c ______________________________________________________________________
75 c 0. declarations et dimensionnement
78 c 0.1. ==> generalites
84 parameter ( nompro = 'SFLISO' )
104 double precision unst2x, epsid2
105 double precision coonoe(nbnoto,sdim), geocoo(sfnbso,*)
106 double precision abscno(mcnxnf)
107 double precision abscur(sfnbse)
109 integer numnoe(mcnxnf), lignoe(mcnxnf)
110 integer seglig(0:sfnbli), somseg(sfnbse)
111 integer segnoe(nbnoto)
112 integer somare(2,nbarto), hetare(nbarto), filare(nbarto)
113 integer np2are(nbarto)
114 integer famare(nbarto), cfaare(nctfar,nbfare)
116 integer ulsort, langue, codret
118 c 0.4. ==> variables locales
121 integer lenoeu, larete
126 #ifdef _DEBUG_HOMARD_
131 double precision coop(3), acnoeu
134 parameter ( nbmess = 20 )
135 character*80 texte(nblang,nbmess)
137 c 0.5. ==> initialisations
138 c ______________________________________________________________________
143 c 1.1. ==> les messages
147 #ifdef _DEBUG_HOMARD_
148 write (ulsort,texte(langue,1)) 'Entree', nompro
152 texte(1,4) = '(''. Nombre de '',a,'' du maillage :'',i10)'
153 texte(1,5) = '(''Boucle sur les aretes'')'
154 texte(1,6) = '(/,''Arete'',i10,'', sur la ligne'',i10)'
156 >'(/,'' .. Examen du noeud du cote'',i2,'' :'',i10,'', seg ='',i5)'
157 texte(1,9) = '(6x,''Une arete est de longueur'')'
158 texte(1,10) = '(i5,'' aretes sont de longueur'')'
160 > '(6x,''inferieure a la discretisation de la frontiere'')'
161 texte(1,12) = '(a,'' Inhibition du sf sur l''''arete'',i10)'
163 >'(5x,''Examen des noeuds situes sur des extremites de ligne'')'
165 texte(2,4) = '(''. Number of '',a,'' in mesh :'',i10)'
166 texte(2,5) = '(''Loop over edges'')'
167 texte(2,6) = '(/,''Edge #'',i10,'', on line'',i10)'
169 > '(/,'' .. Examination of node #'',i2,'' #'',i10,'', seg ='',i5)'
170 texte(2,9) = '(6x,''One edge is with length'')'
171 texte(2,10) = '(i5,'' edges are with length'')'
173 > '(6x,''lower than the discretization of the boundary'')'
174 texte(2,12) = '(a,'' Inhibition of bf for the edge #'',i10)'
175 texte(2,20) = '(5x,''Examination of nodes located on lines'')'
179 c 1.2. ==> a priori, aucun segment n'est attache a un noeud
181 do 12 , lenoeu = 1 , nbnoto
185 if ( typsfr.le.2 ) then
195 #ifdef _DEBUG_HOMARD_
196 write (ulsort,texte(langue,4)) mess14(langue,3,-1), nbnoto
197 write (ulsort,texte(langue,4)) mess14(langue,3,1), nbarto
200 cgn write(ulsort,90002) 'somseg', somseg
201 #ifdef _DEBUG_HOMARD_
202 do 13 , iaux = 1, sfnbli
203 write(ulsort,90002) 'somseg pour la ligne numero', iaux
205 do 131 , seg = seglig(iaux-1)+1, seglig(iaux)-1
207 write(ulsort,90012) '.. sommet numero', jaux, somseg(seg)
213 c 2. Boucle sur les aretes qui sont actives et positionnees sur
214 c une ligne de frontiere
215 c On va situer les sommets sur la ligne
217 #ifdef _DEBUG_HOMARD_
218 write (ulsort,*) '2. boucle sur les aretes ; codret = ', codret
221 if ( codret.eq.0 ) then
223 #ifdef _DEBUG_HOMARD_
224 write (ulsort,texte(langue,5))
227 do 20 , larete = 1 , nbarto
229 #ifdef _DEBUG_HOMARD_
230 c if ( larete.le.0 .or.
231 c > ( larete.eq.1 .or. larete.eq.8 .or.
232 c > larete.eq.9 ) ) then
233 if ( larete.le.0 ) then
240 lig = cfaare(cosfli,famare(larete))
241 #ifdef _DEBUG_HOMARD_
242 if ( glop.ne.0 ) then
243 write (ulsort,texte(langue,6)) larete, lig
249 if ( hetare(larete).ne.50 ) then
250 #ifdef _DEBUG_HOMARD_
251 if ( glop.ne.0 ) then
252 iaux = seglig(lig-1) + 1
254 write (ulsort,90002) 'Sommets extremites de cette ligne',
255 >somseg(iaux), somseg(jaux-1)
259 c On parcourt les noeuds de l'arete
261 do 200 , jaux = 1 , nbsomm
263 c 2.1. ==> Le noeud et son segment initial
265 if ( codret.eq.0 ) then
267 if ( jaux.le.2 ) then
268 lenoeu = somare(jaux,larete)
270 lenoeu = np2are(larete)
273 #ifdef _DEBUG_HOMARD_
274 if ( glop.ne.0 ) then
275 write (ulsort,texte(langue,7)) jaux, lenoeu, seg
278 > 'Le noeud est une extremite de la ligne', lig
279 elseif ( seg.eq.0 ) then
280 write (ulsort,*) '... Ce noeud n''est pas encore place.'
283 > 'Le noeud a deja ete place sur le segment', seg
288 c 2.2. ==> Le noeud est une extremite de ligne ou n'a pas ete place
292 do 221 , iaux = 1 , sdim
293 coop(iaux) = coonoe(lenoeu,iaux)
296 #ifdef _DEBUG_HOMARD_
297 if ( glop.ne.0 ) then
298 write (ulsort,90024) 'apres 221, coop du noeud',
299 > lenoeu, (coop(iaux),iaux=1,sdim)
303 #ifdef _DEBUG_HOMARD_
304 write (ulsort,texte(langue,3)) 'SFSENO', nompro
306 call sfseno ( coop, lig, unst2x, epsid2,
307 > seglig, somseg, geocoo, abscur,
310 #ifdef _DEBUG_HOMARD_
311 if ( glop.ne.0 ) then
312 write (ulsort,90024) 'apres appel a sfseno, coop du noeud',
313 > lenoeu, (coop(iaux),iaux=1,sdim)
314 write (ulsort,90004) '==> acnoeu', acnoeu
315 write (ulsort,90002) 'Ce noeud a ete mis sur le segment', seg
322 do 222 , iaux = 1 , mcnvnf
323 if ( numnoe(iaux).eq.lenoeu ) then
324 if ( lignoe(iaux).eq.lig ) then
325 cgn write (ulsort,*) ' enregistrement deja fait'
334 cgn write (ulsort,90002) ' enregistrement a la position', mcnvnf
335 numnoe(mcnvnf) = lenoeu
337 abscno(mcnvnf) = acnoeu
338 c les noeuds sont forces sur la frontiere
340 cgn do 2222 , iaux = 1 , sdim
341 cgn acnoeu = acnoeu+(coonoe(lenoeu,iaux)-coop(iaux))**2
343 cgn write (ulsort,*) 223, lenoeu,acnoeu
344 #ifdef _DEBUG_HOMARD_
345 if ( glop.ne.0 .or. lenoeu.eq.-102 ) then
346 write (ulsort,90024) 'avant 222, coonoe du noeud',
347 > lenoeu, (coonoe(lenoeu,iaux),iaux=1,sdim)
350 do 223 , iaux = 1 , sdim
351 cgn write (ulsort,*) iaux,coonoe(lenoeu,iaux),coop(iaux)
352 coonoe(lenoeu,iaux) = coop(iaux)
354 #ifdef _DEBUG_HOMARD_
355 if ( glop.ne.0 .or. lenoeu.eq.-102 ) then
356 write (ulsort,90024) 'apres 223, coonoe du noeud',
357 > lenoeu, (coonoe(lenoeu,iaux),iaux=1,sdim)
360 #ifdef _DEBUG_HOMARD_
369 c 2.3. ==> Le noeud est deja situe sur un segment interieur
373 #ifdef _DEBUG_HOMARD_
374 if ( glop.ne.0 .or. lenoeu.eq.-102 ) then
375 write (ulsort,90024) ' .... Noeud',
376 > lenoeu,(coonoe(lenoeu,iaux),iaux=1,sdim)
377 write (ulsort,*) 'deja sur le segment ',seg
381 call sflise( ligv, seg, seglig,
382 > ulsort, langue, codret)
384 if ( codret.eq.0 ) then
386 if ( ligv.eq.lig ) then
388 c 2.3.1 ==> meme ligne : pas de probleme
394 c 2.3.2 ==> autre ligne : on le retire
408 c 2.4. ==> Combien de noeuds de l'arete pointent sur la ligne ?
410 if ( codret.eq.0 ) then
412 if ( segm(1).eq.0 .and. segm(2).eq.0 ) then
414 c 2.4.1. ==> Aucun : impression, et prohibition du sf
416 20100 format(7x,'Arete',i10,' (',2i10,') ->',i4,': ',
417 > 'un sommet n''est pas situe')
419 > larete,(somare(iaux,larete),iaux=1,2),lig
420 iaux = cfaare(cosfin,famare(larete))
421 famare(larete) = iaux
422 #ifdef _DEBUG_HOMARD_
423 if ( glop.ne.0 ) then
424 write(ulsort,texte(langue,12)) '2.4.1', larete
427 if ( mod(hetare(larete),10).eq.2 ) then
428 do 241 , iaux = 0 , 1
429 jaux = cfaare(cosfin,famare(filare(larete)+iaux))
430 famare(filare(larete)+iaux) = jaux
431 #ifdef _DEBUG_HOMARD_
432 if ( glop.ne.0 ) then
433 write(ulsort,texte(langue,12)) '2.4.1',filare(larete)+iaux
439 elseif ( abs(segm(1)).eq.abs(segm(2)) ) then
441 c 2.4.2. ==> Les deux ; et ils pointent vers le meme segment
442 c Il ne sert plus a rien de suivre la frontiere pour
443 c cette arete : on a atteint la discretisation minimale
445 #ifdef _DEBUG_HOMARD_
446 if ( glop.ne.0 ) then
447 20200 format(7x,'Arete',i10,' (',2i10,') ->',i4,': ',
448 > 'meme segment',i10)
450 > larete,(somare(iaux,larete),iaux=1,2),lig,abs(segm(1))
451 write(ulsort,texte(langue,12)) '2.4.2', larete
455 iaux = cfaare(cosfin,famare(larete))
456 famare(larete) = iaux
457 if ( mod(hetare(larete),10).eq.2 ) then
458 do 242 , iaux = 0 , 1
459 jaux = cfaare(cosfin,famare(filare(larete)+iaux))
460 famare(filare(larete)+iaux) = jaux
461 #ifdef _DEBUG_HOMARD_
462 if ( glop.ne.0 ) then
463 write(ulsort,texte(langue,12)) '2.4.2',filare(larete)+iaux
484 #ifdef _DEBUG_HOMARD_
485 write(ulsort,*) '3. impressions, codret =', codret
488 if ( nbar00.ne.0 ) then
489 if ( nbar00.eq.1 ) then
490 write (ulsort,texte(langue,9))
492 write (ulsort,texte(langue,10)) nbar00
494 write (ulsort,texte(langue,11))
501 if ( codret.ne.0 ) then
505 write (ulsort,texte(langue,1)) 'Sortie', nompro
506 write (ulsort,texte(langue,2)) codret
510 #ifdef _DEBUG_HOMARD_
511 write (ulsort,texte(langue,1)) 'Sortie', nompro