Télécharger komcha.eso

Retour à la liste

Numérotation des lignes :

komcha
  1. C KOMCHA SOURCE OF166741 25/02/21 21:17:46 12166
  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 (et IERR est aussi non nul) *
  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.  
  156. MCHELM=IPTR
  157.  
  158. IF (IERR.NE.0) GOTO 9999
  159. IF (IPTRET.EQ.0) THEN
  160. if (icond.gt.0) then
  161. C On n'a pas trouvé, dans un CHAMELEM, de zone géométrique ou
  162. C de constituant correspondant à l'objet MODELE
  163. CALL ERREUR(472)
  164. else
  165. NSR = 0
  166. NCOSOR = 0
  167. SEGADJ, MPTVAL
  168. endif
  169. GOTO 9999
  170. ENDIF
  171.  
  172. C on a trouvé un sous-maillage
  173. MCHELM=IPTRET
  174. N1 = IMACHE(/1)
  175. N3 = INFCHE(/2)
  176. NN3 = MIN(N3,NINFO)
  177. C
  178. C ON VERIFIE A NOUVEAU LA COMPATIBILITE DES INFOS
  179. C
  180. DO 11 I=1,N1
  181. IF (NN3.EQ.0) THEN
  182. NS=NS+1
  183. C write (6,*) ' komcha-3 ns i ',ns,i
  184. ELSE
  185. DO J=1,NN3
  186. C test numéro d'harmonique
  187. IF (INFOS(J).NE.INFCHE(I,J).AND.(IHA.NE.INFCHE(I,J))) GOTO 11
  188. ENDDO
  189. NS=NS+1
  190. C write (6,*) ' komcha-4 ns i j ',ns,i,j
  191. ENDIF
  192. IF (NS.GT.NSR) THEN
  193. NSR = NS*2
  194. ** write(6,*) ' extension 2 ',ns,nsr
  195. SEGADJ MPTVAL
  196. ENDIF
  197. IPOS(NS) = I
  198. 11 CONTINUE
  199. ENDIF
  200. C
  201. C TEST SUR LA NULLITE DE NS AM
  202. IF (NS.EQ.0) THEN
  203. C la sous zone de maillage %i1 et de constituant %m1:16 a des
  204. C informations relatives au champ ( infche) erronnées
  205. MOTERR = CONM
  206. INTERR(1) = IPMAIL
  207. CALL ERREUR(877)
  208. GOTO 9999
  209. ENDIF
  210.  
  211. C-- Identification sur les autres critères
  212. IF(NSR.NE.NS .OR. NCOSOR.NE.NS*(NBROBL+NBRFAC))THEN
  213. NSR = NS
  214. NCOSOR= NS * ( NBROBL + NBRFAC )
  215. ** write(6,*) 'komcha ipos nsr ',ipos(/1),nsr
  216. SEGADJ,MPTVAL
  217. ENDIF
  218. C
  219. LECAPA=0
  220. IF (ICOND.EQ.2 .AND. NS.EQ.1 .AND. NBROBL.EQ.1 .AND. NBRFAC.EQ.0)
  221. & LECAPA=1
  222. C
  223. DO JJ=1,NS
  224. ITAB=1
  225. C
  226. C Activation du ICHAML
  227. C
  228. MCHAML=ICHAML(IPOS(JJ))
  229. IF(NOMCHE(/2).NE.1) LECAPA=0
  230. C
  231. C Composantes obligatoires
  232. NSOF(JJ)=0
  233. DO IC1=1,nbrobl
  234. CALL PLACE(NOMCHE,NOMCHE(/2),IPLAC,LESOBL(IC1-ITAB+1))
  235. C DO III=1,NOMCHE(/2)
  236. C PRINT *,'KOMCHA_a:',IC1,':',LESOBL(IC1-ITAB+1),':',
  237. C & III,':',NOMCHE(III),':',IPLAC
  238. C ENDDO
  239. C PRINT *,' '
  240. IF (IPLAC.EQ.0.AND.LECAPA.EQ.1) IPLAC=1
  241. IF (IPLAC.NE.0) THEN
  242. C une seule zone autorisee PV
  243. if (ival(ic1).ne.0) then
  244. interr(1)=ipmail
  245. moterr=conm
  246. call erreur(769)
  247. GOTO 9999
  248. endif
  249. NSOF(JJ)=NSOF(JJ)+1
  250. IVAL(IC1)=IELVAL(IPLAC)
  251. MELVAL=IELVAL(IPLAC)
  252. C Vérification du type si donné
  253. IF (NBTYPE.EQ.0) GO TO 7
  254. ICMN=MIN(IC1,NBTYPE)
  255. IF (TYPE(ICMN).NE.TYPCHE(IPLAC)
  256. $ .AND.TYPE(ICMN).NE.' ') THEN
  257. MOTERR(1:16) = TYPCHE(IPLAC)
  258. MOTERR(17:24) = LESOBL(IC1-ITAB+1)
  259. MOTERR(25:40) = TITCHE
  260. CALL ERREUR(552)
  261. GOTO 9999
  262. ENDIF
  263. 7 TYVAL(IC1)=TYPCHE(IPLAC)
  264. ENDIF
  265. ENDDO
  266. C
  267. C Composantes facultatives
  268. NBOFAC=0
  269. ITAB=ITAB+NBROBL
  270. DO IC2=ITAB,NBRFAC+ITAB-1
  271. IVAL(IC2)=0
  272. CALL PLACE(NOMCHE,NOMCHE(/2),IPLAC,LESFAC(IC2-ITAB+1))
  273. IF (IPLAC.NE.0) THEN
  274. if (ival(ic2).ne.0) then
  275. interr(1)=ipmail
  276. moterr=conm
  277. call erreur(769)
  278. GOTO 9999
  279. ENDIF
  280. NSOF(JJ)=NSOF(JJ)+1
  281. IVAL(IC2)=IELVAL(IPLAC)
  282. MELVAL=IELVAL(IPLAC)
  283. * verif iplac pas deja rencontre: lesfac en double
  284. do ic3=itab,ic2-1
  285. if(lesfac(ic2-itab+1).eq.lesfac(ic3-itab+1)) then
  286. write(6,*) 'ic2 ic3 melval ielval',ic2,ic3,
  287. > melval,ielval(ic3)
  288. moterr(1:16)=lesfac(ic2-itab+1)
  289. call erreur(1144)
  290. goto 9999
  291. endif
  292. enddo
  293. C Vérification du type si donné
  294. IF(NBTYPE.EQ.0) GO TO 8
  295. ICMN=MIN(IC2,NBTYPE)
  296. IF (TYPE(ICMN).NE.TYPCHE(IPLAC)
  297. $ .AND.TYPE(ICMN).NE.' ') THEN
  298. MOTERR(1:16)=TYPCHE(IPLAC)
  299. MOTERR(17:24)=LESFAC(IC2-ITAB+1)
  300. MOTERR(25:40)=TITCHE
  301. CALL ERREUR(552)
  302. GOTO 9999
  303. ENDIF
  304. 8 TYVAL(IC2)=TYPCHE(IPLAC)
  305. NBOFAC=NBOFAC+1
  306. ENDIF
  307. ENDDO
  308.  
  309. CPM si lecture facultative seulement et aucune composante lue
  310. CPM alors renvoie un segment vide (NS=0,NCOSOU=0)
  311. IF (NBROBL.EQ.0 .AND. NBRFAC.GT.0) THEN
  312. * write(6,*) 'komcxha',ns,nbofac
  313. IF (NS.EQ.0 .AND. NBOFAC.EQ.0) THEN
  314. NSR = 0
  315. NCOSOR = 0
  316. SEGADJ, MPTVAL
  317. ENDIF
  318. c IF (NBOFAC.EQ.0) THEN
  319. c ncosor = 0
  320. c segadj,mptval
  321. c ENDIF
  322. ENDIF
  323.  
  324. CPM ITAB n'est plus utilisé par la suite.
  325. CPM ITAB=ITAB+NBRFAC
  326. C
  327. ENDDO
  328. C verification que les composantes obligatoires sont toutes presentes
  329. DO IC1=1,NBROBL
  330. c write(6,*) 'kx4', lesobl(ic1),ival(ic1)
  331. IF (ival(ic1).eq.0) then
  332. IF (ICOND.EQ.1 .OR. ICOND.EQ.2) THEN
  333. MOTERR(1:8) =LESOBL(IC1)
  334. MOTERR(9:16)=TITCHE
  335. CALL ERREUR(77)
  336. ELSE
  337. C Données incompatibles
  338. ** CALL ERREUR(21)
  339. ENDIF
  340. GOTO 9999
  341. ENDIF
  342. ENDDO
  343. C
  344. 9999 CONTINUE
  345. IF (IERR.NE.0) THEN
  346. CALL DTMVAL(IPTVAL,1)
  347. IPTVAL = 0
  348. ENDIF
  349.  
  350. c RETURN
  351. END
  352.  
  353.  
  354.  

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