Salome HOME
Homard executable
[modules/homard.git] / src / tool / Suivi_Frontiere / sfgrf3.F
1       subroutine sfgrf3 ( nbfseg,
2      >                    nbf, nbgrmx, nblign, lgtabl,
3      >                    pointl, taigrl, nomgrl,
4      >                    pointf, nomgrf, numfam,
5      >                    lifami, linugr, ncafdg,
6      >                    ulsort, langue, codret )
7 c ______________________________________________________________________
8 c
9 c                             H O M A R D
10 c
11 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
12 c
13 c Version originale enregistree le 18 juin 1996 sous le numero 96036
14 c aupres des huissiers de justice Simart et Lavoir a Clamart
15 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
16 c aupres des huissiers de justice
17 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
18 c
19 c    HOMARD est une marque deposee d'Electricite de France
20 c
21 c Copyright EDF 1996
22 c Copyright EDF 1998
23 c Copyright EDF 2002
24 c Copyright EDF 2020
25 c ______________________________________________________________________
26 c
27 c   Suivi de Frontiere - GRoupes de la Frontiere - phase 3
28 c   -        -           --            -                 -
29 c remarque : sfgrf2 et sfgrf3 sont des clones
30 c   Mise a jour de la liste des groupes de segments voulus
31 c ______________________________________________________________________
32 c .        .     .        .                                            .
33 c .  nom   . e/s . taille .           description                      .
34 c .____________________________________________________________________.
35 c . nbfseg . e   .   1    . nombre de familles de segments             .
36 c . nbf    . e   .   1    . nombre de familles du maillage frontiere   .
37 c . nbgrmx . e   .   1    . nombre maxi de groupes dans les familles   .
38 c . nblign . es  .   1    . nombre de lignes decrites                  .
39 c . lgtabl . es  .   1    . longueur des tables                        .
40 c . pointl . e   .0:nblign. pointeur sur le tableau nomgrl             .
41 c . taigrl . e   .   *    . taille des noms des groupes des lignes     .
42 c . nomgrl . e   .   *    . noms des groupes des lignes                .
43 c . pointf . e   . 0:nbf  . pointeur sur le tableau nomgrf             .
44 c . numfam . e   .   nbf  . numero des familles au sens MED            .
45 c . nomgrf . e   .   *    . noms des groupes des familles              .
46 c . lifami . e   . nbfseg . liste des familles a explorer              .
47 c . linugr .  s  . nblign . numeros des groupes acceptables            .
48 c . ncafdg . es  . char*8 . nom de l'objet groupes/attributs frontiere .
49 c . ulsort . e   .   1    . numero d'unite logique de la liste standard.
50 c . langue . e   .    1   . langue des messages                        .
51 c .        .     .        . 1 : francais, 2 : anglais                  .
52 c . codret . es  .    1   . code de retour des modules                 .
53 c .        .     .        . 0 : pas de probleme                        .
54 c .        .     .        . 1 : probleme                               .
55 c ______________________________________________________________________
56 c
57 c====
58 c 0. declarations et dimensionnement
59 c====
60 c
61 c 0.1. ==> generalites
62 c
63       implicit none
64       save
65 c
66       character*6 nompro
67       parameter ( nompro = 'SFGRF3' )
68 c
69 #include "nblang.h"
70 c
71 c 0.2. ==> communs
72 c
73 #include "envex1.h"
74 #include "impr02.h"
75 #include "gmenti.h"
76 #include "gmstri.h"
77 c
78 c 0.3. ==> arguments
79 c
80       integer nbfseg
81       integer nbf, nbgrmx, nblign, lgtabl
82       integer pointl(0:nbgrmx), pointf(0:nbf), numfam(nbf)
83       integer taigrl(*)
84       integer lifami(nbfseg), linugr(nblign)
85 c
86       character*8 nomgrl(*), nomgrf(*)
87       character*8 ncafdg
88 c
89       integer ulsort, langue, codret
90 c
91 c 0.4. ==> variables locales
92 c
93       integer iaux, jaux, kaux, lig, fam
94       integer nbgr, gr
95       integer lgngrl, lgngrf
96       integer nblnew, lgtnew
97       integer pointn, pttgrn, ptngrn
98 c
99       character*80 groupl,groupf
100       character*8 ntrava
101 c
102       integer nbmess
103       parameter ( nbmess = 10 )
104       character*80 texte(nblang,nbmess)
105 c
106 c 0.5. ==> initialisations
107 c ______________________________________________________________________
108 c
109 c====
110 c 1. messages
111 c====
112 c
113 #include "impr01.h"
114 c
115 #ifdef _DEBUG_HOMARD_
116       write (ulsort,texte(langue,1)) 'Entree', nompro
117       call dmflsh (iaux)
118 #endif
119 c
120       texte(1,4) = '(''Nombre de familles de '',a,'' :'',i8)'
121       texte(1,5) =
122      >'(''*'',20x,''Elimination de groupe(s) frontiere discrete'',
123      >19x,''*'')'
124       texte(1,6) =
125      >'(''*'',20x,''Tous les groupes sont elimines'',32x,''*'')'
126 c
127       texte(2,4) = '(''Number of families of '',a,'' :'',i8)'
128       texte(2,5) =
129      >'(''*'',20x,''Elimination of discrete boundary group(s)'',
130      >21x,''*'')'
131       texte(2,6) =
132      >'(''*'',20x,''All the groups are taken off'',34x,''*'')'
133 c
134 #include "impr03.h"
135 c
136  1000 format(/)
137  1001 format(84('*'))
138  1002 format('* ',a80,' *')
139 c
140       codret = 0
141 c
142 c 1.2. ==> A priori, aucune ligne voulue n'est acceptable
143 c
144       do 12 , iaux = 1 , nblign
145         linugr(iaux) = 0
146    12 continue
147 c
148 #ifdef _DEBUG_HOMARD_
149       write (ulsort,texte(langue,4)) mess14(langue,3,1), nbfseg
150       write (ulsort,90002) 'lgtabl', lgtabl
151       write (ulsort,93080) (nomgrl(iaux),iaux=1,lgtabl)
152 #endif
153 c
154 c====
155 c 2. on parcourt toutes les familles de mailles du maillage frontiere
156 c    pour reperer les groupes de la liste qui sont effectivement dans
157 c    le maillage frontiere
158 c====
159 c
160 cgn      write (ulsort,93080) (nomgrf(iaux),iaux=1,20)
161       do 20 , fam = 1, nbf
162 c
163         if ( codret.eq.0 ) then
164 c
165 #ifdef _DEBUG_HOMARD_
166         write (ulsort,90015) 'Famille ', fam, ', de numero', numfam(fam)
167 #endif
168 c
169 c 2.1. ==> la famille est-elle a traiter ?
170 c
171         do 21 , iaux = 1, nbfseg
172 c
173 cgn          write (ulsort,90112) 'lifami', iaux, lifami(iaux)
174           if ( numfam(fam).eq.lifami(iaux) ) then
175             goto 221
176           endif
177 c
178    21   continue
179 c
180         goto 20
181 c
182 c 2.2. ==> on parcourt tous les groupes entrant dans la
183 c          definition de cette famille
184 c
185   221   continue
186 c
187         nbgr = (pointf(fam)-pointf(fam-1))/10
188 c
189         do 22 , gr = 1, nbgr
190 c
191 c 2.2.1. ==> nom du groupe associe
192 c            adresse du debut du groupe numero gr de la famille fam
193 c
194           if ( codret.eq.0 ) then
195 c
196           iaux = pointf(fam-1)+1+10*(gr-1)
197 c
198 c         recuperation du nom du groupe numero gr dans la famille
199 c         numero fam
200           call uts8ch ( nomgrf(iaux), 80, groupf,
201      >                  ulsort, langue, codret )
202 c
203           endif
204 c
205           if ( codret.eq.0 ) then
206 c
207 c         longueur utile du nom du groupe
208           call utlgut ( lgngrf, groupf, ulsort, langue, codret )
209 c
210           endif
211 c
212 #ifdef _DEBUG_HOMARD_
213           write (ulsort,93020) 'groupf', groupf
214           write (ulsort,90002) 'lgngrf', lgngrf
215 #endif
216 c
217 c 2.2.2. ==> on cherche si le groupe est deja present dans la liste
218 c
219           do 222 , lig = 1 , nblign
220 c
221             if ( codret.eq.0 ) then
222 c         adresse du debut du groupe associe a la ligne lig
223             iaux = pointl(lig-1) + 1
224 c
225 c           recuperation du nom du groupe associe a la ligne lig
226             call uts8ch ( nomgrl(iaux), 80, groupl,
227      >                    ulsort, langue, codret )
228 c
229             endif
230 c
231             if ( codret.eq.0 ) then
232 c
233 c           longueur utile du nom du groupe
234             call utlgut ( lgngrl, groupl, ulsort, langue, codret )
235 c
236             endif
237 c
238 c ......... si le groupe de la ligne et le groupe dans la liste
239 c ......... coincident, on passe au groupe suivant dans la famille
240 c ......... on note ce groupe
241 c
242             if ( lgngrl.eq.lgngrf ) then
243 c
244               if ( groupl(1:lgngrl).eq.groupf(1:lgngrf) ) then
245                 linugr(lig) = 1
246                 goto 22
247               endif
248 c
249             endif
250 c
251   222     continue
252 c
253    22   continue
254 c
255         endif
256 c
257    20 continue
258 c
259 #ifdef _DEBUG_HOMARD_
260       write (ulsort,*) 'linugr'
261       write (ulsort,91020) (linugr(iaux),iaux=1,nblign)
262 #endif
263 c
264 c====
265 c 3. Si au moins un groupe de la liste n'est pas dans le maillage
266 c    frontiere, il faut recreer cette liste en eliminant ces groupes.
267 c====
268 c 3.1. ==> Decompte du nombre de groupes absents
269 #ifdef _DEBUG_HOMARD_
270       write (ulsort,90002) '3.1. Decompte ; codret', codret
271 #endif
272 c
273       if ( codret.eq.0 ) then
274 c
275       nblnew = nblign
276       do 31 , iaux = 1 , nblign
277         if ( linugr(iaux).eq.0 ) then
278           nblnew = nblnew - 1
279         endif
280    31 continue
281 c
282       endif
283 c
284 #ifdef _DEBUG_HOMARD_
285       write (ulsort,90002) 'nblnew', nblnew
286 #endif
287 c
288       if ( nblnew.lt.nblign ) then
289 c
290 c 3.2. ==> Allocation de la nouvelle structure
291 c
292         if ( codret.eq.0 ) then
293 c
294         iaux = 0
295         jaux = 0
296         kaux = nblign - jaux
297 #ifdef _DEBUG_HOMARD_
298       write (ulsort,texte(langue,3)) 'UTATPC', nompro
299 #endif
300         call utaptc ( ntrava, iaux, jaux,
301      >                kaux, lgtabl,
302      >                pointn, pttgrn, ptngrn,
303      >                ulsort, langue, codret )
304 c
305         endif
306 #ifdef _DEBUG_HOMARD_
307       call gmprsx (nompro,ntrava )
308 cgn      call gmprsx (nompro,ntrava//'.Pointeur' )
309 cgn      call gmprsx (nompro,ntrava//'.Table' )
310 cgn      call gmprsx (nompro,ntrava//'.Taille' )
311 #endif
312 c
313 c 3.3. ==> Remplissage de la nouvelle structure
314 c
315         write (ulsort,1000)
316         write (ulsort,1001)
317         write (ulsort,texte(langue,5))
318         write (ulsort,1001)
319 c
320         lgtnew = 0
321 c
322 c 3.3.1. ==> Tous les groupes sont absents
323 c
324         if ( nblnew.eq.0 ) then
325 c
326           write (ulsort,texte(langue,6))
327
328 c 3.3.2. ==> Au moins un groupe est absent, mais pas tous
329 c            On transfere les valeurs
330 c
331         else
332 c
333           nblnew = 0
334 c
335           if ( codret.eq.0 ) then
336 c
337           do 33 , lig = 1 , nblign
338 c
339             if ( codret.eq.0 ) then
340 c
341             if ( linugr(lig).ne.0 ) then
342 #ifdef _DEBUG_HOMARD_
343               write(ulsort,90002) 'Transfert ligne', lig
344 #endif
345 c
346               kaux = pointl(lig) - pointl(lig-1)
347 cgn              write(ulsort,*) 'kaux', kaux
348 c
349               nblnew = nblnew + 1
350               lgtnew = lgtnew + kaux
351               jaux = imem(pointn+nblnew-1)
352               imem(pointn+nblnew) = jaux + kaux
353 c
354               do 331 , iaux = 1, kaux
355                 imem(pttgrn+jaux-1+iaux) = taigrl(pointl(lig-1)+iaux)
356                 smem(ptngrn+jaux-1+iaux) = nomgrl(pointl(lig-1)+iaux)
357   331         continue
358 c
359             else
360 c
361 c         adresse du debut du groupe associe a la ligne lig
362               iaux = pointl(lig-1) + 1
363 c
364 c           recuperation du nom du groupe associe a la ligne lig
365               call uts8ch ( nomgrl(iaux), 80, groupl,
366      >                      ulsort, langue, codret )
367 c
368               write (ulsort,1002) groupl
369 c
370             endif
371 c
372             endif
373 c
374    33     continue
375 c
376           endif
377 c
378         endif
379 c
380         write (ulsort,1001)
381 c
382 c 3.4. ==> Ajustement des tailles de la structure
383 #ifdef _DEBUG_HOMARD_
384       write (ulsort,90002) '3.4. Ajustement ; codret', codret
385 #endif
386 c 3.4.1. ==> Ajustement de la structure
387 c
388         if ( codret.eq.0 ) then
389 c
390         jaux = 3
391 #ifdef _DEBUG_HOMARD_
392       write (ulsort,texte(langue,3)) 'UTATPC', nompro
393 #endif
394         call utaptc ( ntrava, iaux, jaux,
395      >                nblnew, lgtnew,
396      >                pointn, pttgrn, ptngrn,
397      >                ulsort, langue, codret )
398 c
399         endif
400 c
401 c 3.4.2. ==> Transfert
402 c
403         if ( codret.eq.0 ) then
404 c
405         call gmlboj ( ncafdg, codret )
406 c
407         endif
408 c
409         if ( codret.eq.0 ) then
410 c
411         ncafdg = ntrava
412 c
413 #ifdef _DEBUG_HOMARD_
414       call gmprsx (nompro,ncafdg )
415       call gmprsx (nompro,ncafdg//'.Pointeur' )
416       call gmprsx (nompro,ncafdg//'.Table' )
417       call gmprsx (nompro,ncafdg//'.Taille' )
418 #endif
419 c
420         endif
421 c
422       endif
423 c
424 c====
425 c 4. la fin
426 c====
427 c
428       if ( codret.ne.0 ) then
429 c
430 #include "envex2.h"
431 c
432       write (ulsort,texte(langue,1)) 'Sortie', nompro
433       write (ulsort,texte(langue,2)) codret
434 c
435       endif
436 c
437 #ifdef _DEBUG_HOMARD_
438       write (ulsort,texte(langue,1)) 'Sortie', nompro
439       call dmflsh (iaux)
440 #endif
441 c
442       end