1 subroutine pcs2h5 ( nbfop2, profho, vap2ho,
5 > lehexa, listso, listno,
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 aPres adaptation - Conversion de Solution -
30 c interpolation p2 sur les noeuds - decoupage Hexaedres - 5
32 c D'un milieu de face a un sommet (par face)
33 c ______________________________________________________________________
35 c . nom . e/s . taille . description .
36 c .____________________________________________________________________.
37 c . nbfop2 . e . 1 . nombre de fonctions P2 .
38 c . profho . es . * . pour chaque entite en numerotation homard :.
39 c . . . . 0 : l'entite est absente du profil .
40 c . . . . 1 : l'entite est presente dans le profil .
41 c . vap2ho . es . nbfop2*. variables p2 numerotation homard .
43 c . somare . e .2*nbarto. numeros des extremites d'arete .
44 c . np2are . e . nbarto . numero des noeuds p2 milieux d'aretes .
45 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
46 c . quahex . e .nbhecf*6. numeros des 6 quadrangles des hexaedres .
47 c . lehexa . e . 1 . hexaedre a traiter .
48 c . listso . e . 8 . liste des sommets de l'hexaedre .
49 c . listno . e . 12 . liste des noeuds de l'hexaedre .
50 c . areint . e . * . numeros globaux des aretes internes .
51 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
52 c . langue . e . 1 . langue des messages .
53 c . . . . 1 : francais, 2 : anglais .
54 c . codret . es . 1 . code de retour des modules .
55 c . . . . 0 : pas de probleme .
56 c . . . . 1 : probleme .
57 c ______________________________________________________________________
60 c 0. declarations et dimensionnement
63 c 0.1. ==> generalites
73 parameter ( nompro = 'PCS2H5' )
89 integer somare(2,nbarto), np2are(nbarto)
90 integer hetqua(nbquto)
91 integer quahex(nbhecf,6)
93 integer listso(8), listno(12)
96 double precision vap2ho(nbfop2,*)
98 integer ulsort, langue, codret
100 c 0.4. ==> variables locales
103 integer nuface, etahex
104 integer nusomm, laface, larete
107 integer iaux1, iaux2, iaux3, iaux4
110 parameter ( nbmess = 100 )
111 character*80 texte(nblang,nbmess)
114 c ______________________________________________________________________
118 cgn write (ulsort,texte(langue,1)) 'Entree', nompro
119 #ifdef _DEBUG_HOMARD_
120 write (ulsort,90002) 'listso', listso
121 write (ulsort,90002) 'listno 1-8', (listno(iaux),iaux=1,8)
122 write (ulsort,90002) 'listno 9-12', (listno(iaux),iaux=9,12)
126 c 0. Reperage de la face coupees
129 do 11 , nuface = 1 , 6
131 laface = quahex(lehexa,nuface)
132 if ( mod(hetqua(laface),100).eq.4 ) then
138 if ( etahex.lt.41 .or. etahex.gt.46 ) then
139 write(ulsort,*) 'Pb. Dans pcs2h5, etahex =',etahex
143 c On passe en revue tous les sommets
144 c Ils sont parcourus dans l'ordre des aretes a1, a2, a3 et a4 de
145 c la pyramide de base.
147 do 10 , nusomm = 1 , 4
148 cgn write(6,*) 'Dans pcs2h5, nusomm =',nusomm
151 c 1. Les 2 sommets les plus proches et les 2 les plus eloignes
153 c . L'un des sommets les plus proches est celui ou aboutit l'arete
154 c du noeud milieu a interpoler (iaux1)
155 c . L'autre sommet le plus proche est la 2nde extremite de l'arete
156 c de l'hexaedre qui relie ce sommet a la face coupee (iaux2)
157 c . Les sommets eloignes sont deduits par la regle :
158 c somme des numeros locaux de deux sommets opposes = 9
161 if ( etahex.eq.41 ) then
162 if ( nusomm.eq.1 ) then
165 elseif ( nusomm.eq.2 ) then
168 elseif ( nusomm.eq.3 ) then
175 elseif ( etahex.eq.42 ) then
176 if ( nusomm.eq.1 ) then
179 elseif ( nusomm.eq.2 ) then
182 elseif ( nusomm.eq.3 ) then
189 elseif ( etahex.eq.43 ) then
190 if ( nusomm.eq.1 ) then
193 elseif ( nusomm.eq.2 ) then
196 elseif ( nusomm.eq.3 ) then
203 elseif ( etahex.eq.44 ) then
204 if ( nusomm.eq.1 ) then
207 elseif ( nusomm.eq.2 ) then
210 elseif ( nusomm.eq.3 ) then
217 elseif ( etahex.eq.45 ) then
218 if ( nusomm.eq.1 ) then
221 elseif ( nusomm.eq.2 ) then
224 elseif ( nusomm.eq.3 ) then
232 if ( nusomm.eq.1 ) then
235 elseif ( nusomm.eq.2 ) then
238 elseif ( nusomm.eq.3 ) then
247 listns(1) = listso(iaux1)
248 listns(2) = listso(iaux2)
249 listns(7) = listso(9-iaux1)
250 listns(8) = listso(9-iaux2)
253 c 2. Les sommets intermediaires
254 c Il suffit d'en noter 2 sur la meme arete de l'hexaedre, les deux
255 c autres sont deduits par la regle :
256 c somme des numeros locaux de deux sommets opposes = 9
259 if ( etahex.eq.41 ) then
260 if ( nusomm.eq.1 .or. nusomm.eq.3 ) then
267 elseif ( etahex.eq.42 ) then
268 if ( nusomm.eq.1 .or. nusomm.eq.3 ) then
275 elseif ( etahex.eq.43 .or. etahex.eq.44 ) then
276 if ( nusomm.eq.1 .or. nusomm.eq.3 ) then
283 elseif ( etahex.eq.45 ) then
284 if ( nusomm.eq.1 .or. nusomm.eq.3 ) then
292 if ( nusomm.eq.1 .or. nusomm.eq.3 ) then
301 listns(3) = listso(iaux1)
302 listns(4) = listso(iaux2)
303 listns(5) = listso(9-iaux1)
304 listns(6) = listso(9-iaux2)
307 c 3. Le noeud le plus proche, le plus eloigne et les 2 coplanaires
308 c dans un plan parallelle a la face coupee
310 c . Le noeud le plus proche est celui au milieu de l'arete
311 c de l'hexaedre qui relie ce sommet a la face coupee (iaux1)
312 c . Le noeud eloigne est deduit par la regle :
313 c somme des numeros locaux de deux noeuds opposes = 13
314 c . Le dernier noeud est deduit par la regle :
315 c somme des numeros locaux de deux noeuds opposes = 13
318 if ( etahex.eq.41 ) then
319 if ( nusomm.eq.1 ) then
322 elseif ( nusomm.eq.2 ) then
325 elseif ( nusomm.eq.3 ) then
332 elseif ( etahex.eq.42 ) then
333 if ( nusomm.eq.1 ) then
336 elseif ( nusomm.eq.2 ) then
339 elseif ( nusomm.eq.3 ) then
346 elseif ( etahex.eq.43 ) then
347 if ( nusomm.eq.1 ) then
350 elseif ( nusomm.eq.2 ) then
353 elseif ( nusomm.eq.3 ) then
360 elseif ( etahex.eq.44 ) then
361 if ( nusomm.eq.1 ) then
364 elseif ( nusomm.eq.2 ) then
367 elseif ( nusomm.eq.3 ) then
374 elseif ( etahex.eq.45 ) then
375 if ( nusomm.eq.1 ) then
378 elseif ( nusomm.eq.2 ) then
381 elseif ( nusomm.eq.3 ) then
389 if ( nusomm.eq.1 ) then
392 elseif ( nusomm.eq.2 ) then
395 elseif ( nusomm.eq.3 ) then
404 listns( 9) = listno(iaux1)
405 listns(20) = listno(13-iaux1)
406 listns(18) = listno(iaux2)
407 listns(19) = listno(13-iaux2)
410 c 4. Les 4 noeuds intermediaires les plus proches
411 c et les 4 noeuds intermediaires les plus eloignes
414 if ( etahex.eq.41 ) then
415 if ( nusomm.eq.1 ) then
420 elseif ( nusomm.eq.2 ) then
425 elseif ( nusomm.eq.3 ) then
436 elseif ( etahex.eq.42 ) then
437 if ( nusomm.eq.1 ) then
442 elseif ( nusomm.eq.2 ) then
447 elseif ( nusomm.eq.3 ) then
458 elseif ( etahex.eq.43 ) then
459 if ( nusomm.eq.1 ) then
464 elseif ( nusomm.eq.2 ) then
469 elseif ( nusomm.eq.3 ) then
480 elseif ( etahex.eq.44 ) then
481 if ( nusomm.eq.1 ) then
486 elseif ( nusomm.eq.2 ) then
491 elseif ( nusomm.eq.3 ) then
502 elseif ( etahex.eq.45 ) then
503 if ( nusomm.eq.1 ) then
508 elseif ( nusomm.eq.2 ) then
513 elseif ( nusomm.eq.3 ) then
525 if ( nusomm.eq.1 ) then
530 elseif ( nusomm.eq.2 ) then
535 elseif ( nusomm.eq.3 ) then
548 listns(10) = listno(iaux1)
549 listns(11) = listno(iaux2)
550 listns(12) = listno(iaux3)
551 listns(13) = listno(iaux4)
553 listns(14) = listno(13-iaux1)
554 listns(15) = listno(13-iaux2)
555 listns(16) = listno(13-iaux3)
556 listns(17) = listno(13-iaux4)
559 c 5. L'arete concernee : celle des aretes internes qui demarrent
560 c ou finissent sur le sommet en cours
563 cgn write (ulsort,90002) 'listns(1)', listns(1)
565 larete = areint(iaux)
566 if ( ( somare(1,larete).eq.listns(1) ) .or.
567 > ( somare(2,larete).eq.listns(1) ) ) then
572 write(ulsort,*) nompro//' - aucune arete interne ne correspond ?'
581 if ( codret.eq.0 ) then
583 cgn write (ulsort,90002) 'sm', sm
586 cgn write (ulsort,90002) 'listns 1- 8',(listns(jaux),jaux=1,8)
587 cgn write (ulsort,90002) 'listns 9-16',(listns(jaux),jaux=9,16)
588 cgn write (ulsort,90002) 'listns 17-20',(listns(jaux),jaux=17,20)
590 do 71, nuv = 1 , nbfop2
591 cgn do 711 , jaux =1 ,20
592 cgn write (ulsort,90014) listns(jaux), vap2ho(nuv,listns(jaux))
595 vap2ho(nuv,sm) = - nfstr2 * ( vap2ho(nuv,listns(1))
596 > + vap2ho(nuv,listns(2)) )
597 > - trssz * ( vap2ho(nuv,listns(3))
598 > + vap2ho(nuv,listns(4))
599 > + vap2ho(nuv,listns(5))
600 > + vap2ho(nuv,listns(6)) )
601 > - trstr2 * ( vap2ho(nuv,listns(7))
602 > + vap2ho(nuv,listns(8)) )
603 > + nessz * vap2ho(nuv,listns(9))
604 > + nfstr2 * ( vap2ho(nuv,listns(10))
605 > + vap2ho(nuv,listns(11))
606 > + vap2ho(nuv,listns(12))
607 > + vap2ho(nuv,listns(13)) )
608 > + trstr2 * ( vap2ho(nuv,listns(14))
609 > + vap2ho(nuv,listns(15))
610 > + vap2ho(nuv,listns(16))
611 > + vap2ho(nuv,listns(17)) )
612 > + trssz * ( vap2ho(nuv,listns(18))
613 > + vap2ho(nuv,listns(19)) )
614 > + unssz * vap2ho(nuv,listns(20))
616 cgn write (ulsort,*) 'vap2ho(nuv,',sm,') =',vap2ho(nuv,sm)
627 if ( codret.ne.0 ) then
631 write (ulsort,texte(langue,1)) 'Sortie', nompro
632 write (ulsort,texte(langue,2)) codret
636 #ifdef _DEBUG_HOMARD_
637 write (ulsort,texte(langue,1)) 'Sortie', nompro