Télécharger poiext.eso

Retour à la liste

Numérotation des lignes :

poiext
  1. C POIEXT SOURCE CB215821 23/07/12 21:15:10 11704
  2.  
  3. c=======================================================================
  4. C Sert a extraire un point d'un objet MAILLAGE
  5. C
  6. C Novembre 1985 :
  7. C Extrait d'un objet tous les points appartenant a une DROIte ou a
  8. C un PLAN (possibilite de critere de distance)
  9. C
  10. C Fevrier 1986 :
  11. C Extrait d'un objet tous les points appartenant a un CYLIndre, un
  12. C CONE, une SPHEre ou un TORE
  13. C
  14. C 09/2003 :
  15. C Introduction de la DIMEnsion 1. Ajout de la syntaxe pour creer un
  16. C point a partir de ses coordonnees. Inhibation d'options non compa-
  17. C tibles avec la dimension 1. Option PROC adapte au cas IDIM=1.
  18. C Ajout de tests sur le type d'element pour POINT Entier,
  19. C POINT INITIAL et POINT FINAL (conforme a la notice).
  20. C
  21. C 01/2004 :
  22. C Modifications des methodes de recherche des points appartenant a
  23. C une DROIte, un PLAN, un CYLIndre, un CONE. Methodes moins sensibles
  24. C aux imprecisions numeriques.
  25. C
  26. C 07/2013 GOUNAND
  27. C Les options INIT FINA et PROC détectent les maillages vides
  28. C en entrée et provoquent une erreur
  29. C
  30. C 04/2015 CB215821
  31. C Ajout de la possibilite de generer un MAILLAGE de POI1 en fournissant
  32. C des LISTREELS de coordonnees et optionnellement un LISTREEL de densite
  33. C
  34. C 11/2016 JCARDO
  35. C Ajout de l'option 'JONC' (en liaison avec les developpements dans
  36. C l'operateur PART)
  37. C
  38. c 11/2016 BP
  39. c ajout de la syntaxe : ptij = POIN ieme_noeud jeme_element maillage;
  40. c
  41. c=======================================================================
  42.  
  43. SUBROUTINE POIEXT
  44.  
  45. IMPLICIT INTEGER(I-N)
  46. IMPLICIT REAL*8 (A-H,O-Z)
  47.  
  48.  
  49. -INC PPARAM
  50. -INC CCOPTIO
  51. -INC SMELEME
  52. -INC SMLREEL
  53. -INC SMLMOTS
  54. -INC SMCOORD
  55. -INC CCGEOME
  56.  
  57. C Tableau fixe pour stocker les MLREEL (3 en 3D + densite)
  58. INTEGER LISLRE(4)
  59.  
  60. C- DIMENSION XNORM(3)
  61. CHARACTER*4 MOT,IPRO
  62. CHARACTER*4 MCLE(10),MOTM(9),MOABS(1),MOTAV(2),MODENS(1)
  63. CHARACTER*8 MOTTYP
  64. SEGMENT INDIC(NBELEM)
  65.  
  66. SEGMENT NETN(nbpts+1)
  67.  
  68. C COMMON de sauvegarde lors d'un appel par SYMTRI
  69. COMMON / CSYMTR / XNORM(3)
  70.  
  71. DATA MCLE / 'INIT','FINA','JONC','PROC',
  72. . 'DROI','PLAN','CYLI','CONE','SPHE','TORE' /
  73. DATA MOTM / 'MAXI','MINI','SUPE','EGSU','EGAL','EGIN','INFE',
  74. . 'DIFF','COMP' /
  75. DATA MOTAV / 'AVEC','SANS' /
  76. DATA MOABS / 'ABS ' /
  77.  
  78. DATA MODENS /'DENS'/
  79.  
  80. segact mcoord
  81.  
  82. c Lecture des mots cles correspondant a la 3eme syntaxe (CHPOINT)
  83. CALL LIRMOT(MOTM,9,IMM,0)
  84. IF (IMM.NE.0) GOTO 300
  85. c syntaxe 3 ==> GOTO 300
  86.  
  87.  
  88. idimp1=IDIM+1
  89. c Lecture des mots cles geometrique
  90. CALL LIRMOT(MCLE(5),6,IMC,0)
  91. IF (IMC.NE.0) GOTO 250
  92. c syntaxe 2.b ==> GOTO 250
  93.  
  94.  
  95. c Lecture d'un maillage en entree
  96. CALL LIROBJ('MAILLAGE',MELEME,0,IRetou)
  97. IF (IERR.NE.0) RETURN
  98. IF (IRetou.NE.0) GOTO 200
  99. c syntaxe 2.a ==> GOTO 200
  100.  
  101.  
  102. 100 CONTINUE
  103. c IF(IIMPI.EQ.333) WRITE(IOIMP,*) 'POINT syntaxe 1:'
  104. C -------------------------------
  105. C Operateur POINT - syntaxe 1 :
  106. C -------------------------------
  107. C CB215821 Ajout de la possibilité de générer un MAILLAGE de POI1 en
  108. C fournissant directement un LISTREEL par COORDONNEES plus
  109. C optionnellement un LISTREEL pour la densité
  110.  
  111. CALL LIROBJ('LISTREEL',MLREEL,0,IRETOU)
  112. IF (IRETOU.NE.0) THEN
  113. IF(IDIM .EQ. 0) THEN
  114. C Dimension non définie
  115. CALL ERREUR(14)
  116. RETURN
  117. ENDIF
  118. SEGACT,MLREEL
  119.  
  120. LISLRE(1)=MLREEL
  121. NBVAL = PROG(/1)
  122. C Lecture OBLIGATOIRE d'un nombre de LISTREEL egal a IDIM
  123. DO I=2,IDIM
  124. CALL LIROBJ('LISTREEL',MLREEL,1,IRETOU)
  125. IF (IERR .NE. 0) RETURN
  126. SEGACT,MLREEL
  127. JG=MLREEL.PROG(/1)
  128. C Verification de la longeur des LISTREELS lus
  129. IF (JG .NE. NBVAL) THEN
  130. CALL ERREUR(217)
  131. RETURN
  132. ENDIF
  133. LISLRE(I)=MLREEL
  134. ENDDO
  135.  
  136. C Lecture mot-cle 'DENS'
  137. CALL LIRMOT(MODENS,1,IPOS,0)
  138. IF (IERR.NE.0) RETURN
  139.  
  140. IF(IPOS .EQ. 1)THEN
  141. CALL LIROBJ('LISTREEL',MLREEL,1,IRETOU)
  142. IF (IERR.NE.0) RETURN
  143. SEGACT,MLREEL
  144. JG=MLREEL.PROG(/1)
  145. C Verification de la longeur du LISTREELS lu
  146. IF (JG .NE. NBVAL) THEN
  147. CALL ERREUR(217)
  148. RETURN
  149. ENDIF
  150. LISLRE(IDIM+1)=MLREEL
  151.  
  152. ELSE
  153. LISLRE(IDIM+1)=0
  154. ENDIF
  155.  
  156. C On remplit le MELEME de POI1
  157. NBNN = 1
  158. NBELEM = NBVAL
  159. NBSOUS = 0
  160. NBREF = 0
  161. SEGINI,MELEME
  162. ITYPEL = 1
  163.  
  164. IF (NBVAL .GT. 0) THEN
  165. C Ajout des NOEUDS au SEGMENT MCOORD et ajustement
  166. SEGACT,MCOORD*MOD
  167. NBANC=nbpts
  168.  
  169. NBPTS=NBANC+NBVAL
  170. SEGADJ,MCOORD
  171.  
  172. NBAD = 0
  173. IDINI = NBANC*(IDIM+1)
  174. DO I=1,NBVAL
  175. DO J=1,IDIM+1
  176. C Le cas (IDIM+1) sert à remplir la densité
  177. NBAD = NBAD+1
  178. MLREEL=LISLRE(J)
  179. IF(J .EQ. IDIM+1)THEN
  180. IF (MLREEL .EQ. 0) XVAL=DENSIT
  181. ELSE
  182. XVAL=MLREEL.PROG(I)
  183. ENDIF
  184. XCOOR(IDINI+NBAD)=XVAL
  185. ENDDO
  186. NUM(1,I) =NBANC+I
  187. ICOLOR(I)=IDCOUL
  188. ENDDO
  189. ENDIF
  190.  
  191. SEGDES,MCOORD
  192. CALL ACTOBJ('MAILLAGE',MELEME,1)
  193. CALL ECROBJ('MAILLAGE',MELEME)
  194. RETURN
  195.  
  196. ELSE
  197. C Creation d'un seul POINT par trois flottants
  198. C Pour IDIM = 1, seul moyen de creer un point.
  199. CALL MESLIR(-149)
  200. CALL LIRREE(Val1,1,IRetou)
  201. IF (IERR.NE.0) RETURN
  202. CALL MESLIR(-150)
  203. IF (IDIM.EQ.2) THEN
  204. CALL LIRREE(Val2,1,IRetou)
  205. ELSE IF (IDIM.EQ.3) THEN
  206. CALL LIRREE(Val2,1,IRetou)
  207. IF (IERR.NE.0) RETURN
  208. CALL MESLIR(-151)
  209. CALL LIRREE(Val3,1,IRetou)
  210. ENDIF
  211. IF (IERR.NE.0) RETURN
  212.  
  213. C Lecture mot-cle 'DENS'
  214. CALL LIRMOT(MODENS,1,IPOS,0)
  215. IF (IERR.NE.0) RETURN
  216.  
  217. IF(IPOS .EQ. 1)THEN
  218. CALL MESLIR(-238)
  219. CALL LIRREE(ValDen,1,IRetou)
  220. IF (IERR.NE.0) RETURN
  221. ELSE
  222. ValDen=DENSIT
  223. ENDIF
  224.  
  225. SEGACT MCOORD*MOD
  226. NbPts=1+nbpts
  227. SEGADJ MCOORD
  228. IRef=(NbPts-1)*idimp1
  229. XCOOR(IRef+1)=Val1
  230. IF (IDIM.EQ.2) THEN
  231. XCOOR(IRef+2)=Val2
  232. ELSE IF (IDIM.EQ.3) THEN
  233. XCOOR(IRef+2)=Val2
  234. XCOOR(IRef+3)=Val3
  235. ENDIF
  236. ENDIF
  237. XCOOR(IRef+idimp1)=ValDen
  238. SEGDES,MCOORD
  239. CALL ECROBJ('POINT ',NbPts)
  240. RETURN
  241.  
  242.  
  243. 200 CONTINUE
  244. c IF(IIMPI.EQ.333) WRITE(IOIMP,*) 'POINT syntaxe 2:'
  245. C -------------------------------
  246. C Operateur POINT - syntaxe 2 :
  247. C -------------------------------
  248. C 1) Recuperation du POINT1 du maillage GEO1 par son numero
  249. C Point1 = POINT Geo1 Entier1 ;
  250. C Note : le maillage est constitue uniquement de POI1 ou SEG2.
  251. C 1') Recuperation de POINT1 = Entier1^eme noeud du Entier2^eme element de GEO1
  252. C Point1 = POINT Geo1 Entier1 Entier2;
  253. C Note : le maillage est constitue uniquement de POI1 ou SEG2.
  254. C 2) Recuperation du point INITIAL ou FINAL du maillage GEO1
  255. C Point1 = POINT Geo1 'INITIAL' | 'FINAL' ;
  256. C Note : le maillage est constitue uniquement de POI1, SEG2 ou SEG3.
  257. C 3) Recuperation du POINT1 du maillage GEO1 le plus proche du POINT2.
  258. C Point1 = POINT Geo1 'PROC' Point2 ;
  259.  
  260. CALL ACTOBJ('MAILLAGE',MELEME,1)
  261.  
  262. C Lecture facultative d'un entier (numero du point a trouver)
  263. CALL LIRENT(JPTR,0,IRetou)
  264.  
  265. c cas ou on a bien lu un entier
  266. IF (IRetou.NE.0) THEN
  267.  
  268. IF (JPTR.LE.0) THEN
  269. CALL ERREUR(262)
  270. RETURN
  271. ENDIF
  272. MOT=' '
  273. IPRO=' '
  274. C Lecture d'un 2eme entier
  275. CALL LIRENT(KPTR,0,IRetou)
  276. IF (IRetou.NE.0) THEN
  277. IF (KPTR.LE.0) THEN
  278. CALL ERREUR(262)
  279. RETURN
  280. ENDIF
  281. MOT='MELE'
  282. ENDIF
  283.  
  284. ELSE
  285. C Lecture d'un des mots cles ('INIT','FINA','JONC','PROC')
  286.  
  287. CALL LIRCHA(MOT,0,IRetou)
  288. IF (IRetou.EQ.0) THEN
  289. C Le type de l'operande est incorrect
  290. CALL QUETYP(MOTERR(1:8),0,IRetou)
  291. IF (IRetou.NE.0) THEN
  292. CALL ERREUR (39)
  293. ELSE
  294. CALL ERREUR(533)
  295. ENDIF
  296. RETURN
  297. ENDIF
  298. C point INIT ou FINA => IPRO=' '
  299. IF ((MOT.EQ.MCLE(1)).OR.(MOT.EQ.MCLE(2))) THEN
  300. IPRO=' '
  301. C point JONC ou PROCH
  302. ELSEIF (MOT.EQ.MCLE(3)) THEN
  303. IPRO=MOT
  304. GOTO 203
  305. ELSEIF (MOT.EQ.MCLE(4)) THEN
  306. IPRO=MOT
  307. GOTO 204
  308. ELSE
  309. MOTERR=MOT
  310. CALL ERREUR(7)
  311. RETURN
  312. ENDIF
  313.  
  314. ENDIF
  315.  
  316. C Traitement des syntaxes POINT Geo1 Entier1 | 'INIT' | 'FINA'
  317. C Erreur si objet maillage complexe
  318. IF (LISOUS(/1).NE.0) THEN
  319. CALL ERREUR(25)
  320. RETURN
  321. ENDIF
  322. IF (NUM(/1).LE.0.OR.NUM(/2).LE.0) THEN
  323. MOTERR='MAILLAGE'
  324. C Une donnée de type %m1:8 est vide
  325. CALL ERREUR(1027)
  326. RETURN
  327. ENDIF
  328.  
  329. c --- syntaxe POINT Geo1 Entier1 Entier2 ---
  330. IF (MOT.EQ.'MELE') THEN
  331. c IF(IIMPI.EQ.333) WRITE(IOIMP,*) '+ option Entier1 Entier2'
  332. IPTR=JPTR
  333. JPTR=KPTR
  334. IF (IPTR.GT.NUM(/1).OR.JPTR.GT.NUM(/2)) THEN
  335. CALL ERREUR(262)
  336. RETURN
  337. ENDIF
  338. c --- syntaxe POINT Geo1 Entier1 ---
  339. ELSEIF (MOT.EQ.' ') THEN
  340. c IF(IIMPI.EQ.333) WRITE(IOIMP,*) '+ option Entier1'
  341. IF ((ITYPEL.NE.1).AND.(JPTR.EQ.(NUM(/2)+1))) THEN
  342. IPTR=NUM(/1)
  343. JPTR=NUM(/2)
  344. ELSE
  345. IPTR=1
  346. ENDIF
  347. IF (JPTR.GT.NUM(/2)) THEN
  348. CALL ERREUR(262)
  349. RETURN
  350. ENDIF
  351. c --- syntaxe POINT Geo1 'INIT' ---
  352. ELSE IF (MOT.EQ.MCLE(1)) THEN
  353. c IF(IIMPI.EQ.333) WRITE(IOIMP,*) '+ option INIT'
  354. IPTR=1
  355. JPTR=1
  356. c --- syntaxe POINT Geo1 'FINA' ---
  357. c IF(IIMPI.EQ.333) WRITE(IOIMP,*) '+ option FINA'
  358. ELSE IF (MOT.EQ.MCLE(2)) THEN
  359. IPTR=NUM(/1)
  360. JPTR=NUM(/2)
  361. ENDIF
  362. c ---partie commune aux syntaxes Entier(s) INIT FINA ---
  363. IPoin=NUM(IPTR,JPTR)
  364. CALL ECROBJ('POINT ',IPoin)
  365. RETURN
  366.  
  367.  
  368. C --- Traitement de l'option POIN 'JONC' ---
  369. 203 CONTINUE
  370. c IF(IIMPI.EQ.333) WRITE(IOIMP,*) '+ option JONC'
  371. NBSOUS=LISOUS(/1)
  372. NBS=MAX(1,NBSOUS)
  373. IPT1=MELEME
  374.  
  375. NBELEM=0
  376. SEGINI,NETN
  377. DO IO=1,NBS
  378. IF (NBSOUS.GT.0) THEN
  379. IPT1=LISOUS(IO)
  380. ENDIF
  381. DO 222 J=1,IPT1.NUM(/2)
  382. DO 223 I=1,IPT1.NUM(/1)
  383. IF (NETN(IPT1.NUM(I,J)).EQ.2) NBELEM=NBELEM+1
  384. NETN(IPT1.NUM(I,J))=NETN(IPT1.NUM(I,J))+1
  385. 223 CONTINUE
  386. 222 CONTINUE
  387. ENDDO
  388.  
  389. NBNN=1
  390. NBREF=0
  391. NBSOUS=0
  392. SEGINI,IPT1
  393. IPT1.ITYPEL=1
  394. K=0
  395. DO I=1,NETN(/1)
  396. IF (NETN(I).GT.2) THEN
  397. K=K+1
  398. IPT1.NUM(1,K)=I
  399. ENDIF
  400. ENDDO
  401.  
  402. SEGSUP,NETN
  403.  
  404. CALL ECROBJ('MAILLAGE',IPT1)
  405.  
  406. RETURN
  407.  
  408. C --- Traitement de l'option POIN 'PROC' ---
  409. 204 CONTINUE
  410. c IF(IIMPI.EQ.333) WRITE(IOIMP,*) '+ option PROCH'
  411. CALL LIROBJ('POINT ',IPoin1,1,IRetou)
  412. IF (IERR.NE.0) THEN
  413. RETURN
  414. ENDIF
  415. Val1=1.E30
  416. IRef=(IPoin1-1)*idimp1
  417. XP1=XCOOR(IRef+1)
  418. YP1=XCOOR(IRef+2)
  419. ZP1=0.D0
  420. IF (IDIM.GE.3) ZP1=XCOOR(IRef+3)
  421. IPT1=MELEME
  422. Ipoin=0
  423. DO IOB=1,MAX(1,LISOUS(/1))
  424. IF (LISOUS(/1).NE.0) THEN
  425. IPT1=LISOUS(IOB)
  426. ENDIF
  427. DO i=1,IPT1.NUM(/2)
  428. DO j=1,IPT1.NUM(/1)
  429. IRef=(IPT1.NUM(j,i)-1)*idimp1
  430. IF (IDIM.EQ.1) THEN
  431. DVN=ABS(XP1-XCOOR(IRef+1))
  432. ELSE
  433. XVN=XP1-XCOOR(IRef+1)
  434. YVN=YP1-XCOOR(IRef+2)
  435. ZVN=0.D0
  436. IF (IDIM.GE.3) ZVN=ZP1-XCOOR(IRef+3)
  437. DVN=XVN*XVN+YVN*YVN+ZVN*ZVN
  438. ENDIF
  439. IF (DVN.LE.Val1) THEN
  440. Val1=DVN
  441. IPoin=IPT1.NUM(j,i)
  442. ENDIF
  443. ENDDO
  444. ENDDO
  445. ENDDO
  446. IF (IPoin.EQ.0) THEN
  447. MOTERR='MAILLAGE'
  448. C Une donnée de type %m1:8 est vide
  449. CALL ERREUR(1027)
  450. ELSE
  451. IF (IERR.EQ.0) CALL ECROBJ('POINT ',IPoin)
  452. ENDIF
  453. RETURN
  454.  
  455.  
  456. 250 CONTINUE
  457. c IF(IIMPI.EQ.333) WRITE(IOIMP,*) 'POINT syntaxe 2.b :'
  458. C -------------------------------
  459. C Operateur POINT - syntaxe 2.b :
  460. C -------------------------------
  461. C Extraction du(des) point(s) du maillage GEO1 situe(s) sur une
  462. C DROIte, un PLAN, un CYLIndre, un CONE, une SPHEre ou un TORE.
  463. C L'appartenance du point a l'objet est definie suivant un critere
  464. C de distance non nul (appartenance stricte : critere tres faible).
  465. C Geof = POINT Geo1 MOT1 Points ... (Critere)
  466.  
  467. C En dimension 1, ces criteres n'ont aucun sens.
  468. IF (IDIM.EQ.1) THEN
  469. MOTERR=MCLE(3+IMC)
  470. INTERR(1)=IDIM
  471. CALL ERREUR(971)
  472. RETURN
  473. ENDIF
  474. C Lectures obligatoire du maillage et facultative du critere
  475. CALL LIROBJ('MAILLAGE',MELEME,1,IRetou)
  476. IF (IERR.NE.0) RETURN
  477. CRIT=DENSIT/10.D0
  478. CALL LIRREE(CRIT,0,IRetou)
  479. IF (CRIT.LE.0.D0) CALL ERREUR(17)
  480. IF (IERR.NE.0) RETURN
  481. C Transformation du maillage en 'POI1'
  482. CALL CHANGE(MELEME,1)
  483. NBELEM=NUM(/2)
  484. C Intersection du maillage avec une DROIte
  485. C --------------------------
  486. IF (IMC.EQ.1) THEN
  487. CALL LIROBJ('POINT ',IPoin1,1,IRetou)
  488. CALL LIROBJ('POINT ',IPoin2,1,IRetou)
  489. IF (IERR.NE.0) THEN
  490. RETURN
  491. ENDIF
  492. C Recherche du vecteur directeur de la DROIte
  493. IRef1=(IPoin1-1)*idimp1
  494. IRef2=(IPoin2-1)*idimp1
  495. XP1=XCOOR(IRef1+1)
  496. XVN=XCOOR(IRef2+1)-XP1
  497. YP1=XCOOR(IRef1+2)
  498. YVN=XCOOR(IRef2+2)-YP1
  499. ZP1=0.D0
  500. ZVN=0.D0
  501. IF (IDIM.GE.3) THEN
  502. ZP1=XCOOR(IRef1+3)
  503. ZVN=XCOOR(IRef2+3)-ZP1
  504. ENDIF
  505. DVN=SQRT(XVN*XVN+YVN*YVN+ZVN*ZVN)
  506. IF (DVN.EQ.0.D0) THEN
  507. CALL ERREUR(21)
  508. RETURN
  509. ENDIF
  510. XVN=XVN/DVN
  511. YVN=YVN/DVN
  512. ZVN=ZVN/DVN
  513. XNORM(1)=XVN
  514. XNORM(2)=YVN
  515. XNORM(3)=ZVN
  516. C Recherche des points verifiant la condition d'appartenance (INDIC)
  517. SEGINI INDIC
  518. NBON=0
  519. DO IP=1,NBELEM
  520. IPoin=NUM(1,IP)
  521. IRef=(IPoin-1)*idimp1
  522. XPT=XCOOR(IRef+1)-XP1
  523. YPT=XCOOR(IRef+2)-YP1
  524. ZPT=0.D0
  525. IF (IDIM.GE.3) ZPT=XCOOR(IRef+3)-ZP1
  526. SCAL=XPT*XVN+YPT*YVN+ZPT*ZVN
  527. XV=SCAL*XVN-XPT
  528. YV=SCAL*YVN-YPT
  529. ZV=SCAL*ZVN-ZPT
  530. Val1=XV*XV+YV*YV+ZV*ZV
  531. IF (Val1.LE.CRIT) THEN
  532. INDIC(IP)=IPoin
  533. NBON=NBON+1
  534. ENDIF
  535. ENDDO
  536. C Intersection du maillage avec un PLAN
  537. C --------------------------
  538. ELSE IF (IMC.EQ.2) THEN
  539. CALL LIROBJ('POINT ',IPoin1,1,IRetou)
  540. CALL LIROBJ('POINT ',IPoin2,1,IRetou)
  541. CALL LIROBJ('POINT ',IPoin3,1,IRetou)
  542. IF (IERR.NE.0) THEN
  543. RETURN
  544. ENDIF
  545. C Determination du vecteur normal au PLAN
  546. IRef1=(IPoin1-1)*idimp1
  547. IRef2=(IPoin2-1)*idimp1
  548. IRef3=(IPoin3-1)*idimp1
  549. XP1=XCOOR(IRef1+1)
  550. XP2=XCOOR(IRef2+1)
  551. XP3=XCOOR(IRef3+1)
  552. YP1=XCOOR(IRef1+2)
  553. YP2=XCOOR(IRef2+2)
  554. YP3=XCOOR(IRef3+2)
  555. ZP1=0.D0
  556. ZP2=0.D0
  557. ZP3=0.D0
  558. IF (IDIM.GE.3) THEN
  559. ZP1=XCOOR(IRef1+3)
  560. ZP2=XCOOR(IRef2+3)
  561. ZP3=XCOOR(IRef3+3)
  562. ENDIF
  563. XVN=(YP2-YP1)*(ZP3-ZP1)-(ZP2-ZP1)*(YP3-YP1)
  564. YVN=(ZP2-ZP1)*(XP3-XP1)-(XP2-XP1)*(ZP3-ZP1)
  565. ZVN=(XP2-XP1)*(YP3-YP1)-(YP2-YP1)*(XP3-XP1)
  566. DVN=SQRT(XVN*XVN+YVN*YVN+ZVN*ZVN)
  567. IF (DVN.EQ.0.D0) THEN
  568. CALL ERREUR(21)
  569. RETURN
  570. ENDIF
  571. XVN=XVN/DVN
  572. YVN=YVN/DVN
  573. ZVN=ZVN/DVN
  574. XNORM(1)=XVN
  575. XNORM(2)=YVN
  576. XNORM(3)=ZVN
  577. C Recherche des points verifiant la condition d'appartenance (INDIC)
  578. SEGINI INDIC
  579. NBON=0
  580. DO IP=1,NBELEM
  581. IPoin=NUM(1,IP)
  582. IRef=(IPoin-1)*idimp1
  583. XV=XCOOR(IRef+1)-XP1
  584. YV=XCOOR(IRef+2)-YP1
  585. ZV=0.D0
  586. IF (IDIM.GE.3) ZV=XCOOR(IRef+3)-ZP1
  587. Val1=ABS(XV*XVN+YV*YVN+ZV*ZVN)
  588. IF (Val1.LE.CRIT) THEN
  589. INDIC(IP)=IPoin
  590. NBON=NBON+1
  591. ENDIF
  592. ENDDO
  593. C Intersection du maillage avec un CYLIndre
  594. C --------------------------
  595. ELSE IF (IMC.EQ.3) THEN
  596. CALL LIROBJ('POINT ',IPoin1,1,IRetou)
  597. CALL LIROBJ('POINT ',IPoin2,1,IRetou)
  598. CALL LIROBJ('POINT ',IPoin3,1,IRetou)
  599. IF (IERR.NE.0) THEN
  600. RETURN
  601. ENDIF
  602. IRef1=(IPoin1-1)*idimp1
  603. IRef2=(IPoin2-1)*idimp1
  604. IRef3=(IPoin3-1)*idimp1
  605. XP1=XCOOR(IRef1+1)
  606. XVN=XCOOR(IRef2+1)-XP1
  607. XPT=XCOOR(IRef3+1)-XP1
  608. YP1=XCOOR(IRef1+2)
  609. YVN=XCOOR(IRef2+2)-YP1
  610. YPT=XCOOR(IRef3+2)-YP1
  611. IF (IDIM.GE.3) THEN
  612. ZP1=XCOOR(IRef1+3)
  613. ZVN=XCOOR(IRef2+3)-ZP1
  614. ZPT=XCOOR(IRef3+3)-ZP1
  615. ELSE
  616. ZP1=0.D0
  617. ZVN=0.D0
  618. ZPT=0.D0
  619. ENDIF
  620. C Determination de l'axe du cylindre (axe P1-P2)
  621. DVN=SQRT(XVN*XVN+YVN*YVN+ZVN*ZVN)
  622. IF (DVN.EQ.0.D0) THEN
  623. CALL ERREUR(21)
  624. RETURN
  625. ENDIF
  626. XVN=XVN/DVN
  627. YVN=YVN/DVN
  628. ZVN=ZVN/DVN
  629. C Calcul du rayon du cylindre (distance P3 a axe P1-P2)
  630. SCAL=XPT*XVN+YPT*YVN+ZPT*ZVN
  631. XV=SCAL*XVN-XPT
  632. YV=SCAL*YVN-YPT
  633. ZV=SCAL*ZVN-ZPT
  634. Rayon=SQRT(XV*XV+YV*YV+ZV*ZV)
  635. IF (Rayon.EQ.0.D0) THEN
  636. CALL ERREUR(21)
  637. RETURN
  638. ENDIF
  639. C Recherche des points verifiant la condition d'appartenance (INDIC)
  640. SEGINI INDIC
  641. NBON=0
  642. DO IP=1,NBELEM
  643. IPoin=NUM(1,IP)
  644. IRef=(IPoin-1)*idimp1
  645. XPT=XCOOR(IRef+1)-XP1
  646. YPT=XCOOR(IRef+2)-YP1
  647. ZPT=0.D0
  648. IF (IDIM.GE.3) ZPT=XCOOR(IRef+3)-ZP1
  649. SCAL=XPT*XVN+YPT*YVN+ZPT*ZVN
  650. XV=SCAL*XVN-XPT
  651. YV=SCAL*YVN-YPT
  652. ZV=SCAL*ZVN-ZPT
  653. Val1=SQRT(XV*XV+YV*YV+ZV*ZV)
  654. IF (ABS(Val1-Rayon).LE.CRIT) THEN
  655. INDIC(IP)=IPoin
  656. NBON=NBON+1
  657. ENDIF
  658. ENDDO
  659. C Intersection du maillage avec un CONE
  660. C --------------------------
  661. ELSE IF (IMC.EQ.4) THEN
  662. CALL LIROBJ('POINT ',IPoin1,1,IRetou)
  663. CALL LIROBJ('POINT ',IPoin2,1,IRetou)
  664. CALL LIROBJ('POINT ',IPoin3,1,IRetou)
  665. IF (IERR.NE.0) THEN
  666. RETURN
  667. ENDIF
  668. IRef1=(IPoin1-1)*idimp1
  669. IRef2=(IPoin2-1)*idimp1
  670. IRef3=(IPoin3-1)*idimp1
  671. XP1=XCOOR(IRef1+1)
  672. XVN=XCOOR(IRef2+1)-XP1
  673. XV=XCOOR(IRef3+1)-XP1
  674. YP1=XCOOR(IRef1+2)
  675. YVN=XCOOR(IRef2+2)-YP1
  676. YV=XCOOR(IRef3+2)-YP1
  677. IF (IDIM.GE.3) THEN
  678. ZP1=XCOOR(IRef1+3)
  679. ZVN=XCOOR(IRef2+3)-ZP1
  680. ZV=XCOOR(IRef3+3)-ZP1
  681. ELSE
  682. ZP1=0.D0
  683. ZVN=0.D0
  684. ZV=0.D0
  685. ENDIF
  686. C Recherche du vecteur directeur de l'axe du cone
  687. DVN=SQRT(XVN*XVN+YVN*YVN+ZVN*ZVN)
  688. IF (DVN.EQ.0.D0) THEN
  689. CALL ERREUR(21)
  690. RETURN
  691. ENDIF
  692. XVN=XVN/DVN
  693. YVN=YVN/DVN
  694. ZVN=ZVN/DVN
  695. C Calcul de l'angle au sommet du cone
  696. Val1=XV*XV+YV*YV+ZV*ZV
  697. IF (Val1.EQ.0.D0) THEN
  698. CALL ERREUR(21)
  699. RETURN
  700. ENDIF
  701. SCAL=XV*XVN+YV*YVN+ZV*ZVN
  702. XPT=SCAL*XVN-XV
  703. YPT=SCAL*YVN-YV
  704. ZPT=SCAL*ZVN-ZV
  705. SISOM=SQRT((XPT*XPT+YPT*YPT+ZPT*ZPT)/Val1)
  706. C Recherche des points verifiant la condition d'appartenance (INDIC)
  707. SEGINI INDIC
  708. NBON=0
  709. DO IP=1,NBELEM
  710. IPoin=NUM(1,IP)
  711. IRef=(IPoin-1)*idimp1
  712. XV=XCOOR(IRef+1)-XP1
  713. YV=XCOOR(IRef+2)-YP1
  714. ZV=0.D0
  715. IF (IDIM.GE.3) ZV=XCOOR(IRef+3)-ZP1
  716. Val1=SQRT(XV*XV+YV*YV+ZV*ZV)*SISOM
  717. SCAL=XV*XVN+YV*YVN+ZV*ZVN
  718. XPT=SCAL*XVN-XV
  719. YPT=SCAL*YVN-YV
  720. ZPT=SCAL*ZVN-ZV
  721. Val2=SQRT(XPT*XPT+YPT*YPT+ZPT*ZPT)
  722. IF (ABS(Val2-Val1).LE.CRIT) THEN
  723. INDIC(IP)=IPoin
  724. NBON=NBON+1
  725. ENDIF
  726. ENDDO
  727. C Intersection du maillage avec une SPHERE
  728. C --------------------------
  729. ELSE IF (IMC.EQ.5) THEN
  730. CALL LIROBJ('POINT ',IPoin1,1,IRetou)
  731. CALL LIROBJ('POINT ',IPoin2,1,IRetou)
  732. IF (IERR.NE.0) THEN
  733. RETURN
  734. ENDIF
  735. IRef1=(IPoin1-1)*idimp1
  736. IRef2=(IPoin2-1)*idimp1
  737. XP1=XCOOR(IRef1+1)
  738. XV=XCOOR(IRef2+1)-XP1
  739. YP1=XCOOR(IRef1+2)
  740. YV=XCOOR(IRef2+2)-YP1
  741. IF (IDIM.GE.3) THEN
  742. ZP1=XCOOR(IRef1+3)
  743. ZV=XCOOR(IRef2+3)-ZP1
  744. ELSE
  745. ZP1=0.D0
  746. ZV=0.D0
  747. ENDIF
  748. C Calcul du rayon de la sphere
  749. Rayon=SQRT(XV*XV+YV*YV+ZV*ZV)
  750. IF (Rayon.EQ.0.D0) THEN
  751. CALL ERREUR(21)
  752. RETURN
  753. ENDIF
  754. C Recherche des points verifiant la condition d'appartenance (INDIC)
  755. SEGINI INDIC
  756. NBON=0
  757. DO IP=1,NBELEM
  758. IPoin=NUM(1,IP)
  759. IRef=(IPoin-1)*idimp1
  760. XV=XCOOR(IRef+1)-XP1
  761. YV=XCOOR(IRef+2)-YP1
  762. ZV=0.D0
  763. IF (IDIM.GE.3) ZV=XCOOR(IRef+3)-ZP1
  764. Val1=SQRT(XV*XV+YV*YV+ZV*ZV)
  765. IF (ABS(Val1-Rayon).LE.CRIT) THEN
  766. INDIC(IP)=IPoin
  767. NBON=NBON+1
  768. ENDIF
  769. ENDDO
  770. C Intersection du maillage avec un TORE
  771. C --------------------------
  772. ELSE IF (IMC.EQ.6) THEN
  773. CALL LIROBJ('POINT ',IPoin1,1,IRetou)
  774. CALL LIROBJ('POINT ',IPoin2,1,IRetou)
  775. CALL LIROBJ('POINT ',IPoin3,1,IRetou)
  776. CALL LIROBJ('POINT ',IPoin4,1,IRetou)
  777. IF (IERR.NE.0) THEN
  778. RETURN
  779. ENDIF
  780. IRef1=(IPoin1-1)*idimp1
  781. IRef2=(IPoin2-1)*idimp1
  782. IRef3=(IPoin3-1)*idimp1
  783. IRef4=(IPoin4-1)*idimp1
  784. XP1=XCOOR(IRef1+1)
  785. XVN=XCOOR(IRef2+1)-XP1
  786. XV=XCOOR(IRef3+1)-XP1
  787. XPT=XCOOR(IRef4+1)-XP1
  788. YP1=XCOOR(IRef1+2)
  789. YVN=XCOOR(IRef2+2)-YP1
  790. YV=XCOOR(IRef3+2)-YP1
  791. YPT=XCOOR(IRef4+2)-YP1
  792. IF (IDIM.GE.3) THEN
  793. ZP1=XCOOR(IRef1+3)
  794. ZVN=XCOOR(IRef2+3)-ZP1
  795. ZV=XCOOR(IRef3+3)-ZP1
  796. ZPT=XCOOR(IRef4+3)-ZP1
  797. ELSE
  798. ZP1=0.D0
  799. ZVN=0.D0
  800. ZV=0.D0
  801. ZPT=0.D0
  802. ENDIF
  803. C Determination du vecteur directeur de l'axe du tore
  804. DVN=SQRT(XVN*XVN+YVN*YVN+ZVN*ZVN)
  805. IF (DVN.EQ.0.D0) THEN
  806. CALL ERREUR(21)
  807. RETURN
  808. ENDIF
  809. XVN=XVN/DVN
  810. YVN=YVN/DVN
  811. ZVN=ZVN/DVN
  812. C Calcul du grand rayon du tore
  813. GRayon=XV*XV+YV*YV+ZV*ZV
  814. IF (GRayon.EQ.0.D0) THEN
  815. CALL ERREUR(21)
  816. RETURN
  817. ENDIF
  818. C Calcul du petit rayon du tore
  819. SCAL=XPT*XVN+YPT*YVN+ZPT*ZVN
  820. XV=XPT-SCAL*XVN
  821. YV=YPT-SCAL*YVN
  822. ZV=ZPT-SCAL*ZVN
  823. Val1=SQRT(Grayon/(XV*XV+YV*YV+ZV*ZV))
  824. XV=XV*Val1-XPT
  825. YV=YV*Val1-YPT
  826. ZV=ZV*Val1-ZPT
  827. PRayon=SQRT(XV*XV+YV*YV+ZV*ZV)
  828. IF (PRayon.EQ.0.D0) THEN
  829. CALL ERREUR(21)
  830. RETURN
  831. ENDIF
  832. C Recherche des points verifiant la condition d'appartenance (INDIC)
  833. SEGINI INDIC
  834. NBON=0
  835. DO IP=1,NBELEM
  836. IPoin=NUM(1,IP)
  837. IRef=(IPoin-1)*idimp1
  838. XPT=XCOOR(IRef+1)-XP1
  839. YPT=XCOOR(IRef+2)-YP1
  840. ZPT=0.D0
  841. IF (IDIM.GE.3) ZPT=XCOOR(IRef+3)-ZP1
  842. SCAL=XPT*XVN+YPT*YVN+ZPT*ZVN
  843. XV=XPT-SCAL*XVN
  844. YV=YPT-SCAL*YVN
  845. ZV=ZPT-SCAL*ZVN
  846. Val1=SQRT(GRayon/(XV*XV+YV*YV+ZV*ZV))
  847. XV=XV*Val1-XPT
  848. YV=YV*Val1-YPT
  849. ZV=ZV*Val1-ZPT
  850. Val2=SQRT(XV*XV+YV*YV+ZV*ZV)
  851. IF (ABS(Val2-PRayon).LE.CRIT) THEN
  852. INDIC(IP)=IPoin
  853. NBON=NBON+1
  854. ENDIF
  855. ENDDO
  856. ENDIF
  857. C Creation du maillage de sortie
  858. C ----------------------
  859. IF (NBON.EQ.0) THEN
  860. CALL ERREUR(18)
  861. SEGSUP INDIC
  862. RETURN
  863. ENDIF
  864. NBEL=NBELEM
  865. NBNN=1
  866. NBELEM=NBON
  867. NBSOUS=0
  868. NBREF=0
  869. SEGINI IPT1
  870. IPT1.ITYPEL=1
  871. IPLAC=0
  872. DO IP=1,NBEL
  873. IF (INDIC(IP).NE.0) THEN
  874. IPLAC=IPLAC+1
  875. IPT1.NUM(1,IPLAC)=INDIC(IP)
  876. IPT1.ICOLOR(IPLAC)=IDCOUL
  877. ENDIF
  878. ENDDO
  879. SEGSUP INDIC
  880. CALL ACTOBJ('MAILLAGE',IPT1,1)
  881. CALL ECROBJ('MAILLAGE',IPT1)
  882.  
  883. RETURN
  884.  
  885.  
  886.  
  887. 300 CONTINUE
  888. c IF(IIMPI.EQ.333) WRITE(IOIMP,*) 'POINT syntaxe 3 :'
  889. C -------------------------------
  890. C Operateur POINT - syntaxe 3 :
  891. C -------------------------------
  892. C Extraction d'un CHAML ou d'un CHPO du(des) point(s) verifiant une
  893. C condition indiquee par MOT1.
  894. C Geo1 = POINT Che1 Mot1 ...
  895.  
  896. Val1=0.D0
  897. Val2=0.D0
  898. IPList=0
  899. IF (IMM.GT.2) THEN
  900. CALL LIRREE(Val1,1,IRetou)
  901. IF (IERR.NE.0) RETURN
  902. IF (IMM.EQ.9) THEN
  903. CALL LIRREE(Val2,1,IRetou)
  904. IF (IERR.NE.0) RETURN
  905. ENDIF
  906. ENDIF
  907. CALL LIRMOT(MOABS,1,IAB,0)
  908. CALL LIRMOT(MOTAV,2,IAV,0)
  909. IF (IAV.EQ.0) IAV=1
  910.  
  911. CALL LIROBJ('LISTMOTS',IPList,0,IRetou)
  912. IF (IERR.NE.0) RETURN
  913. IF(IRETOU .EQ. 1) THEN
  914. MLMOTS=IPList
  915. SEGACT,MLMOTS
  916. ENDIF
  917.  
  918. CALL QUETYP(MOTTYP,1,IRetou)
  919. CALL LIROBJ(MOTTYP,IPOIN,1,IRetou)
  920. IF (IERR.NE.0) RETURN
  921. CALL ACTOBJ(MOTTYP,IPOIN,1)
  922. IF (IERR.NE.0) RETURN
  923.  
  924. IF (MOTTYP .EQ. 'CHPOINT ') THEN
  925. CALL EXPCHP(IPOIN,IMM,IAB,IAV,IPList,Val1,Val2,IPMAIL)
  926.  
  927. ELSEIF (MOTTYP .EQ. 'MCHAML ') THEN
  928. CALL EXPCHE(IPOIN,IMM,IAB,IAV,IPList,Val1,Val2,IPMAIL)
  929.  
  930. ELSE
  931. CALL ERREUR(686)
  932. RETURN
  933. ENDIF
  934.  
  935. IF (IERR.NE.0) RETURN
  936. CALL ACTOBJ('MAILLAGE',IPMAIL,1)
  937. CALL ECROBJ('MAILLAGE',IPMAIL)
  938.  
  939. END
  940.  
  941.  
  942.  
  943.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales