Salome HOME
Homard executable
[modules/homard.git] / src / tool / Decision / deinzr.F
1       subroutine deinzr ( nbzord, cazord,
2      >                    coonoe, dimcst, coocst,
3      >                    somare, hetare,
4      >                    nozone, arsupp, arindi,
5      >                    ulsort, langue, codret )
6 c ______________________________________________________________________
7 c
8 c                             H O M A R D
9 c
10 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
11 c
12 c Version originale enregistree le 18 juin 1996 sous le numero 96036
13 c aupres des huissiers de justice Simart et Lavoir a Clamart
14 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
15 c aupres des huissiers de justice
16 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
17 c
18 c    HOMARD est une marque deposee d'Electricite de France
19 c
20 c Copyright EDF 1996
21 c Copyright EDF 1998
22 c Copyright EDF 2002
23 c Copyright EDF 2020
24 c ______________________________________________________________________
25 c
26 c traitement des DEcisions - INitialisation de l'indicateur
27 c                --          --
28 c                                defini par des Zones de Raffinement
29 c                                               -        -
30 c ______________________________________________________________________
31 c .        .     .        .                                            .
32 c .  nom   . e/s . taille .           description                      .
33 c .____________________________________________________________________.
34 c . nbzord . e   .    1   . nombre de zones a raffiner/deraffiner      .
35 c . cazord . e   .  20 *  . caracteristiques zone a raffiner/deraffiner.
36 c .        .     . nbzord . 1 : >0 si a raffiner, <0 si a deraffiner   .
37 c .        .     .        . . si rectangle :                           .
38 c .        .     .        . 1 : +-1                                    .
39 c .        .     .        . de 2 a 5 : xmin, xmax, ymin, ymax          .
40 c .        .     .        . . si parallelepipede :                     .
41 c .        .     .        . 1 : +-2                                    .
42 c .        .     .        . de 2 a 7 : xmin, xmax, ymin, ymax          .
43 c .        .     .        .            zmin, zmax                      .
44 c .        .     .        . . si disque :                              .
45 c .        .     .        . 1 : +-3                                    .
46 c .        .     .        . de  8 a 10 : rayon, xcentr, ycentr         .
47 c .        .     .        . . si sphere :                              .
48 c .        .     .        . 1 : +-4                                    .
49 c .        .     .        . de  8 a 11 : rayon, xcentr, ycentr, zcentr .
50 c .        .     .        . . si cylindre :                            .
51 c .        .     .        . 1 : +-5                                    .
52 c .        .     .        . 8          : rayon                         .
53 c .        .     .        . de 12 a 14 : xaxe, yaxe, zaxe              .
54 c .        .     .        . de 15 a 17 : xbase, ybase, zbase           .
55 c .        .     .        . 18         : hauteur                       .
56 c .        .     .        . . si disque perce :                        .
57 c .        .     .        . 1 : +-6                                    .
58 c .        .     .        . de  9 a 10 : xcentr, ycentr                .
59 c .        .     .        . 19         : rayon interieur               .
60 c .        .     .        . 20         : rayon exterieur               .
61 c .        .     .        . . si tuyau :                               .
62 c .        .     .        . 1 : +-7                                    .
63 c .        .     .        . de 12 a 14 : xaxe, yaxe, zaxe              .
64 c .        .     .        . de 15 a 17 : xbase, ybase, zbase           .
65 c .        .     .        . 18         : hauteur                       .
66 c .        .     .        . 19         : rayon interieur               .
67 c .        .     .        . 20         : rayon exterieur               .
68 c . coonoe . e   . nbnoto . coordonnees des noeuds                     .
69 c . dimcst . e   .    1   . dimension de la coordonnee constante       .
70 c .        .     .        . eventuelle, 0 si toutes varient            .
71 c . coocst . e   .   11   . 1 : coordonnee constante eventuelle        .
72 c .        .     .        . 2, 3, 4 : xmin, ymin, zmin                 .
73 c .        .     .        . 5, 6, 7 : xmax, ymax, zmax                 .
74 c .        .     .        . 8, 9, 10 : -1 si constant, max-min sinon   .
75 c .        .     .        . 11 : max des (max-min)                     .
76 c . somare . e   .2*nbarto. numeros des extremites d'arete             .
77 c . hetare . e   . nbarto . historique de l'etat des aretes            .
78 c . nozone . aux . nbnoto . auxiliaire pour le transfert zone/noeud    .
79 c . arsupp .  s  . nbarto . support pour les aretes                    .
80 c . arindi .  s  . nbarto . valeurs entieres pour les aretes           .
81 c . ulsort . e   .   1    . numero d'unite logique de la liste standard.
82 c . langue . e   .    1   . langue des messages                        .
83 c .        .     .        . 1 : francais, 2 : anglais                  .
84 c . codret . es  .    1   . code de retour des modules                 .
85 c .        .     .        . 0 : pas de probleme                        .
86 c .        .     .        . 2 : probleme dans le traitement            .
87 c ______________________________________________________________________
88 c
89 c====
90 c 0. declarations et dimensionnement
91 c====
92 c
93 c 0.1. ==> generalites
94 c
95       implicit none
96       save
97 c
98       character*6 nompro
99       parameter ( nompro = 'DEINZR' )
100 c
101 #include "nblang.h"
102 c
103       integer nbmcle
104       parameter ( nbmcle = 20 )
105 c
106 c 0.2. ==> communs
107 c
108 #include "envex1.h"
109 c
110 #include "envca1.h"
111 #include "nombno.h"
112 #include "nombar.h"
113 c
114 c 0.3. ==> arguments
115 c
116       integer nbzord
117       integer somare(2,nbarto), hetare(nbarto)
118       integer dimcst
119       integer nozone(nbnoto)
120       integer arsupp(nbarto), arindi(nbarto)
121 c
122       double precision cazord(nbmcle,nbzord)
123       double precision coonoe(nbnoto,sdim)
124       double precision coocst(11)
125 c
126       integer ulsort, langue, codret
127 c
128 c 0.4. ==> variables locales
129 c
130       integer iaux
131 #ifdef _DEBUG_HOMARD_
132       integer jaux
133 #endif
134       integer nrzord, tyzord, tyzosg
135 c
136       character*8 saux08(nbmcle)
137 c
138       double precision daux
139       double precision rext2, rint2
140 c
141       logical afaire
142       logical mccod2(nbmcle)
143 c
144       integer nbmess
145       parameter (nbmess = 20 )
146       character*80 texte(nblang,nbmess)
147 c
148       character*13 messag(nblang,8)
149 c
150 c 0.5. ==> initialisations
151 c
152 #ifdef _DEBUG_HOMARD_
153       character*1 saux01(3)
154       data saux01 / 'X', 'Y', 'Z' /
155 #endif
156 c ______________________________________________________________________
157 c
158 c====
159 c 1. initialisation
160 c====
161 c
162 #include "impr01.h"
163 c
164 #ifdef _DEBUG_HOMARD_
165       write (ulsort,texte(langue,1)) 'Entree', nompro
166       call dmflsh (iaux)
167 #endif
168 c
169       texte(1,4) = '(''Nombre de zones a raffiner :'',i8)'
170       texte(1,5) = '(/,7x,''Zone de raffinement numero'',i3)'
171       texte(1,6) = '(/,7x,''Zone de deraffinement numero'',i3)'
172       texte(1,7) = '(10x,''Type de la zone : '',a)'
173       texte(1,8) = '(10x,''Forme de zone inconnue :'',g15.7)'
174       texte(1,9) = '(''Prise en compte du noeud '',i10,3g15.7)'
175 c
176       texte(2,4) = '(''Number of zones to refine :'',i8)'
177       texte(2,5) = '(/,7x,''Refinement zone #'',i3)'
178       texte(2,6) = '(/,7x,''Unrefinement zone #'',i3)'
179       texte(2,7) = '(10x,''Type of zone : '',a)'
180       texte(2,8) = '(10x,''Unknown zone shape :'',g15.7)'
181       texte(2,9) = '(''OK for node # '',i10,3g15.7)'
182 c
183 c                    1234567890123
184       messag(1,1) = 'Rectangle    '
185       messag(1,2) = 'Parallepipede'
186       messag(1,3) = 'Disque       '
187       messag(1,4) = 'Sphere       '
188       messag(1,5) = 'Cylindre     '
189       messag(1,6) = 'Disque perce '
190       messag(1,7) = 'Tuyau        '
191 c
192       messag(2,1) = 'Rectangle    '
193       messag(2,2) = 'Parallepiped '
194       messag(2,3) = 'Disk         '
195       messag(2,4) = 'Sphere       '
196       messag(2,5) = 'Cylindre     '
197       messag(2,6) = 'Disk         '
198       messag(2,7) = 'Pipe         '
199 c
200 #ifdef _DEBUG_HOMARD_
201       write (ulsort,texte(langue,4)) nbzord
202       write (ulsort,90002) 'nbnoto', nbnoto
203       write (ulsort,90002) 'sdim  ', sdim
204       write (ulsort,90002) 'dimcst', dimcst
205       if ( dimcst.ne.0 ) then
206       write (ulsort,90104) saux01(dimcst)//' constant', coocst(dimcst+1)
207       endif
208 #endif
209 c
210 #include "impr03.h"
211 c
212 c====
213 c 2. les zones
214 c====
215 c 2.1. ==> verifications
216 c
217       codret = 0
218 c
219       if ( codret.eq.0 ) then
220 c
221       do 21 , nrzord = 1 , nbzord
222         if ( cazord(1,nrzord).gt.0.d0 ) then
223           tyzosg = 1
224         else
225           tyzosg = -1
226         endif
227         tyzord = nint(abs(cazord(1,nrzord)))
228         if ( tyzord.lt.1 .or. tyzord.gt.7 ) then
229           write (ulsort,texte(langue,5+(1-tyzosg)/2)) nrzord
230           write (ulsort,texte(langue,8)) cazord(1,nrzord)
231           codret = codret + 1
232         endif
233    21 continue
234 c
235       endif
236 c
237 c 2.2. ==> impressions
238 #ifdef _DEBUG_HOMARD_
239       write (ulsort,90002) '2.2. impressions ; codret', codret
240 #endif
241 c
242       if ( codret.eq.0 ) then
243 c
244       saux08( 2) = 'X min   '
245       saux08( 3) = 'X max   '
246       saux08( 4) = 'Y min   '
247       saux08( 5) = 'Y max   '
248       saux08( 6) = 'Z min   '
249       saux08( 7) = 'Z max   '
250       saux08( 8) = 'Rayon   '
251       saux08( 9) = 'X centre'
252       saux08(10) = 'Y centre'
253       saux08(11) = 'Z centre'
254       saux08(12) = 'X axe   '
255       saux08(13) = 'Y axe   '
256       saux08(14) = 'Z axe   '
257       saux08(15) = 'X base  '
258       saux08(16) = 'Y base  '
259       saux08(17) = 'Z base  '
260       saux08(18) = 'Hauteur '
261       saux08(19) = 'Rayon In'
262       saux08(20) = 'Rayon Ex'
263 c
264       do 22 , nrzord = 1 , nbzord
265 c
266         if ( cazord(1,nrzord).gt.0.d0 ) then
267           tyzosg = 1
268         else
269           tyzosg = -1
270         endif
271         tyzord = nint(abs(cazord(1,nrzord)))
272         write (ulsort,texte(langue,5+(1-tyzosg)/2)) nrzord
273         write (ulsort,texte(langue,7)) messag(langue,tyzord)
274 c
275         do 221 , iaux = 1 , nbmcle
276           mccod2(iaux) = .false.
277   221   continue
278 c
279         if ( tyzord.eq.1 ) then
280           do 2211 , iaux = 2 , 5
281             mccod2(iaux) = .true.
282  2211     continue
283         elseif ( tyzord.eq.2 ) then
284           do 2212 , iaux = 2 , 7
285             mccod2(iaux) = .true.
286  2212     continue
287         elseif ( tyzord.eq.3 ) then
288           do 2213 , iaux = 8 , 10
289             mccod2(iaux) = .true.
290  2213     continue
291         elseif ( tyzord.eq.4 ) then
292           do 2214 , iaux = 8 , 11
293             mccod2(iaux) = .true.
294  2214     continue
295         elseif ( tyzord.eq.5 ) then
296           mccod2(8) = .true.
297           do 2215 , iaux = 12 , 18
298             mccod2(iaux) = .true.
299  2215     continue
300         elseif ( tyzord.eq.6 ) then
301           mccod2(9) = .true.
302           mccod2(10) = .true.
303           mccod2(19) = .true.
304           mccod2(20) = .true.
305         else
306           do 2217 , iaux = 12 , 20
307             mccod2(iaux) = .true.
308  2217     continue
309         endif
310 c
311         do 222 , iaux = 2 , nbmcle
312           if ( mccod2(iaux) ) then
313             write (ulsort,90104) '                 '//saux08(iaux),
314      >                            cazord(iaux,nrzord)
315           endif
316   222   continue
317 c
318    22 continue
319 c
320       endif
321 c
322 c====
323 c 3. Creation d'un indicateur portant sur les aretes : une arete est a
324 c    decouper si et seulement si ses deux extremites sont dans la meme
325 c    zone.
326 c    On parcourt toutes les zones et on marque les noeuds qui sont
327 c    a l'interieur de la zone. Puis on note les aretes dont les noeuds
328 c    sont dans la zone.
329 c    Remarque : cet algorithme de decodage n'est pas hyper performant
330 c    si on a plusieurs zones. Mais c'est une maniere simple de gerer
331 c    les recouvrements de zones.
332 c    Remarque : attention a ne marquer que les aretes actives, comme si
333 c    on avait produit un veritable indicateur d'erreur
334 c
335 c    Exemple 1 :
336 c           |                |            |
337 c           |             ooo|oooo        |
338 c       ....|.............o..|...o........|...
339 c       .   |             o  |   o        |  .
340 c     ------A-------------o--B---o--------C-----
341 c       .   |             o  |   o        |  .
342 c       .   |             o  |   o        |  .
343 c       ....|.............o..|...o........|...
344 c           |             o  |   o        |
345 c           |             o  |   o        |
346 c     ------D-------------o--E---o--------F-----
347 c           |             o  |   o        |
348 c           |             ooo|oooo        |
349 c           |                |            |
350 c     La zone . contient les noeuds A, B et C :
351 c               ==> les aretes AB et BC sont a couper
352 c     La zone o contient les noeuds B et E :
353 c               ==> l'arete BE est a couper
354 c
355 c    Exemple 2 :
356 c           |                |            |
357 c           |                |            |
358 c       ....|................|............|...
359 c       .   |                |            |  .
360 c     ------A----------------B------------C-----
361 c       .   |                |           |  .
362 c       .   |             ooo|oooo        |  .
363 c       ....|.............o..|...o........|...
364 c           |             o  |   o        |
365 c           |             o  |   o        |
366 c     ------D-------------o--E---o--------F-----
367 c           |             o  |   o        |
368 c           |             ooo|oooo        |
369 c           |                |            |
370 c     La zone . contient les noeuds A, B et C :
371 c               ==> les aretes AB et BC sont a couper
372 c     La zone o contient le noeud E :
373 c               ==> aucune arete n'est a couper
374 c
375 c====
376 #ifdef _DEBUG_HOMARD_
377       write (ulsort,90002) '3. creation indicateur ; codret', codret
378 #endif
379 c
380       if ( codret.eq.0 ) then
381 c
382 cgn      print 1789,0,0.,cazord(2,2),cazord(3,2),cazord(4,2)
383 c
384 c 3.1. ==> A priori, on suppose qu'aucune arete n'est concernee
385 c
386       do 31 , iaux = 1, nbarto
387 c
388         arsupp(iaux) = 0
389         arindi(iaux) = 0
390 c
391    31 continue
392 c
393 c 3.2. ==> Exploration des differentes zones
394 c          Quand la zone a ete declaree 3D mais que l'espace est 2D,
395 c          on change de categorie
396 c
397       do 32 , nrzord = 1 , nbzord
398 c
399         if ( cazord(1,nrzord).gt.0.d0 ) then
400           tyzosg = 1
401         else
402           tyzosg = -1
403         endif
404         tyzord = nint(abs(cazord(1,nrzord)))
405 #ifdef _DEBUG_HOMARD_
406         write (ulsort,texte(langue,5+(1-tyzosg)/2)) nrzord
407         write (ulsort,texte(langue,7)) messag(langue,tyzord)
408 #endif
409 c
410 c 3.2.0. ==> A priori, aucun noeud n'est concerne
411 c
412         do 320 , iaux = 1, nbnoto
413           nozone(iaux) = 0
414   320   continue
415 c
416 c 3.2.1. ==> Filtrage sur une boite rectangulaire
417 c
418         if ( tyzord.eq.1 ) then
419 c
420           do 321 , iaux = 1, nbnoto
421 c
422 cgn            write(ulsort,90104) 'X',
423 cgn     >      coonoe(iaux,1), cazord(2,nrzord),cazord(3,nrzord)
424 cgn            write(ulsort,90104) 'Y',
425 cgn     >      coonoe(iaux,2), cazord(4,nrzord),cazord(5,nrzord)
426 cgn      write (ulsort,90014)iaux, (coonoe(iaux,jaux),jaux=1,sdim)
427             afaire = .true.
428             if ( coonoe(iaux,1).lt.cazord(2,nrzord) ) then
429               afaire = .false.
430             elseif ( coonoe(iaux,1).gt.cazord(3,nrzord) ) then
431               afaire = .false.
432             endif
433             if ( afaire .and. sdim.ge.2 ) then
434               if ( coonoe(iaux,2).lt.cazord(4,nrzord) ) then
435                 afaire = .false.
436               elseif ( coonoe(iaux,2).gt.cazord(5,nrzord) ) then
437                 afaire = .false.
438               endif
439             endif
440             if ( afaire ) then
441 #ifdef _DEBUG_HOMARD_
442               write(ulsort,texte(langue,9)) iaux,
443      >        (coonoe(iaux,jaux),jaux=1,sdim)
444 #endif
445               nozone(iaux) = tyzosg
446             endif
447 c
448   321     continue
449 c
450 c 3.2.2. ==> Filtrage sur une boite parallelepipedique
451 c
452         elseif ( tyzord.eq.2 ) then
453 c
454 #ifdef _DEBUG_HOMARD_
455       write (ulsort,texte(langue,3)) 'DEINZ0', nompro
456 #endif
457           call deinz0 ( tyzosg,
458      >                  cazord(2,nrzord), cazord(3,nrzord),
459      >                  cazord(4,nrzord), cazord(5,nrzord),
460      >                  cazord(6,nrzord), cazord(7,nrzord),
461      >                  coonoe, dimcst, coocst,
462      >                  nozone,
463      >                  ulsort, langue, codret )
464 c
465 c 3.2.3. ==> Filtrage sur une boite circulaire / circulaire percee
466 c
467         elseif ( tyzord.eq.3 .or. tyzord.eq.6 ) then
468 c
469           if ( tyzord.eq.3 ) then
470             rint2 = -1.d0
471             rext2 = cazord(8,nrzord)*cazord(8,nrzord)
472           else
473             rint2 = cazord(19,nrzord)*cazord(19,nrzord)
474             rext2 = cazord(20,nrzord)*cazord(20,nrzord)
475           endif
476 cgn      write (ulsort,90004) 'rext2', rext2
477 cgn      write (ulsort,90004) 'rint2', rint2
478 cgn      write (ulsort,90004) 'centre', cazord( 9,nrzord),cazord(10,nrzord)
479 c
480           do 323 , iaux = 1, nbnoto
481 c
482             daux =   ( coonoe(iaux,1)-cazord( 9,nrzord) )
483      >             * ( coonoe(iaux,1)-cazord( 9,nrzord) )
484             if ( sdim.ge.2 ) then
485               daux = daux
486      >             + ( coonoe(iaux,2)-cazord(10,nrzord) )
487      >             * ( coonoe(iaux,2)-cazord(10,nrzord) )
488             endif
489 cgn      write (ulsort,90014)iaux,(coonoe(iaux,jaux),jaux=1,sdim)
490 c
491             if ( daux.ge.rint2 .and. daux.le.rext2 ) then
492 #ifdef _DEBUG_HOMARD_
493               write(ulsort,texte(langue,9)) iaux,
494      >        (coonoe(iaux,jaux),jaux=1,sdim)
495 #endif
496               nozone(iaux) = tyzosg
497             endif
498 c
499   323     continue
500 c
501 c 3.2.4. ==> Filtrage sur une boite spherique
502 c
503         elseif ( tyzord.eq.4 ) then
504 c
505 #ifdef _DEBUG_HOMARD_
506       write (ulsort,texte(langue,3)) 'DEINZ1', nompro
507 #endif
508           call deinz1 ( tyzosg,
509      >                  cazord(8,nrzord),
510      >                  cazord(9,nrzord), cazord(10,nrzord),
511      >                  cazord(11,nrzord),
512      >                  coonoe, dimcst, coocst,
513      >                  nozone,
514      >                  ulsort, langue, codret )
515 c
516 c 3.2.5. ==> Filtrage sur une boite cylindrique/tuyau
517 c
518         elseif ( tyzord.eq.5 .or. tyzord.eq.7 ) then
519 c
520           if ( tyzord.eq.5 ) then
521             iaux = 8
522             daux = -1.d0
523           else
524             iaux = 20
525             daux = cazord(19,nrzord)
526           endif
527 #ifdef _DEBUG_HOMARD_
528       write (ulsort,texte(langue,3)) 'DEINZ2', nompro
529 #endif
530           call deinz2 ( tyzosg,
531      >                  cazord(iaux,nrzord), daux,
532      >                  cazord(18,nrzord),
533      >                  cazord(12,nrzord), cazord(13,nrzord),
534      >                  cazord(14,nrzord),
535      >                  cazord(15,nrzord), cazord(16,nrzord),
536      >                  cazord(17,nrzord),
537      >                  coonoe, dimcst, coocst,
538      >                  nozone,
539      >                  ulsort, langue, codret )
540 c
541         endif
542 c
543 c 3.2.9. ==> Transfert aux aretes
544 c
545 cgn      write(ulsort,4000) (iaux, nozone(iaux) , iaux = 1, nbnoto)
546         do 329 , iaux = 1, nbarto
547 c
548           if ( nozone(somare(1,iaux)).eq.tyzosg .and.
549      >         nozone(somare(2,iaux)).eq.tyzosg ) then
550 cgn            write (ulsort,*) 'arete ',iaux,
551 cgn     >      ' de ',somare(1,iaux),' a ',somare(2,iaux)
552             if ( mod(hetare(iaux),10).eq.0 ) then
553               arsupp(iaux) = 1
554               arindi(iaux) = tyzosg
555             endif
556           endif
557 c
558   329   continue
559 #ifdef _DEBUG_HOMARD_
560       write (ulsort,90002) 'fin de 32 ; codret', codret
561 #endif
562 c
563    32 continue
564 c
565       endif
566 c
567 c====
568 c 4. la fin
569 c====
570 c
571 cgn      write(ulsort,4000) (iaux, arindi(iaux) , iaux = 1, nbarto)
572 cgn 4000 format(5(i4,' :',i2))
573       if ( codret.ne.0 ) then
574 c
575 #include "envex2.h"
576       write (ulsort,texte(langue,1)) 'Sortie', nompro
577       write (ulsort,texte(langue,2)) codret
578 c
579       endif
580 c
581 #ifdef _DEBUG_HOMARD_
582       write (ulsort,texte(langue,1)) 'Sortie', nompro
583       call dmflsh (iaux)
584 #endif
585 c
586       end