Télécharger comcho.eso

Retour à la liste

Numérotation des lignes :

comcho
  1. C COMCHO SOURCE BP208322 23/03/10 19:39:22 11626
  2. SUBROUTINE COMCHO
  3. IMPLICIT INTEGER(I-N)
  4. IMPLICIT REAL*8(A-H,O-Z)
  5. C
  6. C=======================================================================
  7. C
  8. C CALCUL DU NOMBRE DE CHOCS (syntaxe par defaut)
  9. C ou DES INDICES DE DEBUT DE CHOCS (syntaxe 'POSI')
  10. C DANS CHAQUE COURBE D'UN OBJET DE TYPE EVOLUTION.
  11. C LE RESULTAT EST UNE LISTENTI.
  12. C
  13. C SYNTAXE 1 : NCHO = COMT EVOL1 (DECL) ;
  14. C SYNTAXE 2 : NCHO (LMIN) (LMAX) (LDEB/LFIN) = COMT EVOL1 (DECL) ('MINI') ('MAXI') ('DEBU'/'FIN') ;
  15. C
  16. C NCHO : OBJET DE TYPE LISTENTI RESULTAT
  17. C EVOL : OBJET DE TYPE EVOLUTIO CONTENANT LES SIGNAUX A TRAITER
  18. C DECL : OBJET DE TYPE FLOTTANT % NIVEAU MAXI DES CHOCS
  19. C DEFINISSANT LE SEUIL D'ACQUISITION
  20. C NCHO : OBJET DE TYPE LISTENTI RESULTAT
  21. C
  22. C BP, 2016-05-02 : ajout syntaxe DEBU/FIN + on reecrit beaucoup
  23. C LP, 2023-02-20 : ajout syntaxe MINI
  24. C
  25. C=======================================================================
  26. C
  27.  
  28. -INC PPARAM
  29. -INC CCOPTIO
  30. -INC SMEVOLL
  31. -INC SMLREEL
  32. -INC SMLENTI
  33. -INC CCREEL
  34. POINTEUR MLREE4.MLREEL
  35. C
  36. PARAMETER (NBMOT=4)
  37. CHARACTER*4 LISMO(NBMOT)
  38. DATA LISMO/'DEBU','FIN','MAXI','MINI'/
  39. LOGICAL ZDEB,ZFIN,ZMAX,ZSEUIL,ZMIN
  40.  
  41.  
  42. C=======================================================================
  43. C LECTURE DES OBJETS EN ENTREE
  44. C=======================================================================
  45.  
  46. C EVOLUTION
  47. CALL LIROBJ('EVOLUTIO',IPEVO,1,IRET)
  48. IF(IERR.NE.0) RETURN
  49. MEVOLL=IPEVO
  50. SEGACT MEVOLL
  51. NC=IEVOLL(/1)
  52.  
  53. C SEUIL (EN %)
  54. CALL LIRREE(DECLEN,0,IDECL)
  55. IF(IERR.NE.0) RETURN
  56. IF(IDECL.EQ.0) THEN
  57. c sqrt(1.E-16)*100 ~ 1.E-6
  58. DECLEN=1.D-6
  59. ELSE
  60. CBP IF((DECLEN.LT.0.D0).OR.(DECLEN.GT.100.D0))THEN
  61. IF((DECLEN.LE.0.D0).OR.(DECLEN.GE.100.D0))THEN
  62. MOTERR(1:8)='DECLENCH'
  63. REAERR(1)=DECLEN
  64. REAERR(2)=0.D0
  65. REAERR(3)=100.D0
  66. CALL ERREUR(42)
  67. RETURN
  68. ENDIF
  69. DECLEN=MAX(DECLEN,(100.D0*XZPREC))
  70. ENDIF
  71.  
  72. C MOTS-CLES
  73. ZDEB=.FALSE.
  74. ZFIN=.FALSE.
  75. ZMAX=.FALSE.
  76. ZMIN=.FALSE.
  77. 10 IPLAC=0
  78. CALL LIRMOT (LISMO,NBMOT,IPLAC,0)
  79. IF(IERR.NE.0) RETURN
  80. IF(IPLAC.NE.0) THEN
  81. IF(IPLAC.EQ.1) ZDEB=.TRUE.
  82. IF(IPLAC.EQ.2) ZFIN=.TRUE.
  83. IF(IPLAC.EQ.3) ZMAX=.TRUE.
  84. IF(IPLAC.EQ.4) ZMIN=.TRUE.
  85. GOTO 10
  86. ENDIF
  87.  
  88. C AIGUILLAGE
  89. IF(ZDEB.OR.ZFIN.OR.ZMAX.OR.ZMIN) GOTO 200
  90.  
  91.  
  92. C=======================================================================
  93. C SYNTAXE 1
  94. C=======================================================================
  95.  
  96. JG=NC
  97. SEGINI MLENTI
  98. IPORE=MLENTI
  99.  
  100. C --- BOUCLE SUR LES COURBES ---
  101. DO 100 IC=1,NC
  102.  
  103. KEVOLL=IEVOLL(IC)
  104. SEGACT KEVOLL
  105. MLREEL=IPROGY
  106. SEGACT MLREEL
  107. L1=PROG(/1)
  108. C
  109. C CALCUL DU NIVEAU DE DECLENCHEMENT
  110. VMAX=0.D0
  111. DO 110 I=1,L1
  112. FORC=ABS(PROG(I))
  113. IF(FORC.GT.VMAX)VMAX=FORC
  114. 110 CONTINUE
  115. SEUIL=VMAX*DECLEN/100.D0
  116. IF(IIMPI.GE.1) WRITE(IOIMP,111)SEUIL
  117. 111 FORMAT(' SEUIL D''ACQUISITION : ',1PE12.5)
  118. C
  119. C COMPTE LE NOMBRE DE CHOCS
  120. NCHO=0
  121. FORC=ABS(PROG(1))
  122. ZSEUIL=FORC.GT.SEUIL
  123. DO 120 I=2,L1
  124.  
  125. FORC=ABS(PROG(I))
  126. IF(ZSEUIL) THEN
  127. * seuil deja depasse au pas precedent : on itere
  128. ZSEUIL=FORC.GT.SEUIL
  129. ELSE
  130. * on etait inferieur, et maintenant ?
  131. ZSEUIL=FORC.GT.SEUIL
  132. * on est sur un front montant
  133. IF(ZSEUIL) NCHO=NCHO+1
  134. ENDIF
  135.  
  136. 120 CONTINUE
  137. C
  138. C DESACTIVE TOUT
  139. SEGDES MLREEL
  140. SEGDES KEVOLL
  141.  
  142. C STOCKAGE DU NOMBRE DE CHOCS
  143. LECT(IC)=NCHO
  144. C
  145. 100 CONTINUE
  146. C --- FIN DE BOUCLE SUR LES COURBES ---
  147. SEGDES MEVOLL
  148. SEGDES MLENTI
  149.  
  150. C ECRITURE DU RESULTAT
  151. CALL ECROBJ('LISTENTI',IPORE)
  152. RETURN
  153.  
  154.  
  155. C=======================================================================
  156. C SYNTAXE 2
  157. C=======================================================================
  158.  
  159. 200 CONTINUE
  160.  
  161. c VERIF COMPATIBILITE
  162. IF(NC.GT.1) THEN
  163. MOTERR(1:8)='EVOLUTIO'
  164. INTERR(1:8)=IPEVO
  165. WRITE(IOIMP,*) 'ERREUR : COMT 2eme syntaxe :'
  166. CALL ERREUR(110)
  167. SEGDES MEVOLL
  168. RETURN
  169. ENDIF
  170.  
  171. IC=1
  172. KEVOLL=IEVOLL(IC)
  173. SEGACT KEVOLL
  174. MLREEL=IPROGY
  175. SEGACT MLREEL
  176. L1=PROG(/1)
  177.  
  178. c CREATION DE OBJETS DE SORTIE
  179. c OPTION DEBU/FIN
  180. JG=L1/2
  181. SEGINI MLENT1,MLENT2
  182. IPOR1=MLENT1
  183. IPOR2=MLENT2
  184. JG1=0
  185. JG2=0
  186. c OPTION MAXI/MINI
  187. JG=L1/2
  188. SEGINI MLREE3,MLREE4
  189. IPOR3=MLREE3
  190. IPOR4=MLREE4
  191.  
  192. C
  193. C CALCUL DU NIVEAU DE DECLENCHEMENT
  194. VMAX=0.D0
  195. DO 210 I=1,L1
  196. FORC=ABS(PROG(I))
  197. IF(FORC.GT.VMAX)VMAX=FORC
  198. 210 CONTINUE
  199. SEUIL=VMAX*DECLEN/100.D0
  200. IF(IIMPI.GE.1) WRITE(IOIMP,111)SEUIL
  201. C
  202. C TROUVONS LES CHOCS
  203. NCHO=0
  204. FORC=ABS(PROG(1))
  205. ZSEUIL=FORC.GT.SEUIL
  206. VMAX=0.D0
  207. VMIN=0.D0
  208. IF(ZSEUIL) THEN
  209. VMAX=FORC
  210. ELSE
  211. VMIN=FORC
  212. ENDIF
  213.  
  214. DO 220 I=2,L1
  215.  
  216. FORC=ABS(PROG(I))
  217. IF(ZSEUIL) THEN
  218. * seuil deja depasse au pas precedent
  219. VMAX=MAX(VMAX,FORC)
  220. ZSEUIL=FORC.GT.SEUIL
  221. IF(.NOT.ZSEUIL) THEN
  222. * on est sur un front descendant
  223. JG2=JG2+1
  224. MLENT2.LECT(JG2)=I
  225. MLREE3.PROG(JG2)=VMAX
  226. VMIN=FORC
  227. c On met 1 pour l'indice de debut si il n'existe pas
  228. c On met la valeur seuil pour le min
  229. c (cas du choc "a cheval" avec le bloc precedent)
  230. IF(JG1.EQ.0) THEN
  231. JG1=JG1+1
  232. MLENT1.LECT(JG1)=1
  233. MLREE4.PROG(JG1)=SEUIL
  234. ENDIF
  235. ENDIF
  236. ELSE
  237. VMIN=MIN(VMIN,FORC)
  238. * on etait inferieur, et maintenant ?
  239. ZSEUIL=FORC.GT.SEUIL
  240. * on est sur un front montant
  241. IF(ZSEUIL) THEN
  242. NCHO=NCHO+1
  243. JG1=JG1+1
  244. MLENT1.LECT(JG1)=I-1
  245. MLREE4.PROG(JG1)=VMIN
  246. VMAX=FORC
  247. ENDIF
  248. ENDIF
  249.  
  250. 220 CONTINUE
  251. C on complete l'indice de fin avec L1 si il n'existe pas
  252. c (cas du choc "a cheval" avec le bloc suivant)
  253. IF(JG2.LT.JG1) THEN
  254. JG2=JG2+1
  255. MLENT2.LECT(JG2)=L1
  256. MLREE3.PROG(JG2)=VMAX
  257. ENDIF
  258. IF(JG1.NE.JG2) WRITE(IOIMP,*) 'PB AVEC LES DIMENSIONS !'
  259. JG=JG1
  260. SEGADJ,MLENT1,MLENT2,MLREE3,MLREE4
  261. C
  262. C DESACTIVE TOUT
  263. SEGDES MLREEL
  264. SEGDES KEVOLL
  265. C
  266. SEGDES MEVOLL
  267. SEGDES MLENT1,MLENT2
  268.  
  269. C ECRITURE DES RESULTATS
  270. c OPTION 'FIN'
  271. IF(ZFIN) THEN
  272. CALL ECROBJ('LISTENTI',IPOR2)
  273. ELSE
  274. SEGSUP,MLENT2
  275. ENDIF
  276. c OPTION 'DEBU'
  277. IF(ZDEB) THEN
  278. CALL ECROBJ('LISTENTI',IPOR1)
  279. ELSE
  280. SEGSUP,MLENT1
  281. ENDIF
  282. c OPTION 'MAXI'
  283. IF(ZMAX) THEN
  284. CALL ECROBJ('LISTREEL',IPOR3)
  285. ELSE
  286. SEGSUP,MLREE3
  287. ENDIF
  288. c OPTION 'MINI'
  289. IF(ZMIN) THEN
  290. CALL ECROBJ('LISTREEL',IPOR4)
  291. ELSE
  292. SEGSUP,MLREE4
  293. ENDIF
  294. CALL ECRENT(NCHO)
  295. RETURN
  296.  
  297. END
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  

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