Télécharger raye1.eso

Retour à la liste

Numérotation des lignes :

raye1
  1. C RAYE1 SOURCE CHAT 12/06/07 21:15:55 7389
  2. SUBROUTINE RAYE1(ICHFAC, INFOEL, MATR)
  3.  
  4. C **********************************************************
  5. C **** SUBROUTINE D'INTERFACAGE CHAMELEM --> MATRICE ****
  6. C **** POUR LES FACTEURS DE FORME ****
  7. C **** ****
  8. C **** En entree : ICHFAC matrice des facteurs de ****
  9. C **** de type CHAMELEM ****
  10. C **** INFOEL segment qui contient la ****
  11. C **** structure COQ ou QUAdratique de la ****
  12. C **** zone étudiée ****
  13. C **** ****
  14. C **** En sortie : MATR matrice des facteurs de forme ****
  15. C **** exploitable par le programme ****
  16. C **** de calcul RAYE3.ESO ****
  17. C **** ****
  18. C **********************************************************
  19.  
  20. IMPLICIT INTEGER(I-N)
  21. IMPLICIT REAL*8 (A-H,O-Z)
  22.  
  23. -INC SMCHAML
  24. -INC SMELEME
  25.  
  26. -INC PPARAM
  27. -INC CCOPTIO
  28.  
  29. C **********************************************************
  30. C **** Declaration de la structure des facteurs ****
  31. C **** de forme ****
  32. C **********************************************************
  33.  
  34. SEGMENT IFACFO
  35. INTEGER LFACT(NBEL1)
  36. ENDSEGMENT
  37. SEGMENT LFAC
  38. REAL*8 FACT(NBEL2)
  39. ENDSEGMENT
  40.  
  41. SEGMENT INFOEL
  42. LOGICAL KCOQ(N1), KQUAD(N1)
  43. ENDSEGMENT
  44.  
  45. C **********************************************************
  46. C **** Declaration des variables du probleme ****
  47. C **********************************************************
  48.  
  49. POINTEUR PSUR.LFAC, PLIGI.LFAC, PLIGS.LFAC, PLIG.LFAC
  50. POINTEUR MATR.IFACFO
  51.  
  52. POINTEUR ISSM.MELEME
  53. POINTEUR ICHFAC.MCHELM
  54. POINTEUR IMCHFA.MCHAML
  55. POINTEUR ISURF.MELVAL
  56.  
  57. C **** Cas des elements COQ en haut ****
  58.  
  59. POINTEUR IFFAS.MELVAL, IFFAI.MELVAL
  60. POINTEUR ISSCHI.MCHELM, ISSCHS.MCHELM
  61. POINTEUR ICHFBI.MCHAML, ICHFBS.MCHAML
  62.  
  63. C **** Cas des elements COQ en haut et en bas ****
  64.  
  65. POINTEUR IFFBII.MELVAL, IFFBIS.MELVAL
  66. POINTEUR IFFBSI.MELVAL, IFFBSS.MELVAL
  67.  
  68. C **** Cas des elements COQ en haut seulement ****
  69.  
  70. POINTEUR IFFBIM.MELVAL, IFFBSM.MELVAL
  71.  
  72.  
  73.  
  74.  
  75. C **** Pas d'elements COQ en haut ****
  76.  
  77. POINTEUR IFFA.MELVAL
  78. POINTEUR ISSCH.MCHELM
  79. POINTEUR ICHFB.MCHAML
  80.  
  81. C **** Cas des elements COQ en bas seulement ****
  82.  
  83. POINTEUR IFFBI.MELVAL, IFFBS.MELVAL
  84.  
  85. C **** Cas ou il n'y a pas d'elements COQ ****
  86.  
  87. POINTEUR IFFB.MELVAL
  88.  
  89. C **********************************************************
  90. C **** Recherche de la position du pointeur donnant ****
  91. C **** les surfaces des elements ****
  92. C **********************************************************
  93.  
  94. IF (IIMPI.GE.4) WRITE(6,*) 'DEBUT DE RAYE1.ESO'
  95.  
  96. SEGACT ICHFAC
  97. NBS = ICHFAC.IMACHE(/1)
  98. C **** NBS designe le nombre de sous maillages de type ****
  99. C **** tri3, qua4 ... ****
  100.  
  101. SEGACT INFOEL
  102. NBEL = 0
  103. DO 10 I = 1, NBS
  104. ISSM = ICHFAC.IMACHE(I)
  105. SEGACT ISSM
  106. NBEL = NBEL + ISSM.NUM(/2)
  107. IF (KCOQ(I)) THEN
  108. C **** S'il y a des elements COQ, on rajoute ****
  109. C **** une ligne. ****
  110. NBEL = NBEL + ISSM.NUM(/2)
  111. ENDIF
  112.  
  113. SEGDES ISSM
  114. 10 CONTINUE
  115. SEGDES INFOEL
  116.  
  117. C **** NBEL designe le nombre total d'elements sur la ****
  118. C **** frontiere du maillage ****
  119.  
  120. NBEL1 = NBEL + 1
  121. C **** On rajoute une dimension a la matrice MATR pour ****
  122. C **** stocker la ligne donnant la surface des elements****
  123. C **** On a donc une matrice de taille NBEL*(NBEL+1) ****
  124.  
  125. SEGINI MATR
  126.  
  127. C **********************************************************
  128. C **** Interface CHAMELEM --> MATRICE ****
  129. C **********************************************************
  130.  
  131. C **********************************************************
  132. C **** PASSAGE DES VALEURS DES SURFACES ****
  133. C **** On calcule d'abord la dimension du vecteur PSUR ****
  134. C **** Theoriquement, on doit trouver Nbel. Par ****
  135. C **** precaution, on le verifie. ****
  136. C **********************************************************
  137.  
  138. SEGACT INFOEL
  139. NBEL2 = 0
  140.  
  141. DO 20 NSMA = 1, NBS
  142. IMCHFA = ICHFAC.ICHAML(NSMA)
  143. meleme=ichfac.imache(NSMA)
  144. segact meleme
  145. nbela= num(/2)
  146. SEGACT IMCHFA
  147. IF (KCOQ(NSMA)) then
  148. nbela=nbela*2
  149. ISURF = IMCHFA.IELVAL(3)
  150.  
  151. else
  152. ISURF = IMCHFA.IELVAL(2)
  153. endif
  154. SEGDES IMCHFA
  155. nbel2=nbel2+nbela
  156. 20 continue
  157. C **********************************************************
  158. C **** Si on a des elements COQ ****
  159. C **********************************************************
  160. * SEGACT IMCHFA
  161. * ISURF = IMCHFA.IELVAL(3)
  162. * SEGDES IMCHFA
  163. *
  164. * SEGACT ISURF
  165. * NBELA = ISURF.VELCHE(/2)
  166. C Rajout du doublement des surfaces
  167. * NBELA = NBELA + NBELA
  168. * SEGDES ISURF
  169. *
  170. C SI KCOQ(NSMA) = FALSE
  171. * ELSE
  172. *
  173. C **********************************************************
  174. C **** Si on n'a pas d'elements COQ ****
  175. C **********************************************************
  176. *
  177. * SEGACT IMCHFA
  178. * ISURF = IMCHFA.IELVAL(2)
  179. * SEGDES IMCHFA
  180. *
  181. * SEGACT ISURF
  182. * NBELA = ISURF.VELCHE(/2)
  183. * SEGDES ISURF
  184. *
  185. * ENDIF
  186. *
  187. * NBEL2 = NBEL2 + NBELA
  188. *
  189. * 20 CONTINUE
  190. IF (IIMPI.GE.4.AND.NBEL.NE.NBEL2) THEN
  191. WRITE(6,*) 'Dimensions incompatibles'
  192. ENDIF
  193.  
  194. SEGINI PSUR
  195.  
  196. K = 0
  197.  
  198. C **** Apres avoir verifie les dimensions, on passe ****
  199. C **** les valeurs dans le vecteur PSUR. ****
  200.  
  201. DO 30 NSMA = 1, NBS
  202. IMCHFA = ICHFAC.ICHAML(NSMA)
  203. meleme= ICHFAC.imache(nsma)
  204.  
  205. IF (KCOQ(NSMA)) THEN
  206.  
  207. C **********************************************************
  208. C **** Si on a des elements COQ ****
  209. C **********************************************************
  210.  
  211. SEGACT IMCHFA
  212. ISURF = IMCHFA.IELVAL(3)
  213. SEGDES IMCHFA
  214. SEGACT ISURF
  215. NBELA = ISURF.VELCHE(/2)
  216.  
  217. DO 40 I = 1, Num(/2)
  218. K = K + 1
  219. ima= min ( i,nbela)
  220. PSUR.FACT(K) = ISURF.VELCHE(1,Ima)
  221. K = K + 1
  222. ima= min ( i,nbela)
  223. PSUR.FACT(K) = ISURF.VELCHE(1,Ima)
  224. IF (IIMPI.GE.4) THEN
  225. WRITE(6,*) 'SURF = ', ISURF.VELCHE(1,Ima)
  226. ENDIF
  227. 40 CONTINUE
  228. SEGDES ISURF
  229.  
  230. C SI KCOQ(NSMA) = FALSE
  231. ELSE
  232.  
  233. C **********************************************************
  234. C **** Si on n'a pas d'elements COQ ****
  235. C **********************************************************
  236.  
  237. SEGACT IMCHFA
  238. ISURF = IMCHFA.IELVAL(2)
  239. SEGDES IMCHFA
  240.  
  241. SEGACT ISURF
  242. NBELA = ISURF.VELCHE(/2)
  243. DO 45 I = 1, Num(/2)
  244. K = K + 1
  245. ima= min( i,nbela)
  246. PSUR.FACT(K) = ISURF.VELCHE(1,Ima)
  247. IF (IIMPI.GE.4) THEN
  248. WRITE(6,*) 'SURF 2= ', ISURF.VELCHE(1,Ima)
  249. ENDIF
  250. 45 CONTINUE
  251. SEGDES ISURF
  252. ENDIF
  253.  
  254. 30 CONTINUE
  255.  
  256. C **** Le vecteur PSUR est de dimension K et est place ****
  257. C **** en derniere ligne de MATR. ****
  258.  
  259. IF (IIMPI.GE.4.AND.K.NE.NBEL2) THEN
  260. WRITE(6,*) 'K = ',K ,'NBEL2 = ', NBEL2
  261. WRITE(6,*) 'Ces deux nombres doivent etre egaux'
  262. ENDIF
  263.  
  264. MATR.LFACT(NBEL1) = PSUR
  265.  
  266. SEGDES PSUR
  267.  
  268. C **********************************************************
  269. C **** PASSAGE DES VALEURS DES FACTEURS DE FORME ****
  270. C **********************************************************
  271.  
  272. C **********************************************************
  273. C **** On se positionne d'abord dans un sous-domaine ****
  274. C **********************************************************
  275.  
  276. I = 0
  277.  
  278. C **** I designe l'indice de la ligne I de la matrice ****
  279. C **** MATR. ****
  280.  
  281. DO 50 NSMA = 1, NBS
  282. IMCHFA = ICHFAC.ICHAML(NSMA)
  283.  
  284. IF (IIMPI.GE.4) THEN
  285. WRITE(6,*) 'DIM INFOEL =', INFOEL.KCOQ(/1)
  286. WRITE(6,*) 'KCOQ = ', KCOQ(NSMA)
  287. ENDIF
  288.  
  289. IF (KCOQ(NSMA)) THEN
  290.  
  291. C **********************************************************
  292. C **** Si on a des elements COQ dans la partie sup ****
  293. C **********************************************************
  294.  
  295. SEGACT IMCHFA
  296. IFFAS = IMCHFA.IELVAL(1)
  297. IFFAI = IMCHFA.IELVAL(2)
  298. SEGDES IMCHFA
  299.  
  300. SEGACT IFFAS, IFFAI
  301. NBELA = IFFAS.IELCHE(/2)
  302.  
  303. IF (IIMPI.GE.4) THEN
  304. WRITE(6,*) 'NBELA = ',NBELA
  305. ENDIF
  306.  
  307. C **** NBELA designe le nombre d'elements du sous ****
  308. C **** domaine d'indice NSMA. ****
  309.  
  310. C **********************************************************
  311. C **** Puis, on pointe sur les numeros des elements du ****
  312. C **** maillage ****
  313. C **********************************************************
  314.  
  315. DO 60 NELMA = 1, NBELA
  316. I = I + 1
  317. ISSCHS = IFFAS.IELCHE(1,NELMA)
  318. ISSCHI = IFFAI.IELCHE(1,NELMA)
  319.  
  320. SEGINI PLIGI, PLIGS
  321. SEGACT ISSCHS
  322. NBS2 = ISSCHS.ICHAML(/1)
  323.  
  324. SEGACT ISSCHI
  325. NBS3 = ISSCHI.ICHAML(/1)
  326. IF (NBS2.NE.NBS3) THEN
  327. WRITE(6,*) 'Erreur de dimension'
  328. ENDIF
  329.  
  330. J = 0
  331.  
  332. C **** J designe l'indice de la colonne J de la ****
  333. C **** matrice MATR. ****
  334.  
  335. DO 70 NSMB = 1, NBS2
  336. IF (KCOQ(NSMB)) THEN
  337.  
  338. C **** S'il y a des elements COQ dans la partie inf ****
  339.  
  340. ICHFBI = ISSCHI.ICHAML(NSMB)
  341. ICHFBS = ISSCHS.ICHAML(NSMB)
  342.  
  343. SEGACT ICHFBI
  344. IFFBII = ICHFBI.IELVAL(1)
  345. IFFBIS = ICHFBI.IELVAL(2)
  346. SEGDES ICHFBI
  347.  
  348. SEGACT ICHFBS
  349.  
  350. IFFBSI = ICHFBS.IELVAL(1)
  351. IFFBSS = ICHFBS.IELVAL(2)
  352. SEGDES ICHFBS
  353.  
  354. SEGACT IFFBII, IFFBIS
  355. SEGACT IFFBSI, IFFBSS
  356. NBELB = IFFBSI.VELCHE(/2)
  357. C **********************************************************
  358. C **** Et enfin, on pointe sur une surface de ce ****
  359. C **** deuxieme domaine. ****
  360. C **********************************************************
  361.  
  362. DO 80 NELB = 1, NBELB
  363. J = J + 1
  364. PLIGI.FACT(J) = IFFBIS.VELCHE(1,NELB)
  365. PLIGS.FACT(J) = IFFBSS.VELCHE(1,NELB)
  366. J = J + 1
  367. PLIGI.FACT(J) = IFFBII.VELCHE(1,NELB)
  368. PLIGS.FACT(J) = IFFBSI.VELCHE(1,NELB)
  369. 80 CONTINUE
  370.  
  371. SEGDES IFFBII, IFFBIS
  372. SEGDES IFFBSI, IFFBSS
  373.  
  374. C **** On a boucle sur tous les elements du sous ****
  375. C **** maillage d'indice NSMB. ****
  376.  
  377.  
  378. C **** si KCOQ(NSMB) = FALSE ****
  379.  
  380. ELSE
  381.  
  382. C **** S'il n'y a pas d'elements COQ dans la partie inf****
  383.  
  384. ICHFBI = ISSCHI.ICHAML(NSMB)
  385. ICHFBS = ISSCHS.ICHAML(NSMB)
  386.  
  387. SEGACT ICHFBI
  388. IFFBIM = ICHFBI.IELVAL(1)
  389. SEGDES ICHFBI
  390.  
  391. SEGACT ICHFBS
  392. IFFBSM = ICHFBS.IELVAL(1)
  393. SEGDES ICHFBS
  394.  
  395.  
  396. SEGACT IFFBSM, IFFBIM
  397. NBELB = IFFBSM.VELCHE(/2)
  398. DO 90 NELB = 1, NBELB
  399. J = J + 1
  400. PLIGI.FACT(J) = IFFBIM.VELCHE(1,NELB)
  401. PLIGS.FACT(J) = IFFBSM.VELCHE(1,NELB)
  402. 90 CONTINUE
  403.  
  404. SEGDES IFFBIM, IFFBSM
  405.  
  406. ENDIF
  407.  
  408. 70 CONTINUE
  409.  
  410. C **** Test de verification ****
  411.  
  412. IF (IIMPI.GE.4) THEN
  413. WRITE(6,*) 'Dimension du vecteur fforme =',J
  414. ENDIF
  415.  
  416. C **** On a boucle sur tous les sous maillages. ****
  417.  
  418. SEGDES ISSCHS, ISSCHI
  419.  
  420. MATR.LFACT(I) = PLIGS
  421. I = I + 1
  422. MATR.LFACT(I) = PLIGI
  423.  
  424. SEGDES PLIGI, PLIGS
  425.  
  426. 60 CONTINUE
  427.  
  428. SEGDES IFFAI, IFFAS
  429.  
  430. C **** si KCOQ(NSMA) = FALSE ****
  431.  
  432. ELSE
  433.  
  434. IF (IIMPI.GE.4) THEN
  435. WRITE(6,*) 'il n''y a pas d''elements COQ en haut'
  436. ENDIF
  437.  
  438. C **********************************************************
  439. C **** SI ON N'A PAS D'ELEMENTS COQ DANS LA PARTIE SUP ****
  440. C **********************************************************
  441.  
  442. SEGACT IMCHFA
  443. IFFA = IMCHFA.IELVAL(1)
  444. SEGDES IMCHFA
  445.  
  446. SEGACT IFFA
  447. NBELA = IFFA.IELCHE(/2)
  448.  
  449. IF (IIMPI.GE.4) THEN
  450. WRITE(6,*) 'NBELA = ',NBELA
  451. ENDIF
  452.  
  453. C **** NBELA designe le nombre d'elements du sous ****
  454. C **** domaine d'indice NSMA. ****
  455.  
  456. C **********************************************************
  457. C **** Puis, on pointe sur les numeros des elements du ****
  458. C **** maillage ****
  459. C **********************************************************
  460.  
  461. DO 160 NELMA = 1, NBELA
  462. I = I + 1
  463. ISSCH = IFFA.IELCHE(1,NELMA)
  464.  
  465. SEGINI PLIG
  466.  
  467. SEGACT ISSCH
  468. J = 0
  469.  
  470. C **** J designe l'indice de la colonne J de la ****
  471. C **** matrice MATR. ****
  472.  
  473. NBS2 = ISSCH.ICHAML(/1)
  474.  
  475. C **** Theoriquement, NBS2 = NBS. ****
  476.  
  477. IF (IIMPI.GE.4.AND.NBS.NE.NBS2) THEN
  478. WRITE(6,*) 'Probleme de dimension'
  479. ENDIF
  480.  
  481. DO 170 NSMB = 1, NBS2
  482. ICHFB = ISSCH.ICHAML(NSMB)
  483.  
  484. IF (KCOQ(NSMB)) THEN
  485.  
  486. C **** S'il y a des elements COQ dans la partie inf ****
  487.  
  488. SEGACT ICHFB
  489. IFFBI = ICHFB.IELVAL(1)
  490. IFFBS = ICHFB.IELVAL(2)
  491. SEGDES ICHFB
  492.  
  493. SEGACT IFFBI
  494. NBELB = IFFBI.VELCHE(/2)
  495. SEGACT IFFBS
  496. DO 180 NELB = 1, NBELB
  497. J = J + 1
  498. PLIG.FACT(J) = IFFBS.VELCHE(1,NELB)
  499. J = J + 1
  500. PLIG.FACT(J) = IFFBI.VELCHE(1,NELB)
  501. 180 CONTINUE
  502.  
  503. SEGDES IFFBI, IFFBS
  504.  
  505. C **** On a boucle sur tous les elements du sous ****
  506. C **** maillage d'indice NSMB. ****
  507.  
  508. C **** si KCOQ(NSMB) = FALSE ****
  509.  
  510. ELSE
  511.  
  512. C **** S'il n'y a pas d'elements COQ dans la partie inf****
  513.  
  514. SEGACT ICHFB
  515. IFFB = ICHFB.IELVAL(1)
  516. SEGDES ICHFB
  517.  
  518. SEGACT IFFB
  519. NBELB = IFFB.VELCHE(/2)
  520. DO 190 NELB = 1, NBELB
  521. J = J + 1
  522. PLIG.FACT(J) = IFFB.VELCHE(1,NELB)
  523. 190 CONTINUE
  524.  
  525. SEGDES IFFB
  526.  
  527. ENDIF
  528.  
  529. 170 CONTINUE
  530.  
  531. C **** Test de verification ****
  532.  
  533. IF (J.NE.NBEL2) THEN
  534. WRITE(6,*) 'Erreur de dimension'
  535. ENDIF
  536.  
  537. C **** On a boucle sur tous les sous maillages. ****
  538.  
  539. SEGDES ISSCH
  540. MATR.LFACT(I) = PLIG
  541. SEGDES PLIG
  542.  
  543. 160 CONTINUE
  544.  
  545.  
  546. C **** On a boucle sur tous les elements du sous ****
  547. C **** maillage d'indice NSMA. ****
  548.  
  549. SEGDES IFFA
  550. ENDIF
  551.  
  552. 50 CONTINUE
  553.  
  554. C **** Test de verification ****
  555.  
  556. IF (IIMPI.GE.4.AND.I.NE.NBEL2) THEN
  557. WRITE(6,*) 'Erreur de dimension'
  558. ENDIF
  559.  
  560. C **** On a boucle sur tous les sous maillages. ****
  561.  
  562. C **********************************************************
  563. C **** Desactivation des segments inutiles ****
  564. C **********************************************************
  565.  
  566.  
  567. SEGDES MATR, INFOEL
  568. SEGDES ICHFAC
  569.  
  570. SEGDES IMCHFA
  571.  
  572. IF (IIMPI.GE.4) WRITE(6,*) 'FIN DE RAYE1.ESO OK'
  573.  
  574. RETURN
  575. END
  576.  
  577.  
  578.  
  579.  
  580.  

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