1 subroutine pcfaat ( typcca,
2 > nhsupe, nhsups, nhqufa,
12 > ulsort, langue, codret )
13 c ______________________________________________________________________
17 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
19 c Version originale enregistree le 18 juin 1996 sous le numero 96036
20 c aupres des huissiers de justice Simart et Lavoir a Clamart
21 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
22 c aupres des huissiers de justice
23 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
25 c HOMARD est une marque deposee d'Electricite de France
31 c ______________________________________________________________________
33 c aPres adaptation - Conversion - FAmilles pour ATHENA
35 c ______________________________________________________________________
37 c . nom . e/s . taille . description .
38 c .____________________________________________________________________.
39 c . typcca . e . 1 . type du code de calcul .
40 c . nhsupe . es . char8 . informations supplementaires entieres .
41 c . nhsups . es . char8 . informations supplementaires caracteres 8 .
42 c . hetare . e . nbarto . historique de l'etat des aretes .
43 c . somare . e .2*nbarto. numeros des extremites d'arete .
44 c . nhqufa . e . char8 . nom de l'objet des familles de quadrangles .
45 c . hettri . e . nbtrto . historique de l'etat des triangles .
46 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
47 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
48 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
49 c . povoso . e .0:nbnoto. pointeur des voisins par noeud .
50 c . voisom . e . nvosom . aretes voisines de chaque noeud .
51 c . posifa . e .0:nbarto. pointeur sur tableau facare .
52 c . facare . e . nbfaar . liste des faces contenant une arete .
53 c . famare . e . nbarto . famille des aretes .
54 c . cfaare . e . nctfar*. codes des familles des aretes .
55 c . . . nbfare . 1 : famille MED .
56 c . . . . 2 : type de segment .
57 c . . . . 3 : orientation .
58 c . . . . 4 : famille d'orientation inverse .
59 c . . . . 5 : numero de ligne de frontiere .
60 c . . . . > 0 si concernee par le suivi de frontiere.
61 c . . . . <= 0 si non concernee .
62 c . . . . 6 : famille frontiere active/inactive .
63 c . . . . 7 : numero de surface de frontiere .
64 c . . . . + l : appartenance a l'equivalence l .
65 c . famtri . e . nbtrto . famille des triangles .
66 c . cfatri . e . nctftr*. codes des familles des triangles .
67 c . . . nbftri . 1 : famille MED .
68 c . . . . 2 : type de triangle .
69 c . . . . 3 : numero de surface de frontiere .
70 c . . . . 4 : famille des aretes internes apres raf.
71 c . . . . + l : appartenance a l'equivalence l .
72 c . famqua . es . nbquto . famille des quadrangles .
73 c . pcfaqu . es . 1 . adresse des codes des familles de quad. .
74 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
75 c . langue . e . 1 . langue des messages .
76 c . . . . 1 : francais, 2 : anglais .
77 c . codret . es . 1 . code de retour des modules .
78 c . . . . 0 : pas de probleme .
79 c . . . . 1 : probleme .
80 c ______________________________________________________________________
83 c 0. declarations et dimensionnement
86 c 0.1. ==> generalites
92 parameter ( nompro = 'PCFAAT' )
119 integer hetare(nbarto), somare(2,nbarto)
120 integer hettri(nbtrto), aretri(nbtrto,3)
121 integer hetqua(nbquto), arequa(nbquto,4)
122 integer perqua(nbquto), nivqua(nbquto)
123 integer povoso(0:nbnoto), voisom(*)
124 integer posifa(0:nbarto), facare(nbfaar)
126 integer famare(nbarto), cfaare(nctfar,nbfare)
127 integer famtri(nbtrto), cfatri(nctftr,nbftri)
128 integer famqua(nbquto)
131 character*8 nhsupe, nhsups, nhqufa
133 integer ulsort, langue, codret
135 c 0.4. ==> variables locales
139 integer codre1, codre2, codre3, codre4, codre5
141 integer ptrav1, ptrav2, ptrav3, ptrav4, ptrav5
142 integer ptra15, ptra16
143 integer ptrae3, ptrae4, ptrae9, ptras4, ptras5
144 integer adsue3, adsue4, adsue9, adsus4, adsus9
148 integer nattrc, nbattr, nbfold, nbfn00, nbfnew, nbfq00
150 character*8 ntrav1, ntrav2, ntrav3, ntrav4, ntrav5
151 character*8 ntra15, ntra16
152 character*8 ntrae3, ntrae4, ntrae9, ntras4, ntras9
155 parameter ( nbmess = 10 )
156 character*80 texte(nblang,nbmess)
158 c 0.5. ==> initialisations
159 c ______________________________________________________________________
169 #ifdef _DEBUG_HOMARD_
170 write (ulsort,texte(langue,1)) 'Entree', nompro
174 texte(1,4) = '(''Traitement specifique a ATHENA'')'
175 texte(1,5) = '(i6,'' blocs de '',a,/)'
176 texte(1,10) = '(''Type du code de calcul (typcca) :'',i5)'
178 texte(2,4) = '(''Specific treatment to ATHENA'')'
179 texte(2,5) = '(i6,'' blocks of '',a,/)'
180 texte(2,10) = '(''Type of calculation code (typcca) :'',i5)'
182 #ifdef _DEBUG_HOMARD_
183 write (ulsort,texte(langue,10)) typcca
186 if ( typcca.eq.16 ) then
190 write (ulsort,texte(langue,10)) typcca
191 write (ulsort,texte(langue,4))
197 c 2. tableaux de travail
199 #ifdef _DEBUG_HOMARD_
200 write (ulsort,*) '2. tableaux de travail ; codret = ', codret
203 if ( codret.eq.0 ) then
205 call gmalot ( ntrav1, 'entier ', nbquto, ptrav1, codre1 )
206 call gmalot ( ntrav2, 'entier ', nbnoto, ptrav2, codre2 )
207 call gmalot ( ntrav3, 'entier ', nbarto, ptrav3, codre3 )
208 iaux = nbquto + nbtrto + 1
209 call gmalot ( ntrav4, 'entier ', iaux, ptrav4, codre4 )
211 call gmalot ( ntrav5, 'entier ', iaux, ptrav5, codre5 )
213 codre0 = min ( codre1, codre2, codre3, codre4, codre5 )
214 codret = max ( abs(codre0), codret,
215 > codre1, codre2, codre3, codre4, codre5 )
217 call gmalot ( ntra15, 'entier ', nbarto, ptra15, codre1 )
218 call gmalot ( ntra16, 'entier ', nbarto, ptra16, codre2 )
220 codre0 = min ( codre1, codre2 )
221 codret = max ( abs(codre0), codret,
227 c 3. recherche des blocs
229 #ifdef _DEBUG_HOMARD_
230 write (ulsort,*) '3. recherche des blocs ; codret = ', codret
233 if ( codret.eq.0 ) then
235 c on examine toutes les faces
237 jaux = nbquto + nbtrto
238 do 42 , iaux = 0, jaux
239 imem(ptrav4+iaux) = 1
241 imem(ptrav4+nbquto) = 0
244 call utb11c ( nbblqu, iaux, imem(ptrav4),
252 > famqua, imem(pcfaqu),
253 > imem(ptrav1), imem(ptrav2), imem(ptrav3),
254 > imem(ptra15), imem(ptra16),
256 > jaux, ulsort, langue, codret )
258 #ifdef _DEBUG_HOMARD_
259 10000 format(3x,20i4)
260 10001 format(4x,80('-'))
261 write(ulsort,*) 'Fin etape 3 avec codret = ', codret
262 write(ulsort,texte(langue,5)) nbblqu, mess14(langue,3,4)
263 write(ulsort,10000) (iaux,iaux=1,min(20,nbquto))
265 write(ulsort,10000) (imem(ptrav5+iaux),iaux=0,min(20,nbquto-1))
266 write(ulsort,10000) (imem(pcfaqu+iaux),iaux=0,nctfqu*nbfqua-1)
267 write(ulsort,10000) (famqua(iaux),iaux=1,min(20,nbquto))
272 if ( codret.eq.0 ) then
274 call gmlboj ( ntrav2, codret )
279 c 4. Gestion des tableaux
282 #ifdef _DEBUG_HOMARD_
283 write (ulsort,*) '4. Gestion des tableaux ; codret = ', codret
288 c 4.1. ==> Description actuelle des attributs
290 c nhsupe//'.Tab3' : Pointeur dans la table des attributs
291 c nhsupe//'.Tab4' : Table des attributs
292 c nhsupe//'.Tab5' : Pointeur dans la table des groupes
293 c nhsupe//'.Tab6' : Taille des noms des groupes
294 c nhsupe//'.Tab9' : Numero des familles MED
295 c nhsups//'.Tab2' : Noms des groupes (char*80)
296 c nhsups//'.Tab4' : Noms des familles MED (char*64)
297 c nhsups//'.Tab9' : Descriptions des attributs (char*200)
299 #ifdef _DEBUG_HOMARD_
300 call gmprsx (nompro, nhsupe )
301 call gmprsx (nompro, nhsupe//'.Tab3' )
302 call gmprsx (nompro, nhsupe//'.Tab4' )
303 call gmprsx (nompro, nhsupe//'.Tab9' )
304 call gmprsx (nompro, nhsups )
305 call gmprsx (nompro, nhsups//'.Tab4' )
306 call gmprsx (nompro, nhsups//'.Tab9' )
309 if ( codret.eq.0 ) then
311 call gmadoj ( nhsupe//'.Tab3', adsue3, iaux, codre1 )
312 call gmadoj ( nhsupe//'.Tab4', adsue4, iaux, codre2 )
313 call gmadoj ( nhsupe//'.Tab9', adsue9, iaux, codre3 )
314 call gmadoj ( nhsups//'.Tab4', adsus4, iaux, codre4 )
315 call gmadoj ( nhsups//'.Tab9', adsus9, iaux, codre5 )
317 codre0 = min ( codre1, codre2, codre3, codre4, codre5 )
318 codret = max ( abs(codre0), codret,
319 > codre1, codre2, codre3, codre4, codre5 )
323 c 4.2. ==> Caracteristiques des familles MED
325 nbfn00 = nbblqu*nbfmed
328 if ( codret.eq.0 ) then
331 call gmalot ( ntrae3, 'entier ', iaux, ptrae3, codre1 )
332 iaux = nbattr * (nbfn00-1)
333 call gmalot ( ntrae4, 'entier ', iaux, ptrae4, codre2 )
334 call gmalot ( ntrae9, 'entier ', nbfn00, ptrae9, codre3 )
336 call gmalot ( ntras4, 'chaine ', iaux, ptras4, codre4 )
337 iaux = 25 * nbattr * (nbfn00-1)
338 call gmalot ( ntras9, 'chaine ', iaux, ptras5, codre5 )
340 codre0 = min ( codre1, codre2, codre3, codre4, codre5 )
341 codret = max ( abs(codre0), codret,
342 > codre1, codre2, codre3, codre4, codre5 )
344 call gmmod ( nhqufa//'.Codes', pcfaqu,
345 > nctfqu, nctfqu, nbfqua, nbfq00, codre1 )
346 iaux = nbfn00 * (nctfqu+3)
347 call gmalot ( ntrav2, 'entier ', iaux, ptrav2, codre2 )
349 codre0 = min ( codre1, codre2 )
350 codret = max ( abs(codre0), codret,
356 c 5. Creation des familles
359 #ifdef _DEBUG_HOMARD_
360 write (ulsort,*) '5. Creation des familles ; codret = ', codret
363 if ( codret.eq.0 ) then
365 #ifdef _DEBUG_HOMARD_
366 write (ulsort,texte(langue,3)) 'PCFAA1', nompro
369 call pcfaa1 ( nbblqu,
370 > nbattr, nbfold, nbfn00, nbfnew, nbfq00,
372 > famqua, imem(pcfaqu),
373 > imem(adsue3), imem(ptrae3),
374 > imem(adsue4), imem(ptrae4),
375 > imem(adsue9), imem(ptrae9),
376 > smem(adsus4), smem(ptras4),
377 > smem(adsus9), smem(ptras5),
378 > imem(ptrav5), imem(ptrav2),
379 > ulsort, langue, codret )
384 c 6. Gestion des tableaux
387 #ifdef _DEBUG_HOMARD_
388 write (ulsort,*) '6. Gestion des tableaux ; codret = ', codret
391 #ifdef _DEBUG_HOMARD_
392 call gmprsx (nompro, ntrae3 )
393 call gmprsx (nompro, ntrae4 )
394 call gmprsx (nompro, ntrae9 )
395 call gmprsx (nompro, ntras4 )
396 call gmprsx (nompro, ntras9 )
399 c 6.1. ==> Redimensionnement des tableaux lies aux attributs
401 if ( codret.eq.0 ) then
404 nattrc = nbattr*(nbfmed-1)
408 call gmmod ( ntrae3, ptrae3, iaux, jaux, un, un, codre1 )
409 call gmmod ( ntrae4, ptrae4,
410 > nbattr, nbattr, nbfn00-1, nbfmed-1, codre2 )
411 call gmmod ( ntrae9, ptrae9, nbfn00, nbfmed, un, un, codre3 )
413 call gmmod ( ntras4, ptras4, iaux, iaux, nbfn00, nbfmed, codre4 )
415 call gmmod ( ntras9, ptras5,
416 > iaux, iaux, nbfn00-1, nbfmed-1, codre5 )
417 call gmmod ( nhqufa//'.Codes', pcfaqu,
418 > nctfqu, nctfqu, nbfq00, nbfqua, codre6 )
420 codre0 = min ( codre1, codre2, codre3, codre4, codre5,
422 codret = max ( abs(codre0), codret,
423 > codre1, codre2, codre3, codre4, codre5,
426 #ifdef _DEBUG_HOMARD_
427 call gmprsx (nompro, ntrae3 )
428 call gmprsx (nompro, ntrae4 )
429 call gmprsx (nompro, ntrae9 )
430 call gmprsx (nompro, ntras4 )
431 call gmprsx (nompro, ntras9 )
436 c 6.2. ==> Remplacement dans la structure generale des tableaux
439 if ( codret.eq.0 ) then
441 call gmcpoj ( ntrae3, nhsupe//'.Tab3', codre1 )
442 call gmcpoj ( ntrae4, nhsupe//'.Tab4', codre2 )
443 call gmcpoj ( ntrae9, nhsupe//'.Tab9', codre3 )
444 call gmcpoj ( ntras4, nhsups//'.Tab4', codre4 )
445 call gmcpoj ( ntras9, nhsups//'.Tab9', codre5 )
447 codre0 = min ( codre1, codre2, codre3, codre4, codre5 )
448 codret = max ( abs(codre0), codret,
449 > codre1, codre2, codre3, codre4, codre5 )
451 call gmecat ( nhsupe, 3, nbfmed+1, codre1 )
452 call gmecat ( nhsupe, 4, nattrc, codre2 )
454 call gmecat ( nhsups, 9, iaux, codre3 )
455 call gmecat ( nhsupe, 9, nbfmed, codre4 )
457 call gmecat ( nhsups, 4, iaux, codre5 )
459 codre0 = min ( codre1, codre2, codre3, codre4, codre5 )
460 codret = max ( abs(codre0), codret,
461 > codre1, codre2, codre3, codre4, codre5 )
463 #ifdef _DEBUG_HOMARD_
464 call gmprsx (nompro, nhsupe )
465 call gmprsx (nompro, nhsupe//'.Tab3' )
466 call gmprsx (nompro, nhsupe//'.Tab4' )
467 call gmprsx (nompro, nhsupe//'.Tab9' )
468 call gmprsx (nompro, nhsups )
469 call gmprsx (nompro, nhsups//'.Tab4' )
470 call gmprsx (nompro, nhsups//'.Tab9' )
477 if ( codret.eq.0 ) then
479 call gmlboj ( ntrav1, codre1 )
480 call gmlboj ( ntrav2, codre2 )
481 call gmlboj ( ntrav3, codre3 )
482 call gmlboj ( ntrav4, codre4 )
483 call gmlboj ( ntrav5, codre5 )
485 codre0 = min ( codre1, codre2, codre3, codre4, codre5 )
486 codret = max ( abs(codre0), codret,
487 > codre1, codre2, codre3, codre4, codre5 )
489 call gmlboj ( ntra15, codre1 )
490 call gmlboj ( ntra16, codre2 )
492 codre0 = min ( codre1, codre2 )
493 codret = max ( abs(codre0), codret,
496 call gmlboj ( ntrae3, codre1 )
497 call gmlboj ( ntrae4, codre2 )
498 call gmlboj ( ntrae9, codre3 )
499 call gmlboj ( ntras4, codre4 )
500 call gmlboj ( ntras9, codre5 )
502 codre0 = min ( codre1, codre2, codre3, codre4, codre5 )
503 codret = max ( abs(codre0), codret,
504 > codre1, codre2, codre3, codre4, codre5 )
512 #ifdef _DEBUG_HOMARD_
513 70000 format(3x,20i4)
514 write(ulsort,*) 'Etape 7 avec codret = ', codret
515 write(ulsort,70000) (imem(pcfaqu+iaux),iaux=0,nctfqu*nbfqua-1)
516 write(ulsort,70000) (famqua(iaux),iaux=1,min(20,nbquto))
519 if ( codret.ne.0 ) then
523 write (ulsort,texte(langue,1)) 'Sortie', nompro
524 write (ulsort,texte(langue,2)) codret
528 #ifdef _DEBUG_HOMARD_
529 write (ulsort,texte(langue,1)) 'Sortie', nompro