Télécharger vnimp.eso

Retour à la liste

Numérotation des lignes :

vnimp
  1. C VNIMP SOURCE FANDEUR 22/01/03 21:15:56 11136
  2. SUBROUTINE VNIMP
  3. C************************************************************************
  4. C
  5. C************************************************************************
  6.  
  7. IMPLICIT INTEGER(I-N)
  8. IMPLICIT REAL*8 (A-H,O-Z)
  9.  
  10.  
  11. -INC PPARAM
  12. -INC CCOPTIO
  13. -INC CCGEOME
  14. -INC SIZFFB
  15. POINTEUR IZF1.IZFFM,IZH2.IZHR
  16.  
  17. -INC SMCOORD
  18. -INC SMLENTI
  19. -INC SMELEME
  20. POINTEUR MELEM1.MELEME,MELEMS.MELEME,MELEML.MELEME
  21. POINTEUR MELENE.MELEME,MELEMQ.MELEME
  22. -INC SMCHPOI
  23. POINTEUR IZTU1.MPOVAL,IZTU2.MPOVAL,VNORM.MPOVAL
  24.  
  25. -INC CCREEL
  26. -INC SMLMOTS
  27. POINTEUR LINCO.MLMOTS
  28. CHARACTER*8 TYPE,TYPC
  29. CHARACTER*(LOCOMP) NOMP,NOMI,NOM,NOM0,NOMZ
  30. PARAMETER (NTB=1)
  31. CHARACTER*8 LTAB(NTB)
  32. DIMENSION KTAB(NTB),IXV(3),RO(1)
  33. DATA LTAB/'KIZX '/,RO/1.D0/
  34. C*****************************************************************************
  35. CVNIMP
  36. C write(6,*)' DEBUT VNIMP '
  37.  
  38. IAXI=0
  39. IF(IFOMOD.EQ.0)IAXI=2
  40.  
  41. DEUPI=1.D0
  42. IF(IAXI.NE.0)DEUPI=2.D0*XPI
  43.  
  44. CALL LITABS(LTAB,KTAB,NTB,1,IRET)
  45. IF (IERR.NE.0) RETURN
  46. MTABX=KTAB(1)
  47. C
  48. C- Récupération de la table EQEX (pointeur MTAB1)
  49. C
  50. CALL LEKTAB(MTABX,'EQEX',MTAB1)
  51. IF(MTAB1.EQ.0)THEN
  52. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  53. MOTERR( 1: 8) = ' EQEX '
  54. MOTERR( 9:16) = ' EQEX '
  55. MOTERR(17:24) = ' KIZX '
  56. CALL ERREUR(786)
  57. RETURN
  58. ENDIF
  59.  
  60. C
  61. C- Récupération de la table INCO (pointeur KINC)
  62. C
  63. CALL LEKTAB(MTAB1,'INCO',KINC)
  64. IF(KINC.EQ.0)THEN
  65. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  66. MOTERR( 1: 8) = ' INCO '
  67. MOTERR( 9:16) = ' INCO '
  68. MOTERR(17:24) = ' EQEX '
  69. CALL ERREUR(786)
  70. RETURN
  71. ENDIF
  72.  
  73. C*****************************************************************************
  74. C OPTIONS
  75. C KIMPL = 0 -> EXPL 1 -> IMPL 2 -> SEMI
  76. C KFORM = 0 -> SI 1 -> EF 2 -> VF 3 -> EFMC
  77. C IDCEN = 0-> rien 1-> CENTREE 2-> SUPGDC 3-> SUPG 4-> TVISQUEU 5-> CNG
  78.  
  79. C
  80. C- Récupération de la table des options KOPT (pointeur KOPTI)
  81. C
  82. CALL LEKTAB(MTABX,'KOPT',KOPTI)
  83. IF (KOPTI.EQ.0) THEN
  84. C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24
  85. MOTERR( 1: 8) = ' KOPT '
  86. MOTERR( 9:16) = ' KOPT '
  87. MOTERR(17:24) = ' KIZX '
  88. CALL ERREUR(786)
  89. RETURN
  90. ENDIF
  91.  
  92. CALL ACME(KOPTI,'KIMPL',KIMPL)
  93. CALL ACME(KOPTI,'KPOIN',KPRE)
  94. CALL ACME(KOPTI,'KFORM',KFORM)
  95.  
  96. IF (IERR.NE.0) RETURN
  97.  
  98. C write(6,*)' Apres les options '
  99. C*****************************************************************************
  100. C
  101. C- Récupération de la table DOMAINE associée au domaine local
  102. C
  103. CALL ACMM(MTABX,'NOMZONE',NOMZ)
  104. TYPE=' '
  105. CALL ACMO(MTABX,'DOMZ',TYPE,MMODEL)
  106. IF(TYPE.NE.'MMODEL')THEN
  107. C On attend un des objets : %m1:8 %m9:16 %m17:24 %m25:32 %m33:40
  108. MOTERR( 1: 8) = ' MMODEL '
  109. MOTERR( 8:16) = ' MMODEL '
  110. MOTERR(17:24) = ' MMODEL '
  111. MOTERR(25:32) = ' MMODEL '
  112. MOTERR(33:40) = ' MMODEL '
  113. CALL ERREUR(471)
  114. RETURN
  115. ENDIF
  116.  
  117. C E/ MMODEL : Pointeur de la table contenant l'information cherchée
  118. C /S IPOINT : Pointeur sur la table DOMAINE
  119. C /S INEFMD : Type formulation INEFMD=1 LINE,=2 MACRO,=3 QUADRATIQUE
  120. C INEFMD=4 LINB
  121.  
  122. CALL LEKMOD(MMODEL,MTABZ,INEFMD)
  123.  
  124. IF(INEFMD.EQ.4.AND.KPRE.NE.5)THEN
  125. C% Données incompatibles
  126. CALL ERREUR(21)
  127. RETURN
  128. ENDIF
  129.  
  130. CALL LEKTAB(MTABZ,'MAILLAGE',MELEME)
  131. CALL LEKTAB(MTABZ,'SOMMET',MELEMS)
  132. CALL LEKTAB(MTABZ,'MLGVNIMP',MELEML)
  133. IF(KPRE.EQ.5)CALL LEKTAB(MTABZ,'MSOMMET',MELEML)
  134. IF(KPRE.EQ.5)CALL LEKTAB(MTABZ,'MMAIL' ,MELENE)
  135.  
  136.  
  137. C*************************************************************************
  138. C VERIFICATIONS SUR LES INCONNUES
  139. C
  140. C- Récupération du nombre d'inconnues et du nom de l'inconnue NOMI
  141. C
  142. TYPE='LISTMOTS'
  143. CALL ACMO(MTABX,'LISTINCO',TYPE,LINCO)
  144. IF (IERR.NE.0) RETURN
  145. SEGACT LINCO
  146. NBINC=LINCO.MOTS(/2)
  147. IF((NBINC.NE.1.AND.NBINC.NE.2).AND.KPRE.NE.5)THEN
  148. C Indice %m1:8 : contient plus de %i1 %m9:16
  149. MOTERR( 1:8) = 'LISTINCO'
  150. INTERR(1) = 1
  151. MOTERR(9:16) = ' MOTS '
  152. CALL ERREUR(799)
  153. RETURN
  154. ELSEIF(NBINC.NE.2.AND.KPRE.EQ.5)THEN
  155. C Indice %m1:8 : contient plus de %i1 %m9:16
  156. MOTERR( 1:8) = 'LISTINCO'
  157. INTERR(1) = 2
  158. MOTERR(9:16) = ' MOTS '
  159. CALL ERREUR(799)
  160. RETURN
  161. ENDIF
  162.  
  163. NOMI=LINCO.MOTS(1)
  164. NOMP='LVNP'
  165. IF(KPRE.EQ.5)NOMP=LINCO.MOTS(2)
  166. C
  167. C- Récupération de l'inconnue
  168. C
  169. TYPE=' '
  170. CALL ACMO(KINC,NOMI,TYPE,MCHPOI)
  171. IF(TYPE.NE.'CHPOINT ')THEN
  172. C Indice %m1:8 : ne contient pas un objet de type %m9:16
  173. MOTERR = 'INC '//NOMI
  174. MOTERR( 9:16) = 'CHPOINT '
  175. CALL ERREUR(800)
  176. RETURN
  177. ELSE
  178. CALL LICHT(MCHPOI,IZTU1,TYPC,MELEM1)
  179. NINKO = IZTU1.VPOCHA(/2)
  180. IF (NINKO.NE.IDIM) THEN
  181. C Indice %m1:8 : Le %m9:16 n'a pas le bon nombre de composantes
  182. MOTERR = 'INC '//NOMI
  183. MOTERR( 9:16) = 'CHPOINT '
  184. CALL ERREUR(784)
  185. RETURN
  186. ENDIF
  187. C On fait pointer ces deux tableaux sur le champ U inconu (tjs présent) pour
  188. C eviter de les enlever lors de l'appel FORTRAN si les options sont absentes
  189. ENDIF
  190.  
  191. IF(KPRE.EQ.5)THEN
  192.  
  193. TYPE=' '
  194. CALL ACMO(KINC,NOMP,TYPE,MCHPO2)
  195. IF(TYPE.NE.'CHPOINT ')THEN
  196. C Indice %m1:8 : ne contient pas un objet de type %m9:16
  197. MOTERR( 1: 8) = 'INC '//NOMP
  198. MOTERR( 9:16) = 'CHPOINT '
  199. CALL ERREUR(800)
  200. RETURN
  201. ELSE
  202. CALL LICHT(MCHPO2,IZTU2,TYPC,MELEM2)
  203. NINK2 = IZTU2.VPOCHA(/2)
  204. IF (NINK2.NE.1) THEN
  205. C Indice %m1:8 : Le %m9:16 n'a pas le bon nombre de composantes
  206. MOTERR( 1: 8) = 'INC '//NOMP
  207. MOTERR( 9:16) = 'CHPOINT '
  208. CALL ERREUR(784)
  209. RETURN
  210. ENDIF
  211. C On fait pointer ces deux tableaux sur le champ U inconu (tjs présent) pour
  212. C eviter de les enlever lors de l'appel FORTRAN si les options sont absentes
  213. ENDIF
  214.  
  215. ENDIF
  216. C*****************************************************************************
  217. C Le domaine de definition est donne par le SPG de la premiere inconnue
  218. C Les inconnues suivantes devront posseder ce meme pointeur
  219. C On verifie que les points de la zone sont tous inclus dans ce SPG
  220.  
  221. CALL KRIPAD(MELEM1,IPADI)
  222.  
  223. CALL VERPAD(IPADI,MELEME,IRET)
  224. IF(IRET.NE.0)THEN
  225. C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique
  226. MOTERR = 'INC '//NOMI
  227. MOTERR(9:16) = 'CHPOINT '
  228. CALL ERREUR(788)
  229. RETURN
  230. ENDIF
  231.  
  232. C*****************************************************************************
  233.  
  234.  
  235.  
  236. C*************************************************************************
  237. C Lecture des coefficients
  238. C Type du coefficient :
  239. C IK1=0 CHPOINT IK1=1 scalaire IK1=2 vecteur
  240. C write(6,*)' Lecture des coefficients '
  241.  
  242. CALL ACME(MTABX,'IARG',IARG)
  243. IF(IARG.LT.2)THEN
  244. C Indice %m1:8 : nombre d'arguments incorrect
  245. MOTERR(1:8) = 'IARG '
  246. CALL ERREUR(804)
  247. RETURN
  248. ENDIF
  249.  
  250. TYPE=' '
  251. CALL ACMO(MTABX,'ARG1',TYPE,MMODER)
  252. IF(TYPE.NE.'MMODEL')THEN
  253. C On attend un des objets : %m1:8 %m9:16 %m17:24 %m25:32 %m33:40
  254. MOTERR( 1: 8) = ' MMODEL '
  255. MOTERR( 8:16) = ' MMODEL '
  256. MOTERR(17:24) = ' MMODEL '
  257. MOTERR(25:32) = ' MMODEL '
  258. MOTERR(33:40) = ' MMODEL '
  259. CALL ERREUR(471)
  260. RETURN
  261. ENDIF
  262.  
  263. C E/ MMODEL : Pointeur de la table contenant l'information cherchée
  264. C /S IPOINT : Pointeur sur la table DOMAINE
  265. C /S INEFMD : Type formulation INEFMD=1 LINE,=2 MACRO,=3 QUADRATIQUE
  266. C INEFMD=4 LINB
  267.  
  268. CALL LEKMOD(MMODER,MTABR,INEFDR)
  269. IF(INEFDR.NE.INEFMD)THEN
  270. C% Données incompatibles
  271. CALL ERREUR(21)
  272. RETURN
  273. ENDIF
  274. CALL LEKTAB(MTABR,'SOMMET',MELEMR)
  275. CALL KRIPAD(MELEMR,MLENTI)
  276. CALL VERPAD(MLENTI,MELEMS,IRET)
  277. IF(IRET.NE.0)THEN
  278. C Le support du %m1:8 est incompatible avec celui-ci
  279. MOTERR(1: 8) = 'MODELE'
  280. CALL ERREUR(708)
  281. RETURN
  282. ENDIF
  283. SEGSUP MLENTI
  284.  
  285.  
  286. c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  287. IXV(1)=MELEMS
  288. C IXV(1)=0
  289. IXV(2)=1
  290. IXV(3)=0
  291. CALL LEKCOF('Opérateur VNIMP :',
  292. & MTABX,KINC,2,IXV,IZTG1,VNORM,NPT1,NC1,IK1,IRET)
  293. IF(IRET.EQ.0)RETURN
  294.  
  295. C write(6,*)' Operateur VNIMP : Fin lecture Arguments '
  296. C Fin lecture Arguments ************************************************
  297.  
  298. IF(KPRE.NE.5)THEN
  299. C
  300. C Pressions discontinues
  301. C
  302. CALL LEKTAB(MTABZ,'NORMALEV',MNORM)
  303. CALL LICHT(MNORM,MPOVA2,TYPC,MELEML)
  304.  
  305. NAT=2
  306. NSOUPO=1
  307. SEGACT MELEML
  308. N=MELEML.NUM(/2)
  309. NC=1
  310. SEGINI MCHPO1,MSOUP1,MPOVA1
  311. MCHPO1.IFOPOI=IFOUR
  312. MCHPO1.MOCHDE=' '
  313. MCHPO1.MTYPOI='SMBR'
  314. MCHPO1.JATTRI(1)=2
  315. MCHPO1.IPCHP(1)=MSOUP1
  316. MSOUP1.NOCOMP(1)='LVNP'
  317. MSOUP1.IGEOC=MELEML
  318. MSOUP1.IPOVAL=MPOVA1
  319.  
  320. NRIGE=7
  321. NKID =9
  322. NKMT =7
  323. NMATRI=1
  324. SEGINI MATRIK
  325.  
  326. NBSOUS=1
  327.  
  328. IRIGEL(1,1)=MELEMS
  329. IRIGEL(2,1)=MELEML
  330. IRIGEL(7,1)=4
  331. IF(KFORM.EQ.2)IRIGEL(7,1)=9
  332. NBME=NINKO
  333. SEGINI IMATRI
  334. IRIGEL(4,1)=IMATRI
  335. KSPGP=MELEMS
  336. KSPGD=MELEML
  337. DO 102 I=1,NBME
  338. WRITE(NOM,FMT='(I1)')I
  339. NOM=NOM(1:1)//NOMI(1:LOCOMP-1)
  340. LISPRI(I)= NOM
  341. LISDUA(I)='LVNP'
  342. 102 CONTINUE
  343.  
  344.  
  345. NUTOEL=0
  346. NBEL =MELEML.NUM(/2)
  347. NP =1
  348. MP =1
  349.  
  350. SEGINI IPM1,IPM2
  351. LIZAFM(1,1)=IPM1
  352. LIZAFM(1,2)=IPM2
  353. IF(NBME.EQ.3)THEN
  354. SEGINI IPM3
  355. LIZAFM(1,3)=IPM3
  356. ENDIF
  357.  
  358. DO 301 K=1,NBEL
  359. IPM1.AM(K,1,1)= MPOVA2.VPOCHA(K,1)
  360. IPM2.AM(K,1,1)= MPOVA2.VPOCHA(K,2)
  361. IF(IDIM.EQ.3)IPM3.AM(K,1,1)= MPOVA2.VPOCHA(K,3)
  362. 301 CONTINUE
  363.  
  364. ELSEIF(KPRE.EQ.5)THEN
  365. C
  366. C Cas Pressions continue
  367. C
  368. C write(6,*)'Pressions continue'
  369.  
  370. IF(INEFMD.EQ.2)CALL LEKTAB(MTABZ,'MACRO',MELEME)
  371. CALL LEKTAB(MTABR,'OENVELOP',MCHPOR)
  372. CALL LEKTAB(MTABZ,'QUAF ',MELEMQ)
  373.  
  374. CALL LICHT(MCHPOR,MPOVA3,TYPC,IGEOM)
  375. CALL KRIPAD(IGEOM,MLENT3)
  376.  
  377. NAT=2
  378. NSOUPO=1
  379. SEGACT MELEML
  380. N=MELEML.NUM(/2)
  381. NC=1
  382. SEGINI MCHPO1,MSOUP1,MPOVA1
  383. MCHPO1.IFOPOI=IFOUR
  384. MCHPO1.MOCHDE=' '
  385. MCHPO1.MTYPOI='SMBR'
  386. MCHPO1.JATTRI(1)=2
  387. MCHPO1.IPCHP(1)=MSOUP1
  388. MSOUP1.NOCOMP(1)=NOMP
  389. MSOUP1.IGEOC=MELEML
  390. MSOUP1.IPOVAL=MPOVA1
  391.  
  392. NRIGE=7
  393. NKID =9
  394. NKMT =7
  395. NMATRI=1
  396. SEGINI MATRIK
  397.  
  398. SEGACT MELEME,MELENE
  399. NBSOUS=LISOUS(/1)
  400.  
  401. IRIGEL(1,1)=MELEME
  402. IRIGEL(2,1)=MELENE
  403. IRIGEL(7,1)=-3
  404. NBME=NINKO
  405. NBSOUS=MAX(1,LISOUS(/1))
  406. SEGINI IMATRI
  407. IRIGEL(4,1)=IMATRI
  408. KSPGP=MELEMS
  409. KSPGD=MELEML
  410. DO 202 I=1,NBME
  411. WRITE(NOM,FMT='(I1)')I
  412. NOM=NOM(1:1)//NOMI(1:LOCOMP-1)
  413. LISPRI(I)=NOM
  414. LISDUA(I)=NOMP
  415. 202 CONTINUE
  416.  
  417. SEGACT MELEMQ
  418. NUTOEL=0
  419. DO 203 L=1,MAX(1,LISOUS(/1))
  420. IPT1=MELEME
  421. IPT2=MELENE
  422. IPT3=MELEMQ
  423. IF(LISOUS(/1).NE.0)IPT1=LISOUS(L)
  424. IF(MELENE.LISOUS(/1).NE.0)IPT2=MELENE.LISOUS(L)
  425. IF(MELEMQ.LISOUS(/1).NE.0)IPT3=MELEMQ.LISOUS(L)
  426. SEGACT IPT1,IPT2,IPT3
  427.  
  428. NBEL =IPT1.NUM(/2)
  429. NP =IPT1.NUM(/1)
  430. MP =IPT2.NUM(/1)
  431. NQ =IPT3.NUM(/1)
  432. IF(NQ.EQ.3)THEN
  433. IFA=2
  434. ELSE
  435. IFA=NQ
  436. ENDIF
  437.  
  438.  
  439. SEGINI IPM1,IPM2
  440. LIZAFM(L,1)=IPM1
  441. LIZAFM(L,2)=IPM2
  442. IF(NBME.EQ.3)THEN
  443. SEGINI IPM3
  444. LIZAFM(L,3)=IPM3
  445. ENDIF
  446.  
  447. NOM0=NOMS(IPT1.ITYPEL)
  448. IF(INEFMD.EQ.1)NOM0=NOMS(IPT1.ITYPEL)//'P1P1'
  449. IF(INEFMD.EQ.2)NOM0=NOMS(IPT1.ITYPEL)//'MCF1'
  450. IF(INEFMD.EQ.3)NOM0=NOMS(IPT1.ITYPEL)//'PFP1'
  451. IF(INEFMD.EQ.4)NOM0=NOMS(IPT1.ITYPEL)//'P1P1'
  452.  
  453. CALL KALPBG(NOM0,'FONFORM ',IZFFM)
  454. SEGACT IZFFM*MOD
  455. IZHR=KZHR(1)
  456. IZH2=KZHR(2)
  457. IZF1=KTP(1)
  458. SEGACT IZHR*MOD,IZF1*MOD
  459. NES=GR(/1)
  460. NPG=GR(/3)
  461.  
  462. DO 201 K=1,NBEL
  463.  
  464. DO 20 I=1,NP
  465. J1 = IPT1.NUM(I,K)
  466. DO 10 N=1,IDIM
  467. XYZ(N,I) = XCOOR((J1-1)*(IDIM+1)+N)
  468. 10 CONTINUE
  469. 20 CONTINUE
  470. CALL CALJBR(FN,GR,PG,XYZ,HR,PGSQ,RPG,
  471. & NES,IDIM,NP,NPG,IAXI,AIRE,AJ,ASGN)
  472.  
  473. BSGN=0.D0
  474. DO 21 N=1,IDIM
  475. BSGN=BSGN+
  476. &(AJ(N,IDIM,1)*MPOVA3.VPOCHA(MLENT3.LECT(IPT3.NUM(IFA,K)),N))
  477. 21 CONTINUE
  478. CSGN=-1.D0
  479. IF(BSGN.LT.0.D0)CSGN=1.D0
  480.  
  481. DO I=1,NP
  482. DO J=1,MP
  483. UX=0.D0
  484. UY=0.D0
  485. UZ=0.D0
  486. UT=0.D0
  487. DO 304 LG=1,NPG
  488. UX=UX+FN(I,LG)*IZF1.FN(J,LG)*AJ(1,IDIM,LG)*PGSQ(Lg)*DEUPI*RPG(Lg)
  489. UY=UY+FN(I,LG)*IZF1.FN(J,LG)*AJ(2,IDIM,LG)*PGSQ(Lg)*DEUPI*RPG(Lg)
  490. IF(IDIM.EQ.3)
  491. &UZ=UZ+FN(I,LG)*IZF1.FN(J,LG)*AJ(3,IDIM,LG)*PGSQ(Lg)*DEUPI*RPG(Lg)
  492. 304 CONTINUE
  493. IPM1.AM(K,I,J)= UX*CSGN
  494. IPM2.AM(K,I,J)= UY*CSGN
  495. IF(IDIM.EQ.3)IPM3.AM(K,I,J)= UZ*CSGN
  496. ENDDO
  497. ENDDO
  498. 201 CONTINUE
  499. SEGSUP IZFFM,IZHR,IZH2,IZF1
  500. SEGDES IPT1,IPT2
  501. 203 CONTINUE
  502.  
  503. SEGSUP MLENT3
  504.  
  505. ENDIF
  506.  
  507. CALL ECROBJ('MATRIK',MATRIK)
  508. CALL ECROBJ('CHPOINT',MCHPO1)
  509.  
  510. RETURN
  511. 1001 FORMAT(20(1X,I5))
  512. 1002 FORMAT(10(1X,1PE11.4))
  513. END
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  

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