Télécharger komcha.eso

Retour à la liste

Numérotation des lignes :

komcha
  1. C KOMCHA SOURCE CB215821 25/06/30 21:15:03 12305
  2. SUBROUTINE KOMCHA(IPTR,IPMAIL,CONM,IPNOMC,MOTYPE,ICOND,INFOS,
  3. & NINFO,IPTVAL)
  4.  
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8(A-H,O-Z)
  7. C--------------------------------------------------------------------*
  8. C *
  9. C Recherche des valeurs des composantes dans les MELVAL d'un *
  10. C CHAMELEM. On distingue les composantes obligatoires des *
  11. C composantes facultatives. *
  12. C *
  13. C--------------------------------------------------------------------*
  14. C *
  15. C Entrées: *
  16. C *
  17. C IPTR pointeur sur le MCHAML *
  18. C IPMAIL sous zone élémentaire de l'objet MAILLAGE *
  19. C pointée par le MODELE *
  20. C CONM nom du constituant de la sous-zone *
  21. C IPNOMC pointeur sur les listes de composantes *
  22. C obligatoires et facultatives (ACTIF E/S) *
  23. C MOTYPE pointeur sur un segment definissant les types des *
  24. C composantes cherchees (ACTIF E/S) *
  25. C Si le segment est vide, on ne fait pas la *
  26. C verification sur les types *
  27. C ICOND lecture impérative ou non des composantes *
  28. C obligatoires ( 1 si oui, 0 sinon ) *
  29. C AM 8/12/93 ( on ajoute le cas icond = 2 qui est une lecture *
  30. C imperative mais sans test sur le nom de la *
  31. C composante si le MCHAML n'a qu'une composante *
  32. C et que l'on ne cherche qu'une composante) *
  33. C ( utilisé dans MATER et MANU ) *
  34. C INFOS les INFOS à comparer à INFCHE *
  35. C NINFO leur nombre *
  36. C *
  37. C SORTIES: *
  38. C *
  39. C IPTVAL pointeur pointant sur le tableau de pointeur *
  40. C associé a tous les MELVAL correspondant à la *
  41. C sous zone (ACTIF S) *
  42. C = 0 en cas d'ERREUR *
  43. C *
  44. C--------------------------------------------------------------------*
  45. C *
  46. C Remarques *
  47. C *
  48. C on commence par ne tester l'identité des géométries que sur les *
  49. C pointeurs. Sans succès, on teste ensuite sur le contenu des *
  50. C maillages. Ainsi, dans le cas où des pointeurs conviennent, *
  51. C on s'arrête sans regarder si d'autres maillages conviendraient *
  52. C aussi, sans pour autant avoir le bon pointeur. *
  53. C *
  54. C on ne teste le constituant que s'il y a plusieurs sous-chamelem *
  55. C éligibles *
  56. C *
  57. C--------------------------------------------------------------------*
  58. C *
  59. C PM : 08/08/2006 *
  60. C si lecture facultative seulement et aucune composante lue *
  61. C alors renvoie un segment vide (NSR=0,NCOSOR=0) *
  62. C *
  63. C--------------------------------------------------------------------*
  64.  
  65. -INC PPARAM
  66. -INC CCOPTIO
  67.  
  68. -INC SMCHAML
  69.  
  70. -INC TMPTVAL
  71.  
  72. SEGMENT NOMID
  73. CHARACTER*8 LESOBL(NBROBL),LESFAC(NBRFAC)
  74. ENDSEGMENT
  75.  
  76. SEGMENT NOTYPE
  77. CHARACTER*16 TYPE(NBTYPE)
  78. ENDSEGMENT
  79.  
  80. LOGICAL LOG
  81. CHARACTER*4 NOHA
  82. INTEGER*4 IHA
  83. EQUIVALENCE(NOHA,IHA)
  84. DATA NOHA/'NOHA'/
  85. CHARACTER*(NCONCH) CONM
  86. INTEGER INFOS(*)
  87.  
  88. IF (IIMPI.GT.0) write (IOIMP,*) 'komcha'
  89.  
  90. NOMID=IPNOMC
  91. NBROBL=LESOBL(/2)
  92. NBRFAC=LESFAC(/2)
  93.  
  94. NOTYPE=MOTYPE
  95. NBTYPE=TYPE(/2)
  96.  
  97. MCHELM=IPTR
  98.  
  99. N1 = IMACHE(/1)
  100. N3 = INFCHE(/2)
  101. NN3 = MIN(N3,NINFO)
  102.  
  103. NSR = N1
  104. ** on ne se sert pas de ncosor avant le segadj final
  105. ** NCOSOR = NSR * ( NBROBL + NBRFAC )
  106. NCOSOR = 0
  107. SEGINI MPTVAL
  108. IPTVAL=MPTVAL
  109. C
  110. C Recherche du ICHAML correspondant à la zone élémentaire
  111. C pointée par le modèle
  112. C
  113. C Nombre de sous-zones du chamelem éligibles
  114. INS=0
  115. LOG = .FALSE.
  116. DO I=1,N1
  117. IF (IPMAIL.EQ.IMACHE(I)) INS=INS+1
  118. IF (CONCHE(I).NE.' ') LOG = .TRUE.
  119. ENDDO
  120. C
  121. C AM 16/03/07
  122. C EN CAS DE CONSTITUANTS TOUS ' ', ON APELLE
  123. C TESTMA AVEC LOG = .FALSE. AU LIEU DE .TRUE.
  124. C
  125. NS = 0
  126. C
  127. DO 1 I=1,N1
  128. C ON IDENTIFIE LE ICHAML
  129. C
  130. C on ne teste l'identité des géométries que sur les pointeurs
  131. C write (6,*) ' komcha i conm conche',i,conm,conche(i)
  132. IF ( IPMAIL.NE.IMACHE(I) .OR.
  133. & (INS.GE.1.AND.CONM.NE.CONCHE(I)) ) GOTO 1
  134. cjk148537 & (INS.NE.1.AND.CONM.NE.CONCHE(I)) ) GOTO 1
  135. C
  136. C ON VERIFIE LA COMPATIBILITE DES INFOS
  137. C
  138. DO J=1,NN3
  139. C test numéro d'harmonique
  140. IF(INFOS(J).NE.INFCHE(I,J).AND.(IHA.NE.INFCHE(I,J))) GOTO 1
  141. ENDDO
  142. NS=NS+1
  143. IF (NS.GT.NSR) THEN
  144. ** write(6,*) ' extension 1 ',ns,nsr
  145. NSR = NS*2
  146. SEGADJ MPTVAL
  147. ENDIF
  148. IPOS(NS) = I
  149. 1 CONTINUE
  150. C
  151. IF (NS.EQ.0) THEN
  152. C Aucun pointeur ne correspond
  153. C On teste alors les maillages eux-mêmes et leurs points
  154. CALL TESTMA(IPTR,IPMAIL,LOG,CONM,IPTRET,IMODI)
  155. IF (IERR.NE.0) RETURN
  156. IF (IPTRET.EQ.0) THEN
  157. if (icond.gt.0) then
  158. C On n'a pas trouvé, dans un CHAMELEM, de zone géométrique ou
  159. C de constituant correspondant à l'objet MODELE
  160. CALL ERREUR(472)
  161. RETURN
  162. else
  163. NSR = 0
  164. NCOSOR = 0
  165. SEGADJ, MPTVAL
  166. RETURN
  167. endif
  168. ENDIF
  169.  
  170. C on a trouvé un sous-maillage
  171. MCHELM=IPTRET
  172. N1 = IMACHE(/1)
  173. N3 = INFCHE(/2)
  174. NN3 = MIN(N3,NINFO)
  175. C
  176. C ON VERIFIE A NOUVEAU LA COMPATIBILITE DES INFOS
  177. C
  178. DO 11 I=1,N1
  179. IF (NN3.EQ.0) THEN
  180. NS=NS+1
  181. C write (6,*) ' komcha-3 ns i ',ns,i
  182. ELSE
  183. DO J=1,NN3
  184. C test numéro d'harmonique
  185. IF (INFOS(J).NE.INFCHE(I,J).AND.(IHA.NE.INFCHE(I,J))) GOTO 11
  186. ENDDO
  187. NS=NS+1
  188. C write (6,*) ' komcha-4 ns i j ',ns,i,j
  189. ENDIF
  190. IF (NS.GT.NSR) THEN
  191. NSR = NS*2
  192. ** write(6,*) ' extension 2 ',ns,nsr
  193. SEGADJ MPTVAL
  194. ENDIF
  195. IPOS(NS) = I
  196. 11 CONTINUE
  197. ENDIF
  198. C
  199. C TEST SUR LA NULLITE DE NS AM
  200. IF (NS.EQ.0) THEN
  201. C la sous zone de maillage %i1 et de constituant %m1:16 a des
  202. C informations relatives au champ ( infche) erronnées
  203. MOTERR = CONM
  204. INTERR(1) = IPMAIL
  205. CALL ERREUR(877)
  206. RETURN
  207. ENDIF
  208.  
  209. C-- Identification sur les autres critères
  210. IF(NSR.NE.NS .OR. NCOSOR.NE.NS*(NBROBL+NBRFAC))THEN
  211. NSR = NS
  212. NCOSOR= NS * ( NBROBL + NBRFAC )
  213. ** write(6,*) 'komcha ipos nsr ',ipos(/1),nsr
  214. SEGADJ,MPTVAL
  215. ENDIF
  216. C
  217. LECAPA=0
  218. IF (ICOND.EQ.2 .AND. NS.EQ.1 .AND. NBROBL.EQ.1 .AND. NBRFAC.EQ.0)
  219. & LECAPA=1
  220. C
  221. DO JJ=1,NS
  222. ITAB=1
  223. C
  224. C Activation du ICHAML
  225. C
  226. MCHAML=ICHAML(IPOS(JJ))
  227. IF(NOMCHE(/2).NE.1) LECAPA=0
  228. C
  229. C Composantes obligatoires
  230. NSOF(JJ)=0
  231. DO IC1=1,nbrobl
  232. CALL PLACE(NOMCHE,NOMCHE(/2),IPLAC,LESOBL(IC1-ITAB+1))
  233. C DO III=1,NOMCHE(/2)
  234. C PRINT *,'KOMCHA_a:',IC1,':',LESOBL(IC1-ITAB+1),':',
  235. C & III,':',NOMCHE(III),':',IPLAC
  236. C ENDDO
  237. C PRINT *,' '
  238. IF (IPLAC.EQ.0.AND.LECAPA.EQ.1) IPLAC=1
  239. IF (IPLAC.NE.0) THEN
  240. C une seule zone autorisee PV
  241. if (ival(ic1).ne.0) then
  242. interr(1)=ipmail
  243. moterr=conm
  244. call erreur(769)
  245. RETURN
  246. endif
  247.  
  248. NSOF(JJ)=NSOF(JJ)+1
  249. IVAL(IC1)=IELVAL(IPLAC)
  250. MELVAL=IELVAL(IPLAC)
  251. C Vérification du type si donné
  252. IF (NBTYPE.EQ.0) GO TO 7
  253. ICMN=MIN(IC1,NBTYPE)
  254. IF (TYPE(ICMN).NE.TYPCHE(IPLAC)
  255. $ .AND.TYPE(ICMN).NE.' ') THEN
  256. MOTERR(1:16) = TYPCHE(IPLAC)
  257. MOTERR(17:24) = LESOBL(IC1-ITAB+1)
  258. MOTERR(25:40) = TITCHE
  259. CALL ERREUR(552)
  260. RETURN
  261. ENDIF
  262. 7 TYVAL(IC1)=TYPCHE(IPLAC)
  263. ENDIF
  264. ENDDO
  265. C
  266. C Composantes facultatives
  267. NBOFAC=0
  268. ITAB=ITAB+NBROBL
  269. DO IC2=ITAB,NBRFAC+ITAB-1
  270. IVAL(IC2)=0
  271. CALL PLACE(NOMCHE,NOMCHE(/2),IPLAC,LESFAC(IC2-ITAB+1))
  272. IF (IPLAC.NE.0) THEN
  273. if (ival(ic2).ne.0) then
  274. interr(1)=ipmail
  275. moterr=conm
  276. call erreur(769)
  277. RETURN
  278. ENDIF
  279. NSOF(JJ)=NSOF(JJ)+1
  280. IVAL(IC2)=IELVAL(IPLAC)
  281. MELVAL=IELVAL(IPLAC)
  282. * verif iplac pas deja rencontre: lesfac en double
  283. do ic3=itab,ic2-1
  284. if(lesfac(ic2-itab+1).eq.lesfac(ic3-itab+1)) then
  285. write(6,*) 'ic2 ic3 melval ielval',ic2,ic3,
  286. > melval,ielval(ic3)
  287. moterr(1:16)=lesfac(ic2-itab+1)
  288. call erreur(1144)
  289. RETURN
  290. endif
  291. enddo
  292. C Vérification du type si donné
  293. IF(NBTYPE.EQ.0) GO TO 8
  294. ICMN=MIN(IC2,NBTYPE)
  295. IF (TYPE(ICMN).NE.TYPCHE(IPLAC)
  296. $ .AND.TYPE(ICMN).NE.' ') THEN
  297. MOTERR(1:16)=TYPCHE(IPLAC)
  298. MOTERR(17:24)=LESFAC(IC2-ITAB+1)
  299. MOTERR(25:40)=TITCHE
  300. CALL ERREUR(552)
  301. RETURN
  302. ENDIF
  303. 8 TYVAL(IC2)=TYPCHE(IPLAC)
  304. NBOFAC=NBOFAC+1
  305. ENDIF
  306. ENDDO
  307.  
  308. CPM si lecture facultative seulement et aucune composante lue
  309. CPM alors renvoie un segment vide (NS=0,NCOSOU=0)
  310. IF (NBROBL.EQ.0 .AND. NBRFAC.GT.0) THEN
  311. * write(6,*) 'komcxha',ns,nbofac
  312. IF (NS.EQ.0 .AND. NBOFAC.EQ.0) THEN
  313. NSR = 0
  314. NCOSOR = 0
  315. SEGADJ, MPTVAL
  316. ENDIF
  317. c IF (NBOFAC.EQ.0) THEN
  318. c ncosor = 0
  319. c segadj,mptval
  320. c ENDIF
  321. ENDIF
  322.  
  323. CPM ITAB n'est plus utilisé par la suite.
  324. CPM ITAB=ITAB+NBRFAC
  325. C
  326. ENDDO
  327. C verification que les composantes obligatoires sont toutes presentes
  328. DO IC1=1,NBROBL
  329. c write(6,*) 'kx4', lesobl(ic1),ival(ic1)
  330. IF (ival(ic1).eq.0) then
  331. IF (ICOND.EQ.1 .OR. ICOND.EQ.2) THEN
  332. MOTERR(1:8) =LESOBL(IC1)
  333. MOTERR(9:16)=TITCHE
  334. CALL ERREUR(77)
  335. RETURN
  336. ELSE
  337. C Données incompatibles
  338. ** CALL ERREUR(21)
  339. ENDIF
  340. ENDIF
  341. ENDDO
  342.  
  343. RETURN
  344. END
  345.  
  346.  

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