Télécharger knrf.eso

Retour à la liste

Numérotation des lignes :

knrf
  1. C KNRF SOURCE GOUNAND 25/11/12 21:15:31 12399
  2. SUBROUTINE KNRF(MTABD,MCHELM,MCHPOI,MCHPO2)
  3. IMPLICIT INTEGER(I-N)
  4. IMPLICIT REAL*8 (A-H,O-Z)
  5. C
  6. C*************************************************************************
  7. C
  8. C OBJET : Cree deux CHAMPOINT faces et un mchaml
  9. C CHPC1 contenant la longueur des faces
  10. C ( faux dans le cas 3d )
  11. C CHPC2 contenant la normale aux faces.
  12. C MCHAML orientation (normale entrante ou sortante)
  13. C SYNTAXE : CHPC1 CHPC2 MCHAML = KNRF OBJDOM ;
  14. C
  15. C OBJDOM : TABLE de SOUSTYPE DOMAINE
  16. C
  17. C REMARQUE :
  18. C On verifie que la normale est dans le meme sens que pt1->pt3
  19. C des elements FACEL
  20. C Si pt1=pt3 on oriente la normale vers l'exterieur cad pt1->pt2
  21. C
  22. C Non teste si axisymetrie
  23. C*************************************************************************
  24. C MODIFICATION du 20/11/98
  25. C
  26. C Le calcul de la normale s'effectue a l'aide du jacobien calcule
  27. C par CALJBR (au lieu de CALJQB)
  28. C
  29. C*************************************************************************
  30.  
  31. -INC PPARAM
  32. -INC CCOPTIO
  33. -INC CCGEOME
  34. -INC SMTABLE
  35. POINTEUR MTABD.MTABLE
  36. -INC SMELEME
  37. POINTEUR MELEMC.MELEME,MELEMD.MELEME,MELEMT.MELEME
  38. POINTEUR MELEMF.MELEME
  39. -INC SMCOORD
  40. -INC SMCHPOI
  41. -INC SMCHAML
  42. -INC SMLENTI
  43. -INC SIZFFB
  44. -INC CCREEL
  45. C
  46. PARAMETER (NBO=5)
  47. REAL*8 A2J(2,2,1),A3J(3,3,1),CFT,NORMX,NORMY,NORMZ
  48. REAL*8 LGR,LGR1,LGR2
  49. CHARACTER*8 TYPE,TYPC,NOM0,LIST1(NBO),LIST2(NBO)
  50. C Les elements complets ne sont pas tous implementes
  51. C On se ramene aux elements facep sans le centre de la face
  52. DATA LIST1/'SEG3 ','TRI4 ','TRI7 ','QUA5 ',
  53. & 'QUA9 '/
  54. DATA LIST2/'SEG2 ','TRI3 ','TRI6 ','QUA4 ',
  55. & 'QUA8 '/
  56. C
  57. C Acquisition des connectivites FACEL
  58. C write(6,*)' KNRF '
  59. TYPE=' '
  60. CALL ACMO(MTABD,'FACEL',TYPE,MELEMD)
  61. C write(6,*)' FACEL type=',type
  62. IF(TYPE.NE.'MAILLAGE')GO TO 90
  63. SEGACT MELEMD
  64. IPT2=MELEMD
  65. C
  66. C Acquisition des connectivites FACE
  67. C
  68. TYPE=' '
  69. CALL ACMO(MTABD,'FACE',TYPE,MELEMF)
  70. IF(TYPE.NE.'MAILLAGE')GO TO 90
  71. CALL KRIPAD(MELEMF,MLENTI)
  72. SEGACT MELEMF
  73. C
  74. C Creation du CHPOIN a 3 comp. pour la normale aux faces
  75. C
  76. NC=IDIM
  77. TYPE='FACE'
  78. CALL CRCHPT(TYPE,MELEMF,NC,1,MCHPOI)
  79. CALL LICHT(MCHPOI,MPOVAL,TYPC,IGEOM)
  80. C
  81. C Creation du CHPOIN pour la longueur
  82. C
  83. NC=1
  84. TYPE='FACE'
  85. CALL CRCHPT(TYPE,MELEMF,NC,2,MCHPO2)
  86. CALL LICHT(MCHPO2,MPOVA2,TYPC,IGEOM)
  87. SEGDES MELEMF
  88. C
  89. IAXI = 0
  90. IF(IFOMOD.EQ.0)IAXI=2
  91. C
  92. C Acquisition des connectivites FACEP
  93. C
  94. TYPE=' '
  95. CALL ACMO(MTABD,'FACEP',TYPE,MELEME)
  96. IF(TYPE.NE.'MAILLAGE')GO TO 90
  97. SEGACT MELEME
  98. C
  99. NBSOUS=LISOUS(/1)
  100. IF(NBSOUS.EQ.0)NBSOUS=1
  101. C**********************
  102. C CAS DE LA DIMENSION 2
  103. C**********************
  104. IF (IDIM.EQ.2) THEN
  105. C
  106. DO 1 L=1,NBSOUS
  107. IPT1=MELEME
  108. IF(NBSOUS.NE.1)IPT1=LISOUS(L)
  109. SEGACT IPT1
  110. NP=IPT1.NUM(/1)-1
  111. NEL=IPT1.NUM(/2)
  112. C Toutes les faces sont des SEG3 donc NP=2
  113. IF(NP.NE.2)RETURN
  114. C
  115. C On considere la face sans son centre comme un elt fini SEG2
  116. C
  117. TYPE = NOMS(IPT1.ITYPEL)//' '
  118. CALL OPTLI(IP,LIST1,TYPE,NBO)
  119. IF (IP .EQ. 0) CALL ERREUR(5)
  120. TYPE = LIST2(IP)
  121. CALL KALPBG(TYPE,'FONFORM0',IZFFM)
  122. SEGACT IZFFM*MOD
  123. IZHR=KZHR(1)
  124. SEGACT IZHR*MOD
  125. NES=GR(/1)
  126. NPG=GR(/3)
  127. C Boucle sur toutes les faces pour le paquet L
  128. DO 10 K=1,NEL
  129. NF=LECT(IPT1.NUM(NP+1,K))
  130. C REMPLISSAGE DE XYZ
  131. C ------------------
  132. C
  133. DO 12 I=1,NP
  134. J=IPT1.NUM(I,K)
  135. DO 121 N=1,IDIM
  136. XYZ(N,I)=XCOOR((J-1)*(IDIM+1)+N)
  137. 121 CONTINUE
  138. 12 CONTINUE
  139. C
  140. C CALJBR calcul le jacobien du passage de l'elt de ref.
  141. C a l'elt. reel
  142. C A2J=Jacobien AIRE=detA2J
  143. CALL CALJBR(FN,GR,PG,XYZ,HR,PGSQ,RPG,NES,IDIM,NP,
  144. &NPG,IAXI,AIRE,A2J,SGEN)
  145. C
  146. NORMX=A2J(1,2,1)
  147. NORMY=A2J(2,2,1)
  148. C On verifie que n est dans le meme sens que vec(13) de FACEL
  149. C Calcul de vec(13)
  150. C FACEL est repere par IPT2
  151. J1=IPT2.NUM(1,NF)
  152. J2=IPT2.NUM(2,NF)
  153. JJ2=LECT(J2)
  154. 7 J3=IPT2.NUM(3,NF)
  155. C
  156. IF (J1.eq.J3) THEN
  157. X1=XCOOR((J1-1)*(IDIM+1)+1)
  158. Y1=XCOOR((J1-1)*(IDIM+1)+2)
  159. X2=XCOOR((J2-1)*(IDIM+1)+1)
  160. Y2=XCOOR((J2-1)*(IDIM+1)+2)
  161. SCAL=(X2-X1)*NORMX+(Y2-Y1)*NORMY
  162. SGN=SIGN(1.D0,SCAL)
  163. C
  164. ELSE
  165. X1=XCOOR((J1-1)*(IDIM+1)+1)
  166. Y1=XCOOR((J1-1)*(IDIM+1)+2)
  167. X3=XCOOR((J3-1)*(IDIM+1)+1)
  168. Y3=XCOOR((J3-1)*(IDIM+1)+2)
  169. SCAL=(X3-X1)*NORMX+(Y3-Y1)*NORMY
  170. SGN=SIGN(1.D0,SCAL)
  171. ENDIF
  172. MPOVAL.VPOCHA(JJ2,1)=SGN*NORMX
  173. MPOVAL.VPOCHA(JJ2,2)=SGN*NORMY
  174. C Calcul de la longueur
  175. C
  176. CFT=1.D0
  177. IF(IAXI.NE.0)THEN
  178. TAMP1=(XYZ(1,2)+XYZ(1,1))*0.5D0
  179. TAMP2=(XYZ(2,2)+XYZ(2,1))*0.5D0
  180. ENDIF
  181. C Axisymetrie / ox (non teste)
  182. IF (IAXI.EQ.1) CFT=2.D0*XPI*TAMP2
  183. C Axisymetrie / oy (non teste non plus)
  184. IF (IAXI.EQ.2) CFT=2.D0*XPI*TAMP1
  185. C
  186. MPOVA2.VPOCHA(JJ2,1)=AIRE*CFT
  187. C
  188. C
  189. 10 CONTINUE
  190. C
  191. SEGDES IPT1
  192. 1 CONTINUE
  193. C**********************
  194. C CAS DE LA DIMENSION 3
  195. C**********************
  196. ELSE
  197. C
  198. DO 21 L=1,NBSOUS
  199. IPT1=MELEME
  200. IF(NBSOUS.NE.1)IPT1=LISOUS(L)
  201. SEGACT IPT1
  202. NP=IPT1.NUM(/1)-1
  203. NEL=IPT1.NUM(/2)
  204. C Les elts complets ne sont pas implementes, on utilise
  205. C l'elt. face sans le centre
  206. C
  207. TYPE = NOMS(IPT1.ITYPEL)//' '
  208. CALL OPTLI(IP,LIST1,TYPE,NBO)
  209. IF (IP .EQ. 0) CALL ERREUR(5)
  210. TYPE = LIST2(IP)
  211. C Calcul des fonctions de forme sur l'elt. de reference
  212. C
  213. CALL KALPBG(TYPE,'FONFORM0',IZFFM)
  214. SEGACT IZFFM*MOD
  215. IZHR=KZHR(1)
  216. SEGACT IZHR*MOD
  217. NES=GR(/1)
  218. NPG=GR(/3)
  219. C Boucle sur les faces du paquet L
  220. DO 210 K=1,NEL
  221. NF=LECT(IPT1.NUM(NP+1,K))
  222. C
  223. C REMPLISSAGE DE XYZ
  224. C ------------------
  225. C
  226. DO 212 I=1,NP
  227. J=IPT1.NUM(I,K)
  228. DO 2121 N=1,IDIM
  229. XYZ(N,I)=XCOOR((J-1)*(IDIM+1)+N)
  230. C PRINT*,XY3(N,I)
  231. 2121 CONTINUE
  232. 212 CONTINUE
  233. C
  234. C calcul du jacobien idem dim 2
  235. C
  236. CALL CALJBR(FN,GR,PG,XYZ,HR,PGSQ,RPG,NES,IDIM,NP,
  237. & NPG,IAXI,AIRE,A3J,SGEN)
  238. NORMX=A3J(1,3,1)
  239. NORMY=A3J(2,3,1)
  240. NORMZ=A3J(3,3,1)
  241. C
  242. C On verifie que n est dans le meme sens que vec(13) de FACEL
  243. C Calcul de vec(13)
  244. C FACEL est repere par IPT2
  245. J1=IPT2.NUM(1,NF)
  246. J2=IPT2.NUM(2,NF)
  247. JJ2=LECT(J2)
  248. J3=IPT2.NUM(3,NF)
  249. C
  250. IF (J1.eq.J3) THEN
  251. X1=XCOOR((J1-1)*(IDIM+1)+1)
  252. Y1=XCOOR((J1-1)*(IDIM+1)+2)
  253. Z1=XCOOR((J1-1)*(IDIM+1)+3)
  254. X2=XCOOR((J2-1)*(IDIM+1)+1)
  255. Y2=XCOOR((J2-1)*(IDIM+1)+2)
  256. Z2=XCOOR((J2-1)*(IDIM+1)+3)
  257. C
  258. SCAL=(X2-X1)*NORMX+(Y2-Y1)*NORMY+(Z2-Z1)*NORMZ
  259. SGN=SIGN(1.D0,SCAL)
  260. C
  261. ELSE
  262. X1=XCOOR((J1-1)*(IDIM+1)+1)
  263. Y1=XCOOR((J1-1)*(IDIM+1)+2)
  264. Z1=XCOOR((J1-1)*(IDIM+1)+3)
  265. X3=XCOOR((J3-1)*(IDIM+1)+1)
  266. Y3=XCOOR((J3-1)*(IDIM+1)+2)
  267. Z3=XCOOR((J3-1)*(IDIM+1)+3)
  268. C
  269. SCAL=(X3-X1)*NORMX+(Y3-Y1)*NORMY+(Z3-Z1)*NORMZ
  270. SGN=SIGN(1.D0,SCAL)
  271. ENDIF
  272. C
  273. MPOVAL.VPOCHA(JJ2,1)=SGN*NORMX
  274. MPOVAL.VPOCHA(JJ2,2)=SGN*NORMY
  275. MPOVAL.VPOCHA(JJ2,3)=SGN*NORMZ
  276. C
  277. C Calcul de la surface de la face
  278. C
  279. MPOVA2.VPOCHA(JJ2,1)=AIRE
  280. 210 CONTINUE
  281. C
  282. SEGDES IPT1
  283. 21 CONTINUE
  284. C
  285. ENDIF
  286. C
  287. C Orientation des normales (partie non modifiee)
  288. C
  289. SEGDES MELEMD,MELEME
  290. SEGDES MCHPOI,MPOVAL,MCHPO2,MPOVA2
  291. C
  292. TYPE=' '
  293. CALL ACMO(MTABD,'ELTFA',TYPE,MELEMT)
  294. IF(MELEMT.EQ.0)GO TO 90
  295.  
  296. TYPE=' '
  297. CALL ACMO(MTABD,'CENTRE',TYPE,MELEMC)
  298. IF(MELEMC.EQ.0)GO TO 90
  299. SEGACT MELEMC
  300.  
  301. TYPE=' '
  302. CALL ACMO(MTABD,'FACEL',TYPE,MELEMF)
  303. IF(MELEMF.EQ.0)GO TO 90
  304. SEGACT MELEMF
  305. CALL CRCHPE(MELEMT,1,MCHELM)
  306. SEGACT MCHELM
  307. NBSOUS=IMACHE(/1)
  308. C
  309. K0=0
  310. DO 41 L=1,NBSOUS
  311. MCHAML=ICHAML(L)
  312. SEGACT MCHAML
  313. MELVAL=IELVAL(1)
  314. SEGACT MELVAL*MOD
  315. IPT1=IMACHE(L)
  316. SEGACT IPT1
  317. NF=IPT1.NUM(/1)
  318. NEL=IPT1.NUM(/2)
  319. DO 42 K=1,NEL
  320. K0=K0+1
  321. NE=MELEMC.NUM(1,K0)
  322. DO 421 I=1,NF
  323. KF=IPT1.NUM(I,K)
  324. KF=LECT(KF)
  325. N1=MELEMF.NUM(1,KF)
  326. N3=MELEMF.NUM(3,KF)
  327. C
  328. IF(NE.EQ.N1)THEN
  329. C La normale est sortante
  330. A=1.D0
  331. ELSEIF(NE.EQ.N3)THEN
  332. C La normale est entrante
  333. A=-1.D0
  334. ELSE
  335. WRITE(6,*)'Problemes dans KNRF NE,N1,N3=',NE,N1,N3
  336. A=0.
  337. ENDIF
  338. C
  339. VELCHE(I,K)=A
  340. C
  341. 421 CONTINUE
  342. 42 CONTINUE
  343. SEGDES MELVAL,MCHAML
  344. SEGDES IPT1
  345. 41 CONTINUE
  346. SEGSUP MLENTI
  347. SEGDES MCHELM
  348. SEGDES MELEMC,MELEMF
  349. C Normales aux faces par element
  350. C write(6,*)' faces elt Normales aire',MCHELM,MCHPOI,MCHPO2
  351. C CALL ECROBJ('MCHAML ',MCHELM)
  352. C Normales aux faces
  353. C CALL ECROBJ('CHPOINT ',MCHPOI)
  354. C aire des faces
  355. C CALL ECROBJ('CHPOINT ',MCHPO2)
  356. RETURN
  357. C
  358. 90 CONTINUE
  359. WRITE(6,*)' Interruption anormale de KNRF'
  360. RETURN
  361. END
  362.  
  363.  

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