1 subroutine decine ( nupaci, nbsoci, nbsoav,
2 > seuilh, seuinf, seusup,
4 > indnoe, indnp2, indnim, indare,
6 > indtet, indhex, indpen,
7 > lgopts, taopts, lgetco, taetco,
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 DEcision - CIble - Noeud ou Elements
31 c ______________________________________________________________________
33 c . nom . e/s . taille . description .
34 c .____________________________________________________________________.
35 c . nupaci . es . 1 . numero du passage en cours pour la .
36 c . . . . recherche de cible .
37 c . . . . vaut -1 si la cible est atteinte .
38 c . nbsoci . e . 1 . cible en nombre de sommets (-1 si non) .
39 c . nbmaci . e . 1 . cible en nombre de mailles (-1 si non) .
40 c . nbsoav . es . 1 . nombre de sommetes aux etapes anterieures .
41 c . seuilh . es . 1 . borne superieure de l'erreur (absolue) .
42 c . seuinf . es . 1 . meilleur seuil inferieur en nombre noeuds .
43 c . seusup . es . 1 . meilleur seuil superieur en nombre noeuds .
44 c . nomail . e . ch8 . nom de l'objet contenant le maillage .
45 c . indnoe . es . 1 . indice du dernier noeud cree .
46 c . indnp2 . es . 1 . nombre de noeuds p2 en vigueur .
47 c . indnim . es . 1 . nombre de noeuds internes en vigueur .
48 c . indare . es . 1 . indice de la derniere arete creee .
49 c . indtri . es . 1 . indice du dernier triangle cree .
50 c . indqua . es . 1 . indice du dernier quadrangle cree .
51 c . indtet . es . 1 . indice du dernier tetraedre cree .
52 c . indhex . es . 1 . indice du dernier hexaedre cree .
53 c . indpen . es . 1 . indice du dernier pentaedre cree .
54 c . lgopts . e . 1 . longueur du tableau des options caracteres .
55 c . taopts . e . lgopts . tableau des options caracteres .
56 c . lgetco . e . 1 . longueur du tableau de l'etat courant .
57 c . taetco . e . lgetco . tableau de l'etat courant .
58 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
59 c . langue . e . 1 . langue des messages .
60 c . . . . 1 : francais, 2 : anglais .
61 c . codret . e/s . 1 . code de retour des modules .
62 c . . . . 0 : pas de probleme .
63 c ______________________________________________________________________
66 c 0. declarations et dimensionnement
69 c 0.1. ==> generalites
75 parameter ( nompro = 'DECINE' )
89 integer nupaci, nbsoci
94 integer indnoe, indnp2, indnim, indare, indtri, indqua
95 integer indtet, indhex, indpen
97 double precision seuilh, seuinf, seusup
100 character*8 taopts(lgopts)
103 integer taetco(lgetco)
105 integer ulsort, langue, codret
107 c 0.4. ==> variables locales
110 integer nretap, nrsset
113 integer nbsoan, nbsono
114 integer nbnoan, nbnono
115 integer nbaran, nbarno
116 integer nbtran, nbtrno
117 integer nbquan, nbquno
118 integer nbtean, nbteno
119 integer nbhean, nbheno
120 integer nbpean, nbpeno
121 integer nbpyan, nbpyno
123 double precision daux
127 character*8 nhnoeu, nhmapo, nharet, nhtria, nhquad
128 character*8 nhtetr, nhhexa, nhpyra, nhpent
130 character*8 nhvois, nhsupe, nhsups
131 character*8 ndecar, ndecfa
134 parameter ( nbmess = 11 )
135 character*80 texte(nblang,nbmess)
137 c 0.5. ==> initialisations
138 c ______________________________________________________________________
146 c=======================================================================
147 if ( codava.eq.0 ) then
148 c=======================================================================
150 c 1.3. ==> les messages
154 #ifdef _DEBUG_HOMARD_
155 write (ulsort,texte(langue,1)) 'Entree', nompro
159 #ifdef _DEBUG_HOMARD_
160 write (ulsort,90002) 'nupaci', nupaci
163 texte(1,4) = '(/,a6,'' DECOMPTE DES NOUVELLES ENTITES'')'
164 texte(1,5) = '(37(''=''),/)'
165 texte(1,6) = '(''Pas assez de raffinement '',a)'
166 texte(1,7) = '(''Trop de raffinement '',a)'
167 texte(1,8) = '(''La cible est atteinte.'')'
168 texte(1,9) = '(''Le nombre de noeuds ne bouge plus.'')'
169 texte(1,10) = '(''Le nombre de noeuds alterne.'')'
170 texte(1,11) = '(''Arret du processus.'')'
172 texte(2,4) = '(/,a6,'' COUNTING OF NEW ENTITIES'')'
173 texte(2,5) = '(31(''=''),/)'
174 texte(2,6) = '(''Not enough refinement '',a)'
175 texte(2,7) = '(''Too many refinement '',a)'
176 texte(2,8) = '(''The target is reached.'')'
177 texte(2,9) = '(''No more evolution of the number of nodes.'')'
178 texte(2,10) = '(''The number of nodes alternates.'')'
179 texte(2,11) = '(''The process is over.'')'
183 c 1.4. ==> le numero de sous-etape
186 nrsset = taetco(2) + 1
189 call utcvne ( nretap, nrsset, saux, iaux, codret )
193 write (ulsort,texte(langue,4)) saux
194 write (ulsort,texte(langue,5))
197 c 2. recuperation des pointeurs
200 if ( codret.eq.0 ) then
202 #ifdef _DEBUG_HOMARD_
203 write (ulsort,texte(langue,3)) 'UTNOMH', nompro
206 call utnomh ( nomail,
208 > degre, maconf, homolo, hierar,
209 > rafdef, nbmane, typcca, typsfr, maextr,
212 > nhnoeu, nhmapo, nharet,
214 > nhtetr, nhhexa, nhpyra, nhpent,
216 > nhvois, nhsupe, nhsups,
217 > ulsort, langue, codret)
222 c 3. programmes generiques
224 #ifdef _DEBUG_HOMARD_
225 write (ulsort,90002) '3. programmes generiques ; codret', codret
230 if ( codret.eq.0 ) then
237 c 3.2. ==> Nombre de valeurs
239 if ( codret.eq.0 ) then
242 #ifdef _DEBUG_HOMARD_
248 #ifdef _DEBUG_HOMARD_
249 write (ulsort,texte(langue,3)) 'UTAL00', nompro
251 call utal00 ( iaux, jaux,
252 > nomail, ndecar, ndecfa,
253 > indnoe, indnp2, indnim, indare,
255 > indtet, indhex, indpen,
265 > ulsort, langue, codret )
272 #ifdef _DEBUG_HOMARD_
273 write (ulsort,90002) '3. programmes generiques ; codret', codret
276 if ( codret.eq.0 ) then
278 #ifdef _DEBUG_HOMARD_
279 write (ulsort,90004) 'seuilh', seuilh
280 write (ulsort,90004) 'seuinf avant', seuinf
281 write (ulsort,90004) 'seusup avant', seusup
282 write (ulsort,90002) 'nbsoav avant', nbsoav
283 write (ulsort,90002) 'nbnop1', nbnop1
284 write (ulsort,90002) 'nbsono', nbsono
285 write (ulsort,90002) 'nbsoci', nbsoci
288 c 4.1. ==> Miracle ! La cible est atteinte : on arrete
290 if ( nbsono.eq.nbsoci ) then
292 #ifdef _DEBUG_HOMARD_
293 write (ulsort,texte(langue,8))
300 c 4.2. ==> La cible n'est pas atteinte au premier passage :
301 c on applique un pourcentage de 20%
303 if ( nupaci.eq.1 ) then
305 c 4.2.1. ==> Pas assez de raffinement
307 if ( nbsono.lt.nbsoci ) then
308 #ifdef _DEBUG_HOMARD_
309 write (ulsort,texte(langue,6)) ' '
311 if ( seuilh.gt.0.d0 ) then
318 c 4.2.2. ==> Trop de raffinement
321 #ifdef _DEBUG_HOMARD_
322 write (ulsort,texte(langue,7)) ' '
324 if ( seuilh.gt.0.d0 ) then
332 c 4.2.3. ==> Nouveau seuil
338 c 4.3. ==> Arret eventuel aux passages suivants
339 c Si on alterne, on arrete au meilleur choix
341 if ( nupaci.gt.1 ) then
343 if ( nbsono.eq.nbsoav(2) .and.
344 > nbsono.eq.nbsoav(4) .and.
345 > nbsono.eq.nbsoav(6) .and.
346 > nbsoav(1).eq.nbsoav(3) .and.
347 > nbsoav(3).eq.nbsoav(5) ) then
349 iaux = abs(nbsono-nbsoci)
350 jaux = abs(nbsoav(1)-nbsoci)
351 #ifdef _DEBUG_HOMARD_
352 write (ulsort,90002) 'nbsono-nbsoci', iaux
353 write (ulsort,90002) 'nbsoav(1)-nbsoci', jaux
355 if ( iaux.le.jaux ) then
356 #ifdef _DEBUG_HOMARD_
357 write (ulsort,texte(langue,10))
366 c 4.4. ==> Poursuite aux passages suivants
367 c On decale de la meme quantite quand on progresse dans
368 c le meme sens, sinon dichotomie
370 if ( nupaci.gt.1 ) then
372 c 4.4.1. ==> Si pas assez de raffinement
374 if ( nbsono.lt.nbsoci ) then
375 #ifdef _DEBUG_HOMARD_
376 write (ulsort,texte(langue,6)) ' '
378 c Pas assez de raffinement au passage precedent
379 if ( nbsoav(1).lt.nbsoci ) then
380 #ifdef _DEBUG_HOMARD_
381 write (ulsort,texte(langue,6)) 'avant'
383 daux = seuilh - seuinf
385 seuilh = min(seusup, seuilh+daux)
388 #ifdef _DEBUG_HOMARD_
389 write (ulsort,texte(langue,7)) 'avant'
391 seuilh = 0.5d0*(seusup+seuilh)
394 c 4.4.2. ==> Si trop de raffinement
397 #ifdef _DEBUG_HOMARD_
398 write (ulsort,texte(langue,7)) ' '
400 c Pas assez de raffinement au passage precedent
401 if ( nbsoav(1).lt.nbsoci ) then
402 #ifdef _DEBUG_HOMARD_
403 write (ulsort,texte(langue,6)) 'avant'
406 seuilh = 0.5d0*(seuilh+seuinf)
408 #ifdef _DEBUG_HOMARD_
409 write (ulsort,texte(langue,7)) 'avant'
411 daux = seuilh - seusup
413 seuilh = max(seuinf, seuilh+daux)
420 c 4.5. ==> Preparation de l'etape suivante
422 if ( nupaci.ge.1 ) then
424 do 45 , iaux = 6, 2, -1
425 nbsoav(iaux) = nbsoav(iaux-1)
429 #ifdef _DEBUG_HOMARD_
430 write (ulsort,90002) 'nbsoav apres', nbsoav
431 write (ulsort,90004) 'seuilh apres', seuilh
432 write (ulsort,90004) 'seuinf apres', seuinf
433 write (ulsort,90004) 'seusup apres', seusup
440 #ifdef _DEBUG_HOMARD_
441 write (ulsort,90002) 'nupaci', nupaci
444 #ifdef _DEBUG_HOMARD_
445 if ( nupaci.lt.0 ) then
446 write (ulsort,texte(langue,11))
456 if ( codret.ne.0 ) then
460 write (ulsort,texte(langue,1)) 'Sortie', nompro
461 write (ulsort,texte(langue,2)) codret
465 #ifdef _DEBUG_HOMARD_
466 write (ulsort,texte(langue,1)) 'Sortie', nompro
470 c=======================================================================
472 c=======================================================================