Download poiext.eso

Back to the list

   1 : C POIEXT    SOURCE    GOUNAND   13/08/01    21:15:07     7810           
   2 : 
   3 : C  Sert a extraire un point d'un objet MAILLAGE
   4 : C  Novembre 1985 :
   5 : C    Extrait d'un objet tous les points appartenant a une DROIte ou a
   6 : C    un PLAN (possibilite de critere de distance)
   7 : C  Fevrier 1986 :
   8 : C    Extrait d'un objet tous les points appartenant a un CYLIndre, un
   9 : C    CONE, une SPHEre ou un TORE
  10 : C  09/2003 :
  11 : C    Introduction de la DIMEnsion 1. Ajout de la syntaxe pour creer un
  12 : C    point a partir de ses coordonnees. Inhibation d'options non compa-
  13 : C    tibles avec la dimension 1. Option PROC adapte au cas IDIM=1.
  14 : C    Ajout de tests sur le type d'element pour POINT Entier,
  15 : C    POINT INITIAL et POINT FINAL (conforme a la notice).
  16 : C  01/2004 :
  17 : C    Modifications des methodes de recherche des points appartenant a
  18 : C    une DROIte, un PLAN, un CYLIndre, un CONE. Methodes moins sensibles
  19 : C    aux imprecisions numeriques.
  20 : C  07/2013 GOUNAND
  21 : C    Les options INIT FINA et PROC détectent les maillages vides
  22 : C    en entrée et provoquent une erreur
  23 : C
  24 :       SUBROUTINE POIEXT
  25 : 
  26 :       IMPLICIT INTEGER(I-N)
  27 :       IMPLICIT REAL*8 (A-H,O-Z)
  28 : 
  29 : -INC CCOPTIO
  30 : -INC SMELEME
  31 : -INC SMLREEL
  32 : -INC SMCOORD
  33 : -INC CCGEOME
  34 : 
  35 : C-    DIMENSION XNORM(3)
  36 :       CHARACTER*4 MOT,IPRO
  37 :       CHARACTER*4 MCLE(9),MOTM(9),MOABS(1),MOTAV(2)
  38 :       SEGMENT INDIC(NBELEM)
  39 : 
  40 : C  COMMON de sauvegarde lors d'un appel par SYMTRI
  41 :       COMMON / CSYMTR / XNORM(3)
  42 : 
  43 :       DATA MCLE / 'INIT','FINA','PROC',
  44 :      .     'DROI','PLAN','CYLI','CONE','SPHE','TORE' /
  45 :       DATA MOTM / 'MAXI','MINI','SUPE','EGSU','EGAL','EGIN','INFE',
  46 :      .     'DIFF','COMP' /
  47 :       DATA MOTAV / 'AVEC','SANS' /
  48 :       DATA MOABS / 'ABS ' /
  49 : 
  49 :       CALL LIRMOT(MOTM,9,IMM,0)
  50 :       IF (IMM.EQ.0) THEN
  51 :          idimp1=IDIM+1
  51 :          CALL LIRMOT(MCLE(4),6,IMC,0)
  52 :          IF (IMC.EQ.0) THEN
  52 :             CALL LIROBJ('MAILLAGE',MELEME,0,IRetou)
  53 :             IF (IERR.NE.0) RETURN
  54 : C  Operateur POINT - syntaxe 1 :
  55 : C -------------------------------
  56 : C  Creation du POINT1 a partir des IDIM coordonnees fournies.
  57 : C  Pour IDIM = 1, seul moyen de creer un point.
  58 : C    Point1 = POINT Val1 (Val2) (Val3) ;
  59 :             IF (IRetou.EQ.0) THEN
  59 :                CALL LIROBJ('LISTREEL',MLREEL,0,IRETOU)
  60 :                IF (IRETOU.NE.0) THEN
  61 :                   SEGACT MLREEL
  62 :                   NR=PROG(/1)
  63 :                   SEGACT MCOORD*MOD
  64 :                   NbPts=1+(XCOOR(/1)/idimp1)
  65 :                   SEGADJ MCOORD
  66 :                   IRef=(NbPts-1)*idimp1
  67 :                   DO IIDIM=1,IDIM
  68 :                      IF (IIDIM.LE.NR) THEN 
  69 :                         XVAL=PROG(IIDIM)
  70 :                      ELSE 
  71 :                         XVAL=0.D0
  72 :                      ENDIF
  73 :                      XCOOR(IRef+IIDIM)=XVAL
  74 :                   ENDDO
  75 :                   SEGDES MLREEL
  76 :                ELSE
  76 :                   CALL MESLIR(-149)
  76 :                   CALL LIRREE(Val1,1,IRetou)
  76 :                   CALL MESLIR(-150)
  77 :                   IF (IDIM.EQ.2) THEN
  77 :                      CALL LIRREE(Val2,1,IRetou)
  78 :                   ELSE IF (IDIM.EQ.3) THEN
  78 :                      CALL LIRREE(Val2,1,IRetou)
  79 :                      IF (IERR.NE.0) RETURN
  79 :                      CALL MESLIR(-151)
  79 :                      CALL LIRREE(Val3,1,IRetou)
  80 :                   ENDIF
  81 :                   IF (IERR.NE.0) RETURN
  82 :                   SEGACT MCOORD*MOD
  83 :                   NbPts=1+(XCOOR(/1)/idimp1)
  84 :                   SEGADJ MCOORD
  85 :                   IRef=(NbPts-1)*idimp1
  86 :                   XCOOR(IRef+1)=Val1
  87 :                   IF (IDIM.EQ.2) THEN
  88 :                      XCOOR(IRef+2)=Val2
  89 :                   ELSE IF (IDIM.EQ.3) THEN
  90 :                      XCOOR(IRef+2)=Val2
  91 :                      XCOOR(IRef+3)=Val3
  92 :                   ENDIF
  93 :                ENDIF
  94 :                XCOOR(IRef+idimp1)=DENSIT
  94 :                CALL ECROBJ('POINT   ',NbPts)
  95 :                RETURN
  96 : C  Operateur POINT - syntaxe 2 :
  97 : C -------------------------------
  98 : C  1) Recuperation du POINT1 du maillage GEO1 par son numero
  99 : C       Point1 = POINT Geo1 Entier1 ;
 100 : C     Note : le maillage est constitue uniquement de POI1 ou SEG2.
 101 : C  2) Recuperation du point INITIAL ou FINAL du maillage GEO1
 102 : C       Point1 = POINT Geo1 'INITIAL' | 'FINAL' ;
 103 : C     Note : le maillage est constitue uniquement de POI1, SEG2 ou SEG3.
 104 : C  3) Recuperation du POINT1 du maillage GEO1 le plus proche du POINT2.
 105 : C       Point1 = POINT Geo1 'PROC' Point2 ;
 106 :             ELSE
 107 : C  Lecture facultative d'un entier (numero du point a trouver)
 107 :                CALL LIRENT(JPTR,0,IRetou)
 108 :                IF (IRetou.NE.0) THEN
 109 :                   IF (JPTR.LE.0) THEN
 109 :                      CALL ERREUR(262)
 110 :                      RETURN
 111 :                   ENDIF
 112 :                   MOT='    '
 113 :                   IPRO='    '
 114 :                ELSE
 115 : C  Lecture d'un des mots cles ('INIT','FINA','PROC')
 115 :                   CALL LIRCHA(MOT,0,IRetou)
 116 :                   IF (IRetou.EQ.0) THEN
 117 : C  Le type de l'operande est incorrect
 117 :                      CALL QUETYP(MOTERR(1:8),0,IRetou)
 118 :                      IF (IRetou.NE.0) THEN
 118 :                         CALL ERREUR (39)
 119 :                      ELSE
 119 :                         CALL ERREUR(533)
 120 :                      ENDIF
 121 :                      RETURN
 122 :                   ENDIF
 123 : C  Recuperation du numero du point INIT ou FINA
 124 :                   IF ((MOT.EQ.MCLE(1)).OR.(MOT.EQ.MCLE(2))) THEN
 125 :                      IPRO='    '
 126 :                   ELSE IF (MOT.EQ.MCLE(3)) THEN
 127 :                      IPRO=MOT
 128 :                   ELSE
 128 :                      CALL ERREUR(7)
 129 :                      RETURN
 130 :                   ENDIF
 131 :                ENDIF
 132 :                SEGACT MELEME
 133 : C  Traitement des syntaxes POINT Geo1 Entier1 | 'INIT' | 'FINA'
 134 :                IF (IPRO.EQ.'    ') THEN
 135 : C  Erreur si objet maillage complexe
 136 :                   IF (LISOUS(/1).NE.0) THEN
 136 :                      CALL ERREUR(25)
 137 :                      SEGDES MELEME
 138 :                      RETURN
 139 :                   ENDIF
 140 :                   IF (NUM(/1).LE.0.OR.NUM(/2).LE.0) THEN
 141 :                      MOTERR(1:8)='MAILLAGE'
 142 : C Une donnée de type %m1:8 est vide
 142 :                      CALL ERREUR(1027)
 143 :                      SEGDES MELEME
 144 :                      RETURN
 145 :                   ENDIF
 146 : C                     
 147 : C  Erreur si objet maillage n'est pas de type POI1,SEG2,SEG3
 148 : Cde           IF ((ITYPEL.NE.1).AND.(ITYPEL.NE.2).AND.
 149 : Cde  .            (ITYPEL.NE.3)) THEN
 149 : Cde             CALL ERREUR(16)
 150 : Cde             SEGDES MELEME
 151 : Cde             RETURN
 152 : Cde           ENDIF
 153 :                   IF (MOT.EQ.'    ') THEN
 154 : Cde             IF (ITYPEL.EQ.3) THEN
 154 : Cde               CALL ERREUR(16)
 155 : Cde               SEGDES MELEME
 156 : Cde               RETURN
 157 : Cde             ENDIF
 158 : Cde             IF ((ITYPEL.EQ.2).AND.(JPTR.EQ.(NUM(/2)+1))) THEN
 159 :                      IF ((ITYPEL.NE.1).AND.(JPTR.EQ.(NUM(/2)+1))) THEN
 160 :                         IPTR=NUM(/1)
 161 :                         JPTR=NUM(/2)
 162 :                      ELSE
 163 :                         IPTR=1
 164 :                      ENDIF
 165 :                      IF (JPTR.GT.NUM(/2)) THEN
 165 :                         CALL ERREUR(262)
 166 :                         SEGDES MELEME
 167 :                         RETURN
 168 :                      ENDIF
 169 :                   ELSE IF (MOT.EQ.MCLE(1)) THEN
 170 :                      IPTR=1
 171 :                      JPTR=1
 172 :                   ELSE IF (MOT.EQ.MCLE(2)) THEN
 173 :                      IPTR=NUM(/1)
 174 :                      JPTR=NUM(/2)
 175 :                   ENDIF
 176 :                   IPoin=NUM(IPTR,JPTR)
 176 :                   CALL ECROBJ('POINT ',IPoin)
 177 :                   SEGDES MELEME
 178 :                   RETURN
 179 :                ELSE
 180 : C  Traitement de l'option PROC
 180 :                   CALL LIROBJ('POINT ',IPoin1,1,IRetou)
 181 :                   IF (IERR.NE.0) THEN
 182 :                      SEGDES MELEME
 183 :                      RETURN
 184 :                   ENDIF
 185 :                   Val1=1.E30
 186 :                   IRef=(IPoin1-1)*idimp1
 187 :                   XP1=XCOOR(IRef+1)
 188 :                   YP1=XCOOR(IRef+2)
 189 :                   ZP1=0.D0
 190 :                   IF (IDIM.GE.3) ZP1=XCOOR(IRef+3)
 191 :                   IPT1=MELEME
 192 :                   Ipoin=0
 193 :                   DO IOB=1,MAX(1,LISOUS(/1))
 194 :                      IF (LISOUS(/1).NE.0) THEN
 195 :                         IPT1=LISOUS(IOB)
 196 :                         SEGACT IPT1
 197 :                      ENDIF
 198 :                      DO i=1,IPT1.NUM(/2)
 199 :                         DO j=1,IPT1.NUM(/1)
 200 :                            IRef=(IPT1.NUM(j,i)-1)*idimp1
 201 :                            IF (IDIM.EQ.1) THEN
 202 :                               DVN=ABS(XP1-XCOOR(IRef+1))
 203 :                            ELSE
 204 :                               XVN=XP1-XCOOR(IRef+1)
 205 :                               YVN=YP1-XCOOR(IRef+2)
 206 :                               ZVN=0.D0
 207 :                               IF (IDIM.GE.3) ZVN=ZP1-XCOOR(IRef+3)
 208 :                               DVN=XVN*XVN+YVN*YVN+ZVN*ZVN
 209 :                            ENDIF
 210 :                            IF (DVN.LE.Val1) THEN
 211 :                               Val1=DVN
 212 :                               IPoin=IPT1.NUM(j,i)
 213 :                            ENDIF
 214 :                         ENDDO
 215 :                      ENDDO
 216 :                      IF (LISOUS(/1).NE.0) SEGDES IPT1
 217 :                   ENDDO
 218 :                   IF (IPoin.EQ.0) THEN
 219 :                      MOTERR(1:8)='MAILLAGE'
 220 : C Une donnée de type %m1:8 est vide
 220 :                      CALL ERREUR(1027)
 221 :                   ELSE
 221 :                      IF (IERR.EQ.0) CALL ECROBJ('POINT ',IPoin)
 222 :                   ENDIF
 223 :                   SEGDES MELEME
 224 :                   RETURN
 225 :                ENDIF
 226 :             ENDIF
 227 :          ELSE
 228 : C  Operateur POINT - syntaxe 2 :
 229 : C -------------------------------
 230 : C  Extraction du(des) point(s) du maillage GEO1 situe(s) sur une
 231 : C  DROIte, un PLAN, un CYLIndre, un CONE, une SPHEre ou un TORE.
 232 : C  L'appartenance du point a l'objet est definie suivant un critere
 233 : C  de distance non nul (appartenance stricte : critere tres faible).
 234 : C    Geof = POINT Geo1 MOT1 Points ... (Critere)
 235 : C  En dimension 1, ces criteres n'ont aucun sens.
 236 :             IF (IDIM.EQ.1) THEN
 237 :                MOTERR(1:4)=MCLE(3+IMC)
 238 :                INTERR(1)=IDIM
 238 :                CALL ERREUR(971)
 239 :                RETURN
 240 :             ENDIF
 241 : C  Lectures obligatoire du maillage et facultative du critere
 241 :             CALL LIROBJ('MAILLAGE',MELEME,1,IRetou)
 242 :             IF (IERR.NE.0) RETURN
 243 :             CRIT=DENSIT/10.D0
 243 :             CALL LIRREE(CRIT,0,IRetou)
 243 :             IF (CRIT.LE.0.D0) CALL ERREUR(17)
 244 :             IF (IERR.NE.0) RETURN
 245 : C  Transformation du maillage en 'POI1'
 246 :             SEGACT MELEME
 246 :             CALL CHANGE(MELEME,1)
 247 :             SEGACT MELEME
 248 :             NBELEM=NUM(/2)
 249 : C  Intersection du maillage avec une DROIte
 250 : C --------------------------
 251 :             IF (IMC.EQ.1) THEN
 251 :                CALL LIROBJ('POINT ',IPoin1,1,IRetou)
 251 :                CALL LIROBJ('POINT ',IPoin2,1,IRetou)
 252 :                IF (IERR.NE.0) THEN
 253 :                   SEGDES MELEME
 254 :                   RETURN
 255 :                ENDIF
 256 : C  Recherche du vecteur directeur de la DROIte
 257 :                IRef1=(IPoin1-1)*idimp1
 258 :                IRef2=(IPoin2-1)*idimp1
 259 :                XP1=XCOOR(IRef1+1)
 260 :                XVN=XCOOR(IRef2+1)-XP1
 261 :                YP1=XCOOR(IRef1+2)
 262 :                YVN=XCOOR(IRef2+2)-YP1
 263 :                ZP1=0.D0
 264 :                ZVN=0.D0
 265 :                IF (IDIM.GE.3) THEN
 266 :                   ZP1=XCOOR(IRef1+3)
 267 :                   ZVN=XCOOR(IRef2+3)-ZP1
 268 :                ENDIF
 269 :                DVN=SQRT(XVN*XVN+YVN*YVN+ZVN*ZVN)
 270 :                IF (DVN.EQ.0.D0) THEN
 270 :                   CALL ERREUR(21)
 271 :                   SEGDES MELEME
 272 :                   RETURN
 273 :                ENDIF
 274 :                XVN=XVN/DVN
 275 :                YVN=YVN/DVN
 276 :                ZVN=ZVN/DVN
 277 :                XNORM(1)=XVN
 278 :                XNORM(2)=YVN
 279 :                XNORM(3)=ZVN
 280 : C  Recherche des points verifiant la condition d'appartenance (INDIC)
 281 :                CRIT=CRIT*CRIT
 282 :                SEGINI INDIC
 283 :                NBON=0
 284 :                DO IP=1,NBELEM
 285 :                   IPoin=NUM(1,IP)
 286 :                   IRef=(IPoin-1)*idimp1
 287 :                   XPT=XCOOR(IRef+1)-XP1
 288 :                   YPT=XCOOR(IRef+2)-YP1
 289 :                   ZPT=0.D0
 290 :                   IF (IDIM.GE.3) ZPT=XCOOR(IRef+3)-ZP1
 291 :                   SCAL=XPT*XVN+YPT*YVN+ZPT*ZVN
 292 :                   XV=SCAL*XVN-XPT
 293 :                   YV=SCAL*YVN-YPT
 294 :                   ZV=SCAL*ZVN-ZPT
 295 :                   Val1=XV*XV+YV*YV+ZV*ZV
 296 :                   IF (Val1.LE.CRIT) THEN
 297 :                      INDIC(IP)=IPoin
 298 :                      NBON=NBON+1
 299 :                   ENDIF
 300 :                ENDDO
 301 : C  Intersection du maillage avec un PLAN
 302 : C --------------------------
 303 :             ELSE IF (IMC.EQ.2) THEN
 303 :                CALL LIROBJ('POINT ',IPoin1,1,IRetou)
 303 :                CALL LIROBJ('POINT ',IPoin2,1,IRetou)
 303 :                CALL LIROBJ('POINT ',IPoin3,1,IRetou)
 304 :                IF (IERR.NE.0) THEN
 305 :                   SEGDES MELEME
 306 :                   RETURN
 307 :                ENDIF
 308 : C  Determination du vecteur normal au PLAN
 309 :                IRef1=(IPoin1-1)*idimp1
 310 :                IRef2=(IPoin2-1)*idimp1
 311 :                IRef3=(IPoin3-1)*idimp1
 312 :                XP1=XCOOR(IRef1+1)
 313 :                XP2=XCOOR(IRef2+1)
 314 :                XP3=XCOOR(IRef3+1)
 315 :                YP1=XCOOR(IRef1+2)
 316 :                YP2=XCOOR(IRef2+2)
 317 :                YP3=XCOOR(IRef3+2)
 318 :                ZP1=0.D0
 319 :                ZP2=0.D0
 320 :                ZP3=0.D0
 321 :                IF (IDIM.GE.3) THEN
 322 :                   ZP1=XCOOR(IRef1+3)
 323 :                   ZP2=XCOOR(IRef2+3)
 324 :                   ZP3=XCOOR(IRef3+3)
 325 :                ENDIF
 326 :                XVN=(YP2-YP1)*(ZP3-ZP1)-(ZP2-ZP1)*(YP3-YP1)
 327 :                YVN=(ZP2-ZP1)*(XP3-XP1)-(XP2-XP1)*(ZP3-ZP1)
 328 :                ZVN=(XP2-XP1)*(YP3-YP1)-(YP2-YP1)*(XP3-XP1)
 329 :                DVN=SQRT(XVN*XVN+YVN*YVN+ZVN*ZVN)
 330 :                IF (DVN.EQ.0.D0) THEN
 330 :                   CALL ERREUR(21)
 331 :                   SEGDES MELEME
 332 :                   RETURN
 333 :                ENDIF
 334 :                XVN=XVN/DVN
 335 :                YVN=YVN/DVN
 336 :                ZVN=ZVN/DVN
 337 :                XNORM(1)=XVN
 338 :                XNORM(2)=YVN
 339 :                XNORM(3)=ZVN
 340 : C  Recherche des points verifiant la condition d'appartenance (INDIC)
 341 :                SEGINI INDIC
 342 :                NBON=0
 343 :                DO IP=1,NBELEM
 344 :                   IPoin=NUM(1,IP)
 345 :                   IRef=(IPoin-1)*idimp1
 346 :                   XV=XCOOR(IRef+1)-XP1
 347 :                   YV=XCOOR(IRef+2)-YP1
 348 :                   ZV=0.D0
 349 :                   IF (IDIM.GE.3) ZV=XCOOR(IRef+3)-ZP1
 350 :                   Val1=ABS(XV*XVN+YV*YVN+ZV*ZVN)
 351 :                   IF (Val1.LE.CRIT) THEN
 352 :                      INDIC(IP)=IPoin
 353 :                      NBON=NBON+1
 354 :                   ENDIF
 355 :                ENDDO
 356 : C  Intersection du maillage avec un CYLIndre
 357 : C --------------------------
 358 :             ELSE IF (IMC.EQ.3) THEN
 358 :                CALL LIROBJ('POINT ',IPoin1,1,IRetou)
 358 :                CALL LIROBJ('POINT ',IPoin2,1,IRetou)
 358 :                CALL LIROBJ('POINT ',IPoin3,1,IRetou)
 359 :                IF (IERR.NE.0) THEN
 360 :                   SEGDES MELEME
 361 :                   RETURN
 362 :                ENDIF
 363 :                IRef1=(IPoin1-1)*idimp1
 364 :                IRef2=(IPoin2-1)*idimp1
 365 :                IRef3=(IPoin3-1)*idimp1
 366 :                XP1=XCOOR(IRef1+1)
 367 :                XVN=XCOOR(IRef2+1)-XP1
 368 :                XPT=XCOOR(IRef3+1)-XP1
 369 :                YP1=XCOOR(IRef1+2)
 370 :                YVN=XCOOR(IRef2+2)-YP1
 371 :                YPT=XCOOR(IRef3+2)-YP1
 372 :                IF (IDIM.GE.3) THEN
 373 :                   ZP1=XCOOR(IRef1+3)
 374 :                   ZVN=XCOOR(IRef2+3)-ZP1
 375 :                   ZPT=XCOOR(IRef3+3)-ZP1
 376 :                ELSE
 377 :                   ZP1=0.D0
 378 :                   ZVN=0.D0
 379 :                   ZPT=0.D0
 380 :                ENDIF
 381 : C  Determination de l'axe du cylindre (axe P1-P2)
 382 :                DVN=SQRT(XVN*XVN+YVN*YVN+ZVN*ZVN)
 383 :                IF (DVN.EQ.0.D0) THEN
 383 :                   CALL ERREUR(21)
 384 :                   RETURN
 385 :                ENDIF
 386 :                XVN=XVN/DVN
 387 :                YVN=YVN/DVN
 388 :                ZVN=ZVN/DVN
 389 : C  Calcul du rayon du cylindre (distance P3 a axe P1-P2)
 390 :                SCAL=XPT*XVN+YPT*YVN+ZPT*ZVN
 391 :                XV=SCAL*XVN-XPT
 392 :                YV=SCAL*YVN-YPT
 393 :                ZV=SCAL*ZVN-ZPT
 394 :                Rayon=SQRT(XV*XV+YV*YV+ZV*ZV)
 395 :                IF (Rayon.EQ.0.D0) THEN
 395 :                   CALL ERREUR(21)
 396 :                   SEGDES MELEME
 397 :                   RETURN
 398 :                ENDIF
 399 : C  Recherche des points verifiant la condition d'appartenance (INDIC)
 400 :                SEGINI INDIC
 401 :                NBON=0
 402 :                DO IP=1,NBELEM
 403 :                   IPoin=NUM(1,IP)
 404 :                   IRef=(IPoin-1)*idimp1
 405 :                   XPT=XCOOR(IRef+1)-XP1
 406 :                   YPT=XCOOR(IRef+2)-YP1
 407 :                   ZPT=0.D0
 408 :                   IF (IDIM.GE.3) ZPT=XCOOR(IRef+3)-ZP1
 409 :                   SCAL=XPT*XVN+YPT*YVN+ZPT*ZVN
 410 :                   XV=SCAL*XVN-XPT
 411 :                   YV=SCAL*YVN-YPT
 412 :                   ZV=SCAL*ZVN-ZPT
 413 :                   Val1=SQRT(XV*XV+YV*YV+ZV*ZV)
 414 :                   IF (ABS(Val1-Rayon).LE.CRIT) THEN
 415 :                      INDIC(IP)=IPoin
 416 :                      NBON=NBON+1
 417 :                   ENDIF
 418 :                ENDDO
 419 : C  Intersection du maillage avec un CONE
 420 : C --------------------------
 421 :             ELSE IF (IMC.EQ.4) THEN
 421 :                CALL LIROBJ('POINT ',IPoin1,1,IRetou)
 421 :                CALL LIROBJ('POINT ',IPoin2,1,IRetou)
 421 :                CALL LIROBJ('POINT ',IPoin3,1,IRetou)
 422 :                IF (IERR.NE.0) THEN
 423 :                   SEGDES MELEME
 424 :                   RETURN
 425 :                ENDIF
 426 :                IRef1=(IPoin1-1)*idimp1
 427 :                IRef2=(IPoin2-1)*idimp1
 428 :                IRef3=(IPoin3-1)*idimp1
 429 :                XP1=XCOOR(IRef1+1)
 430 :                XVN=XCOOR(IRef2+1)-XP1
 431 :                XV=XCOOR(IRef3+1)-XP1
 432 :                YP1=XCOOR(IRef1+2)
 433 :                YVN=XCOOR(IRef2+2)-YP1
 434 :                YV=XCOOR(IRef3+2)-YP1
 435 :                IF (IDIM.GE.3) THEN
 436 :                   ZP1=XCOOR(IRef1+3)
 437 :                   ZVN=XCOOR(IRef2+3)-ZP1
 438 :                   ZV=XCOOR(IRef3+3)-ZP1
 439 :                ELSE
 440 :                   ZP1=0.D0
 441 :                   ZVN=0.D0
 442 :                   ZV=0.D0
 443 :                ENDIF
 444 : C  Recherche du vecteur directeur de l'axe du cone
 445 :                DVN=SQRT(XVN*XVN+YVN*YVN+ZVN*ZVN)
 446 :                IF (DVN.EQ.0.D0) THEN
 446 :                   CALL ERREUR(21)
 447 :                   SEGDES MELEME
 448 :                   RETURN
 449 :                ENDIF
 450 :                XVN=XVN/DVN
 451 :                YVN=YVN/DVN
 452 :                ZVN=ZVN/DVN
 453 : C  Calcul de l'angle au sommet du cone
 454 :                Val1=XV*XV+YV*YV+ZV*ZV
 455 :                IF (Val1.EQ.0.D0) THEN
 455 :                   CALL ERREUR(21)
 456 :                   SEGDES MELEME
 457 :                   RETURN
 458 :                ENDIF
 459 :                SCAL=XV*XVN+YV*YVN+ZV*ZVN
 460 :                XPT=SCAL*XVN-XV
 461 :                YPT=SCAL*YVN-YV
 462 :                ZPT=SCAL*ZVN-ZV
 463 :                SISOM=SQRT((XPT*XPT+YPT*YPT+ZPT*ZPT)/Val1)
 464 : C  Recherche des points verifiant la condition d'appartenance (INDIC)
 465 :                SEGINI INDIC
 466 :                NBON=0
 467 :                DO IP=1,NBELEM
 468 :                   IPoin=NUM(1,IP)
 469 :                   IRef=(IPoin-1)*idimp1
 470 :                   XV=XCOOR(IRef+1)-XP1
 471 :                   YV=XCOOR(IRef+2)-YP1
 472 :                   ZV=0.D0
 473 :                   IF (IDIM.GE.3) ZV=XCOOR(IRef+3)-ZP1
 474 :                   Val1=SQRT(XV*XV+YV*YV+ZV*ZV)*SISOM
 475 :                   SCAL=XV*XVN+YV*YVN+ZV*ZVN
 476 :                   XPT=SCAL*XVN-XV
 477 :                   YPT=SCAL*YVN-YV
 478 :                   ZPT=SCAL*ZVN-ZV
 479 :                   Val2=SQRT(XPT*XPT+YPT*YPT+ZPT*ZPT)
 480 :                   IF (ABS(Val2-Val1).LE.CRIT) THEN
 481 :                      INDIC(IP)=IPoin
 482 :                      NBON=NBON+1
 483 :                   ENDIF
 484 :                ENDDO
 485 : C  Intersection du maillage avec une SPHERE
 486 : C --------------------------
 487 :             ELSE IF (IMC.EQ.5) THEN
 487 :                CALL LIROBJ('POINT ',IPoin1,1,IRetou)
 487 :                CALL LIROBJ('POINT ',IPoin2,1,IRetou)
 488 :                IF (IERR.NE.0) THEN
 489 :                   SEGDES MELEME
 490 :                   RETURN
 491 :                ENDIF
 492 :                IRef1=(IPoin1-1)*idimp1
 493 :                IRef2=(IPoin2-1)*idimp1
 494 :                XP1=XCOOR(IRef1+1)
 495 :                XV=XCOOR(IRef2+1)-XP1
 496 :                YP1=XCOOR(IRef1+2)
 497 :                YV=XCOOR(IRef2+2)-YP1
 498 :                IF (IDIM.GE.3) THEN
 499 :                   ZP1=XCOOR(IRef1+3)
 500 :                   ZV=XCOOR(IRef2+3)-ZP1
 501 :                ELSE
 502 :                   ZP1=0.D0
 503 :                   ZV=0.D0
 504 :                ENDIF
 505 : C  Calcul du rayon de la sphere
 506 :                Rayon=SQRT(XV*XV+YV*YV+ZV*ZV)
 507 :                IF (Rayon.EQ.0.D0) THEN
 507 :                   CALL ERREUR(21)
 508 :                   SEGDES MELEME
 509 :                   RETURN
 510 :                ENDIF
 511 : C  Recherche des points verifiant la condition d'appartenance (INDIC)
 512 :                SEGINI INDIC
 513 :                NBON=0
 514 :                DO IP=1,NBELEM
 515 :                   IPoin=NUM(1,IP)
 516 :                   IRef=(IPoin-1)*idimp1
 517 :                   XV=XCOOR(IRef+1)-XP1
 518 :                   YV=XCOOR(IRef+2)-YP1
 519 :                   ZV=0.D0
 520 :                   IF (IDIM.GE.3) ZV=XCOOR(IRef+3)-ZP1
 521 :                   Val1=SQRT(XV*XV+YV*YV+ZV*ZV)
 522 :                   IF (ABS(Val1-Rayon).LE.CRIT) THEN
 523 :                      INDIC(IP)=IPoin
 524 :                      NBON=NBON+1
 525 :                   ENDIF
 526 :                ENDDO
 527 : C  Intersection du maillage avec un TORE
 528 : C --------------------------
 529 :             ELSE IF (IMC.EQ.6) THEN
 529 :                CALL LIROBJ('POINT ',IPoin1,1,IRetou)
 529 :                CALL LIROBJ('POINT ',IPoin2,1,IRetou)
 529 :                CALL LIROBJ('POINT ',IPoin3,1,IRetou)
 529 :                CALL LIROBJ('POINT ',IPoin4,1,IRetou)
 530 :                IF (IERR.NE.0) THEN
 531 :                   SEGDES MELEME
 532 :                   RETURN
 533 :                ENDIF
 534 :                IRef1=(IPoin1-1)*idimp1
 535 :                IRef2=(IPoin2-1)*idimp1
 536 :                IRef3=(IPoin3-1)*idimp1
 537 :                IRef4=(IPoin4-1)*idimp1
 538 :                XP1=XCOOR(IRef1+1)
 539 :                XVN=XCOOR(IRef2+1)-XP1
 540 :                XV=XCOOR(IRef3+1)-XP1
 541 :                XPT=XCOOR(IRef4+1)-XP1
 542 :                YP1=XCOOR(IRef1+2)
 543 :                YVN=XCOOR(IRef2+2)-YP1
 544 :                YV=XCOOR(IRef3+2)-YP1
 545 :                YPT=XCOOR(IRef4+2)-YP1
 546 :                IF (IDIM.GE.3) THEN
 547 :                   ZP1=XCOOR(IRef1+3)
 548 :                   ZVN=XCOOR(IRef2+3)-ZP1
 549 :                   ZV=XCOOR(IRef3+3)-ZP1
 550 :                   ZPT=XCOOR(IRef4+3)-ZP1
 551 :                ELSE
 552 :                   ZP1=0.D0
 553 :                   ZVN=0.D0
 554 :                   ZV=0.D0
 555 :                   ZPT=0.D0
 556 :                ENDIF
 557 : C  Determination du vecteur directeur de l'axe du tore
 558 :                DVN=SQRT(XVN*XVN+YVN*YVN+ZVN*ZVN)
 559 :                IF (DVN.EQ.0.D0) THEN
 559 :                   CALL ERREUR(21)
 560 :                   SEGDES MELEME
 561 :                   RETURN
 562 :                ENDIF
 563 :                XVN=XVN/DVN
 564 :                YVN=YVN/DVN
 565 :                ZVN=ZVN/DVN
 566 : C  Calcul du grand rayon du tore
 567 :                GRayon=XV*XV+YV*YV+ZV*ZV
 568 :                IF (GRayon.EQ.0.D0) THEN
 568 :                   CALL ERREUR(21)
 569 :                   SEGDES MELEME
 570 :                   RETURN
 571 :                ENDIF
 572 : C  Calcul du petit rayon du tore
 573 :                SCAL=XPT*XVN+YPT*YVN+ZPT*ZVN
 574 :                XV=XPT-SCAL*XVN
 575 :                YV=YPT-SCAL*YVN
 576 :                ZV=ZPT-SCAL*ZVN
 577 :                Val1=SQRT(Grayon/(XV*XV+YV*YV+ZV*ZV))
 578 :                XV=XV*Val1-XPT
 579 :                YV=YV*Val1-YPT
 580 :                ZV=ZV*Val1-ZPT
 581 :                PRayon=SQRT(XV*XV+YV*YV+ZV*ZV)
 582 :                IF (PRayon.EQ.0.D0) THEN
 582 :                   CALL ERREUR(21)
 583 :                   SEGDES MELEME
 584 :                   RETURN
 585 :                ENDIF
 586 : C  Recherche des points verifiant la condition d'appartenance (INDIC)
 587 :                SEGINI INDIC
 588 :                NBON=0
 589 :                DO IP=1,NBELEM
 590 :                   IPoin=NUM(1,IP)
 591 :                   IRef=(IPoin-1)*idimp1
 592 :                   XPT=XCOOR(IRef+1)-XP1
 593 :                   YPT=XCOOR(IRef+2)-YP1
 594 :                   ZPT=0.D0
 595 :                   IF (IDIM.GE.3) ZPT=XCOOR(IRef+3)-ZP1
 596 :                   SCAL=XPT*XVN+YPT*YVN+ZPT*ZVN
 597 :                   XV=XPT-SCAL*XVN
 598 :                   YV=YPT-SCAL*YVN
 599 :                   ZV=ZPT-SCAL*ZVN
 600 :                   Val1=SQRT(GRayon/(XV*XV+YV*YV+ZV*ZV))
 601 :                   XV=XV*Val1-XPT
 602 :                   YV=YV*Val1-YPT
 603 :                   ZV=ZV*Val1-ZPT
 604 :                   Val2=SQRT(XV*XV+YV*YV+ZV*ZV)
 605 :                   IF (ABS(Val2-PRayon).LE.CRIT) THEN
 606 :                      INDIC(IP)=IPoin
 607 :                      NBON=NBON+1
 608 :                   ENDIF
 609 :                ENDDO
 610 :             ENDIF
 611 : C  Creation du maillage de sortie
 612 : C ----------------------
 613 :             IF (NBON.EQ.0) THEN
 613 :                CALL ERREUR(18)
 614 :                SEGDES MELEME
 615 :                SEGSUP INDIC
 616 :                RETURN
 617 :             ENDIF
 618 :             NBEL=NBELEM
 619 :             NBNN=1
 620 :             NBELEM=NBON
 621 :             NBSOUS=0
 622 :             NBREF=0
 623 :             SEGINI IPT1
 624 :             IPT1.ITYPEL=1
 625 :             IPLAC=0
 626 :             DO IP=1,NBEL
 627 :                IF (INDIC(IP).NE.0) THEN
 628 :                   IPLAC=IPLAC+1
 629 :                   IPT1.NUM(1,IPLAC)=INDIC(IP)
 630 :                   IPT1.ICOLOR(IPLAC)=IDCOUL
 631 :                ENDIF
 632 :             ENDDO
 633 :             SEGSUP INDIC
 634 :             SEGDES MELEME,IPT1
 634 :             CALL ECROBJ('MAILLAGE',IPT1)
 635 :          ENDIF
 636 : 
 637 : C  Operateur POINT - syntaxe 3 :
 638 : C -------------------------------
 639 : C  Extraction d'un CHAML ou d'un CHPO du(des) point(s) verifiant une
 640 : C  condition indiquee par MOT1.
 641 : C    Geo1 = POINT Che1 Mot1 ...
 642 :       ELSE
 643 :          Val1=0.D0
 644 :          Val2=0.D0
 645 :          IPList=0
 646 :          IF (IMM.GT.2) THEN
 646 :             CALL LIRREE(Val1,1,IRetou)
 647 :             IF (IERR.NE.0) RETURN
 648 :             IF (IMM.EQ.9) THEN
 648 :                CALL LIRREE(Val2,1,IRetou)
 649 :                IF (IERR.NE.0) RETURN
 650 :             ENDIF
 651 :          ENDIF
 651 :          CALL LIRMOT(MOABS,1,IAB,0)
 651 :          CALL LIRMOT(MOTAV,2,IAV,0)
 652 :          IF (IAV.EQ.0) IAV=1
 652 :          CALL LIROBJ('LISTMOTS',IPList,0,IRetou)
 653 :          IF (IERR.NE.0) RETURN
 653 :          CALL LIROBJ('CHPOINT ',IPCHP,0,IRetou)
 654 :          IF (IERR.NE.0) RETURN
 655 :          IF (IRetou.NE.0) THEN
 655 :             CALL EXPCHP(IPCHP,IMM,IAB,IAV,IPList,Val1,Val2,IPMAIL)
 656 :          ELSE
 656 :             CALL LIROBJ('MCHAML  ',IPCHE,1,IRetou)
 657 :             IF (IERR.NE.0) RETURN
 657 :             CALL EXPCHE(IPCHE,IMM,IAB,IAV,IPList,Val1,Val2,IPMAIL)
 658 :          ENDIF
 658 :          IF (IERR.EQ.0) CALL ECROBJ('MAILLAGE',IPMAIL)
 659 :       ENDIF
 660 : 
 661 :       RETURN
 662 :       END
 663 : 
 664 :  
 665 :  
 666 :  
 667 :  
 668 :  
 669 :  

© Cast3M 2003 - All rights reserved.
Disclaimer