Télécharger tens2.dgibi

Retour à la liste

Numérotation des lignes :

  1. * fichier : tens2.dgibi
  2. 'OPTI' echo 0 ;
  3. ************************************************************************
  4. ************************************************************************
  5. ************************************************************************
  6. * NOM : TENS2
  7. * DESCRIPTION : Test de la décomposition principale, en particulier
  8. * les valeurs propres et la recomposition.
  9. * On teste les cas où les valeurs propres sont proches.
  10. * TENS PRIN et TENS RECO
  11. * D'autres options de TENS sont egalement testees
  12. * 'INVE' 'DET' pour les matrices de rotation
  13. * (orthonormales non symetriques)
  14. *
  15. * LANGAGE : GIBIANE-CAST3M
  16. * AUTEUR : Stephane GOUNAND (CEA/DES/ISAS/DM2S/SEMT/LTA)
  17. * mel : stephane.gounand@cea.fr
  18. **********************************************************************
  19. * VERSION : v1, 09/10/2025, version initiale
  20. * HISTORIQUE : v1, 09/10/2025, création
  21. * HISTORIQUE :
  22. * HISTORIQUE :
  23. ************************************************************************
  24. *
  25. interact=faux ;
  26. *
  27. * Test si les vecteurs propres sont bien des vecteurs propres
  28. *
  29. 'DEBP' tvectp ;
  30. 'ARGU' tensym*'CHPOINT' ;
  31. 'ARGU' chvecp*'CHPOINT' ;
  32. 'ARGU' tolrel*'FLOTTANT' ;
  33. lok = vrai ;
  34. amax = 'TENS' 'NORMINF' tensym ;
  35. amax = 'BORN' amax 'MINIMUM' ('VALE' 'PETIT') ;
  36. tol = amax '*' tolrel ;
  37. * Passage CHPOINT -> TABLE Tenseur symetrique
  38. ttens = 'TABL' ;
  39. vdim = 'VALE' 'DIME' ;
  40. 'REPE' ii vdim ;
  41. i = &ii ;
  42. ttens . i = 'TABL' ;
  43. 'REPE' ij i ;
  44. j = &ij ;
  45. ngij = 'CHAI' 'G' i j ;
  46. ttens . i . j = 'EXCO' ngij tensym ;
  47. 'SI' ('NEG' i j);
  48. ttens . j . i = ttens . i . j ;
  49. 'FINS' ;
  50. 'FIN' ij ;
  51. 'FIN' ii ;
  52. * Passage CHPOINT -> TABLE Vecteurs propres
  53. tvecp = 'TABL' ;
  54. vdim = 'VALE' 'DIME' ;
  55. 'REPE' ii vdim ;
  56. i = &ii ;
  57. tvecp . i = 'TABL' ;
  58. 'REPE' ij vdim ;
  59. j = &ij ;
  60. ngij = 'CHAI' 'CO' j i ;
  61. tvecp . i . j = 'EXCO' ngij chvecp ;
  62. 'FIN' ij ;
  63. 'FIN' ii ;
  64. * Passage CHPOINT -> TABLE Valeurs propres
  65. tvalp = 'TABL' ;
  66. vdim = 'VALE' 'DIME' ;
  67. 'REPE' ii vdim ;
  68. i = &ii ;
  69. tvalp . i = 'TABL' ;
  70. ngii = 'CHAI' 'SI' i i ;
  71. tvalp . i = 'EXCO' ngii chvecp ;
  72. 'FIN' ii ;
  73. * Verif Vecteurs propres
  74. tprod = 'TABL' ;
  75. 'REPE' ii vdim ;
  76. i = &ii ;
  77. tprod . i = 'TABL' ;
  78. 'REPE' ij vdim ;
  79. j = &ij ;
  80. chprod = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  81. 'REPE' ik vdim ;
  82. k = &ik ;
  83. 'SI' ('EGA' j k) ;
  84. inc = '*' ('-' ttens . k . j tvalp . i) tvecp . i . k ;
  85. 'SINO' ;
  86. inc = '*' ttens . k . j tvecp . i . k ;
  87. 'FINS' ;
  88. chprod = chprod '+' inc ;
  89. 'FIN' ik ;
  90. tprod . i . j = chprod ;
  91. 'FIN' ij ;
  92. 'FIN' ii ;
  93. 'REPE' ii vdim ;
  94. i = &ii ;
  95. 'REPE' ij vdim ;
  96. j= &ij ;
  97. chprod = tprod . i . j ;
  98. vprod = 'MASQ' ('ABS' chprod) 'INFERIEUR' tol ;
  99. nprod = 'MINI' vprod ;
  100. tnprod = '>' nprod 0. ;
  101. lok = lok 'ET' tnprod ;
  102. 'SI' ('NON' tnprod) ;
  103. 'MESS' '!!! Le vecteur i=' i ' nest pas un vecteur propre' ;
  104. * 'MESS' 'par sa composante j=' j ' dont la norme' ' ' nprod ' >' ' ' tol ;
  105. 'MESS' 'par sa composante j=' j ;
  106. nocor = 'POIN' vprod 'MINI' ;
  107. 'MESS' '!!! Nb points a problemes = ' ('NBEL' nocor) ;
  108. 'FINS' ;
  109. 'FIN' ij ;
  110. 'FIN' ii ;
  111. 'SI' ('NON' lok) ; 'ERRE' stop ; 'FINS' ;
  112. 'FINP' lok ;
  113. *
  114. * Test si les colonnes d'une matrice sont bien orthonormales
  115. * (matrice de rotation et matrice de vecteurs propres)
  116. *
  117. 'DEBP' ttensrot ;
  118. 'ARGU' rottot*'CHPOINT' ;
  119. 'ARGU' tol*'FLOTTANT' ;
  120. lok = vrai ;
  121. * Identite
  122. rott1 = 'TENS' 'IDEN' rottot ;
  123. drott1 = '-' rott1 rottot ;
  124. ndrott1 = 'TENS' drott1 'NORMINF' ;
  125. nndrott1 = 'MAXI' ndrott1 'ABS' ;
  126. tdrott1 = '<' nndrott1 tol ;
  127. lok = lok 'ET' tdrott1 ;
  128. 'SI' ('NON' tdrott1) ; 'MESS' '!!! Calcul identite' ' ' nndrott1 ' >' ' ' tol ; 'FINS' ;
  129. * Determinant unite
  130. drott2 = '-' ('TENS' 'DET' rottot) 1. ;
  131. nndrott2 = 'MAXI' drott2 'ABS' ;
  132. tdrott2 = '<' nndrott2 tol ;
  133. lok = lok 'ET' tdrott2 ;
  134. 'SI' ('NON' tdrott2) ; 'MESS' '!!! Determinant non unite' ' ' nndrott2 ' >' ' ' tol ; 'FINS' ;
  135. * Verif orthonormalite
  136. trot = 'TABL' ;
  137. vdim = 'VALE' 'DIME' ;
  138. 'REPE' ii vdim ;
  139. i = &ii ;
  140. trot . i = 'TABL' ;
  141. 'REPE' ij vdim ;
  142. j = &ij ;
  143. ngij = 'CHAI' 'CO' i j ;
  144. trot . i . j = 'EXCO' ngij rottot ;
  145. 'FIN' ij ;
  146. 'FIN' ii ;
  147. * Pscal des colonnes de trot
  148. tpsca = 'TABL' ;
  149. 'REPE' ij vdim ;
  150. j = &ij ;
  151. tpsca . j = 'TABL' ;
  152. 'REPE' ik vdim ;
  153. k = &ik ;
  154. pjk = 'VIDE' 'CHPOINT'/'DISCRET' ;
  155. 'REPE' ii vdim ;
  156. i = &ii ;
  157. pjk = pjk '+' (trot . i . j '*' trot . i . k) ;
  158. 'FIN' ii ;
  159. tpsca . j . k = pjk ;
  160. 'FIN' ik ;
  161. 'FIN' ij ;
  162. * Verif trot orthonormale
  163. 'REPE' ij vdim ;
  164. j = &ij ;
  165. 'REPE' ik vdim ;
  166. k = &ik ;
  167. 'SI' ('EGA' j k) ;
  168. dpsca = (tpsca . j . k) '-' 1.d0 ;
  169. 'SINO' ;
  170. dpsca = tpsca . j . k ;
  171. 'FINS' ;
  172. ddpsca = 'MAXI' dpsca 'ABS' ;
  173. tdpsca = '<' ddpsca tol ;
  174. lok = lok 'ET' tdpsca ;
  175. 'SI' ('NON' tdpsca) ;
  176. 'MESS' '!!! Matrice non orthonormale' ' ' ddpsca ' >' ' ' tol ;
  177. 'MESS' 'colonne' ' ' j '.pscal.colonne' ' ' k '=' ddpsca ;
  178. 'FINS' ;
  179. 'FIN' ik ;
  180. 'FIN' ij ;
  181. * Transpose = inverse
  182. trottot = 'TENS' 'TRANS' rottot ;
  183. irottot = 'TENS' 'INVE' rottot ;
  184. drott3 = '-' trottot irottot ;
  185. ndrott3 = 'TENS' drott3 'NORMINF' ;
  186. nndrott3 = 'MAXI' ndrott3 'ABS' ;
  187. tdrott3 = '<' nndrott3 tol ;
  188. lok = lok 'ET' tdrott3 ;
  189. 'SI' ('NON' tdrott3) ; 'MESS' '!!! Inverse.NE.Transpose' ' ' nndrott3 ' >' ' ' tol ; 'FINS' ;
  190. * Inverse correcte
  191. tirot = 'TABL' ;
  192. vdim = 'VALE' 'DIME' ;
  193. 'REPE' ii vdim ;
  194. i = &ii ;
  195. tirot . i = 'TABL' ;
  196. 'REPE' ij vdim ;
  197. j = &ij ;
  198. ngij = 'CHAI' 'CO' i j ;
  199. tirot . i . j = 'EXCO' ngij irottot ;
  200. 'FIN' ij ;
  201. 'FIN' ii ;
  202. * Produit
  203. vdim = 'VALE' 'DIME' ;
  204. *tprod = 'TABL' ;
  205. 'REPE' ij vdim ;
  206. j = &ij ;
  207. * tprod . j = 'TABL' ;
  208. 'REPE' ik vdim ;
  209. k = &ik ;
  210. ngjk = 'CHAI' 'CO' j k ;
  211. gjk = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  212. 'REPE' ii vdim ;
  213. i = &ii ;
  214. gjk = gjk '+' (trot . j . i '*' trot . i . k) ;
  215. 'FIN' ii ;
  216. * tprod . j .k = gjk ;
  217. 'SI' ('EGA' j k) ;
  218. vref = 1. ;
  219. 'SINO' ;
  220. vref = 0. ;
  221. 'FINS' ;
  222. drott4 = '-' gjk vref ;
  223. nndrott4 = 'MAXI' drott2 'ABS' ;
  224. tdrott4 = '<' nndrott4 tol ;
  225. lok = lok 'ET' tdrott4 ;
  226. 'SI' ('NON' tdrott4) ; 'MESS' '!!! M*M^-1 non unite' ' j=' j ' k =' k ' ' nndrott4 ' >' ' ' tol ; 'FINS' ;
  227. 'FIN' ik ;
  228. 'FIN' ij ;
  229. 'SI' ('NON' lok) ; 'ERRE' stop ; 'FINS' ;
  230. 'FINP' lok ;
  231. *
  232. lok = vrai ;
  233. pet = 'VALE' 'PETIT' ; lpet = 'LOG' pet ;
  234. pre = 'VALE' 'PREC' ; lpre = 'LOG' pre ;
  235. *
  236. tol = '*' pre 10. ;
  237. tolrot = '*' pre 10. ;
  238. tolvecp = '*' pre 30. ;
  239. tolrec3d = '*' pre 30. ;
  240. *
  241. 'OPTION' 'DIME' 1 'ELEM' 'SEG2' ;
  242. 'OPTI' 'MODE' unid plan ;
  243. 'MESS' ' ********** ' ;
  244. 'MESS' ' * 1D * ' ;
  245. 'MESS' ' ********** ' ;
  246. *
  247. nx = 100000 ;
  248. *nx = 3000000 ;
  249. *nx = 1 ;
  250. p1 = 'POIN' 0. ; p2 = 'POIN' 1. ;
  251. el = 'DROI' nx p1 p2 ;
  252. mod = 'MODE' el 'MECANIQUE' ;
  253. * Scaling global des termes de la matrice
  254. puig = 'BRUI' 'BLAN' 'UNIF' 0. ('/' lpet -2.) el ;
  255. epsg = 'EXP' puig ;
  256. *
  257. d1 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  258. d1 = 'NOMC' 'SI11' d1 'NATURE' 'DIFFUS' ;
  259. v1 = 'MANU' 'CHPO' el 1 'CO11' 1. 'NATURE' 'DIFFUS' ;
  260. ltens = ttensrot v1 tolrot ;
  261. lok = lok 'ET' ltens ;
  262. 'SI' ('NON' ltens) ;
  263. 'MESS' '!!! Test tenseur de rotation not ok' ;
  264. 'SINO' ;
  265. 'MESS' 'Test tenseur de rotation OK' ;
  266. 'FINS' ;
  267. dec = d1 'ET' v1 ;
  268. *
  269. cha = 'TENS' 'RECO' dec ;
  270. *
  271. * Décomposition spectrale
  272. *
  273. decb = 'TENS' 'PRIN' cha ;
  274. decc = 'EXCO' 'CO11' decb ;
  275. ltens = ttensrot decc tolrot ;
  276. lok = lok 'ET' ltens ;
  277. 'SI' ('NON' ltens) ;
  278. 'MESS' '!!! Test vecteurs propres orthonormaux not ok' ;
  279. 'SINO' ;
  280. 'MESS' 'Test vecteurs propres orthonormaux OK' ;
  281. 'FINS' ;
  282. lvect = tvectp cha decb tolvecp ;
  283. 'SI' ('NON' lvect) ;
  284. 'MESS' '!!! Test vecteurs propres not ok' ;
  285. 'SINO' ;
  286. 'MESS' 'Test vecteurs propres OK' ;
  287. 'FINS' ;
  288. *
  289. chab = 'TENS' 'RECO' decb ;
  290. d1b = 'EXCO' 'SI11' decb 'SI11' ;
  291. * Test valeur propre
  292. dd1 = 'MAXI' ('-' d1 d1b) 'ABS' ;
  293. tdd1 = '<' dd1 tol ;
  294. lok = lok 'ET' tdd1 ;
  295. 'SI' ('NON' tdd1) ; 'MESS' '!!! Calcul err valp 1' ' ' dd1 ' >' ' ' tol ; 'FINS' ;
  296. * Test recomposition matrice
  297. dcha = '-' chab cha ;
  298. ndcha = 'MAXI' ('TENS' dcha 'NORMINF') 'ABS' ;
  299. tdcha = '<' ndcha tol ;
  300. lok = lok 'ET' tdcha ;
  301. 'SI' ('NON' tdcha) ; 'MESS' '!!! Calcul recomposition' ' ' ndcha ' >' ' ' tol ; 'FINS' ;
  302. 'SI' lok ; 'MESS' 'OK' ; 'FINS' ;
  303. *
  304. *'ERRE' stop ;
  305. *
  306. 'OPTION' 'DIME' 2 'ELEM' 'TRI3' ;
  307. 'OPTI' 'MODE' plan defo ;
  308. 'MESS' ' ********** ' ;
  309. 'MESS' ' * 2D * ' ;
  310. 'MESS' ' ********** ' ;
  311. *
  312. 'REPE' iikas 2 ;
  313. ikas = &iikas ;
  314. * Scaling global des termes de la matrice
  315. puig = 'BRUI' 'BLAN' 'UNIF' 0. ('/' lpet -2.) el ;
  316. epsg = 'EXP' puig ;
  317. vp1 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  318. * Valeurs propres distinctes
  319. 'SI' ('EGA' ikas 1) ;
  320. 'MESS' 'Valeurs propres distinctes' ;
  321. vp2 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  322. 'FINS' ;
  323. * Valeurs propres proches
  324. 'SI' ('EGA' ikas 2) ;
  325. 'MESS' 'Valeurs propres proches' ;
  326. puin = 'ENTI' 'PROC' ('BRUI' 'BLAN' 'UNIF' lpre ('*' lpre -1.d0) el) ;
  327. eps = 'EXP' puin ;
  328. vp2 = vp1 '+' (('BRUI' 'BLAN' 'UNIF' 0. 1. el) '*' eps '*' epsg) ;
  329. 'FINS' ;
  330. * Les plus grandes valeurs dans d1, les plus petites dans d2
  331. m1 = 'MASQ' vp1 'EGSUPE' vp2 ;
  332. m2 = '-' 1. m1 ;
  333. d1 = ('*' vp1 m1) '+' ('*' vp2 m2) ;
  334. d1 = 'NOMC' 'SI11' d1 'NATURE' 'DIFFUS' ;
  335. d2 = ('*' vp1 m2) '+' ('*' vp2 m1) ;
  336. d2 = 'NOMC' 'SI22' d2 'NATURE' 'DIFFUS' ;
  337. *
  338. ang = 'BRUI' 'BLAN' 'UNIF' 0. 180. el ;
  339. ca = 'COS' ang ; sa = 'SIN' ang ; msa = sa '*' -1. ;
  340. *
  341. rot11 = 'NOMC' 'CO11' ca 'NATURE' 'DIFFUS' ;
  342. rot21 = 'NOMC' 'CO21' sa 'NATURE' 'DIFFUS' ;
  343. rot12 = 'NOMC' 'CO12' msa 'NATURE' 'DIFFUS' ;
  344. rot22 = 'NOMC' 'CO22' ca 'NATURE' 'DIFFUS' ;
  345. rottot = rot11 'ET' rot21 'ET' rot12 'ET' rot22 ;
  346. * Vérif tenseur de rotation
  347. ltens = ttensrot rottot tolrot ;
  348. lok = lok 'ET' ltens ;
  349. 'SI' ('NON' ltens) ;
  350. 'MESS' '!!! Test tenseur de rotation not ok' ;
  351. 'SINO' ;
  352. 'MESS' 'Test tenseur de rotation OK' ;
  353. 'FINS' ;
  354. vprot = d1 'ET' d2 'ET' rottot ;
  355. *
  356. vdim = 'VALE' 'DIME' ;
  357. cha = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  358. 'REPE' ij vdim ;
  359. j = &ij ;
  360. 'REPE' ik j ;
  361. k = &ik ;
  362. ngjk = 'CHAI' 'G' j k ;
  363. gjk = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  364. 'REPE' ii vdim ;
  365. i = &ii ;
  366. nqji = 'CHAI' 'CO' i j ;
  367. nli = 'CHAI' 'SI' i i ;
  368. nqik = 'CHAI' 'CO' i k ;
  369. qji = 'EXCO' vprot nqji ;
  370. li = 'EXCO' vprot nli ;
  371. qik = 'EXCO' vprot nqik ;
  372. gjk = gjk '+' (qji '*' li '*' qik) ;
  373. 'FIN' ii ;
  374. gjk = 'NOMC' ngjk gjk 'NATURE' 'DIFFUS' ;
  375. cha = cha 'ET' gjk ;
  376. 'FIN' ik ;
  377. 'FIN' ij ;
  378. *
  379. * Décomposition spectrale
  380. *
  381. decb = 'TENS' 'PRIN' cha ;
  382. decc = 'EXCO' ('MOTS' 'CO11' 'CO12' 'CO21' 'CO22') decb ;
  383. ltens = ttensrot decc tolrot ;
  384. lok = lok 'ET' ltens ;
  385. 'SI' ('NON' ltens) ;
  386. 'MESS' '!!! Test vecteurs propres orthonormaux not ok' ;
  387. 'SINO' ;
  388. 'MESS' 'Test vecteurs propres orthonormaux OK' ;
  389. 'FINS' ;
  390. lvect = tvectp cha decb tolvecp ;
  391. 'SI' ('NON' lvect) ;
  392. 'MESS' '!!! Test vecteurs propres not ok' ;
  393. 'SINO' ;
  394. 'MESS' 'Test vecteurs propres OK' ;
  395. 'FINS' ;
  396. *
  397. chab = 'TENS' 'RECO' decb ;
  398. d1b = 'EXCO' 'SI11' decb 'SI11' ;
  399. d2b = 'EXCO' 'SI22' decb 'SI22' ;
  400. * Test valeurs propres
  401. dd1 = 'NOMC' 'SCAL' ('ABS' ('-' d1 d1b)) ;
  402. mdd1 = 'MASQ' dd1 'INFERIEUR' ('*' tol epsg) ;
  403. mmdd1 = 'MINI' mdd1 ;
  404. tdd1 = '>' mmdd1 0. ;
  405. lok = lok 'ET' tdd1 ;
  406. 'SI' ('NON' tdd1) ; 'MESS' '!!! Calcul valp1' ; 'FINS' ;
  407. dd2 = 'NOMC' 'SCAL' ('ABS' ('-' d2 d2b)) ;
  408. mdd2 = 'MASQ' dd2 'INFERIEUR' ('*' tol epsg) ;
  409. mmdd2 = 'MINI' mdd2 ;
  410. tdd2 = '>' mmdd2 0. ;
  411. lok = lok 'ET' tdd2 ;
  412. 'SI' ('NON' tdd2) ; 'MESS' '!!! Calcul valp2' ; 'FINS' ;
  413. * Test recomposition matrice
  414. dcha = 'TENS' 'NORMINF' ('-' chab cha) ;
  415. mdcha = 'MASQ' dcha 'INFERIEUR' ('*' tol epsg) ;
  416. mmdcha = 'MINI' mdcha ;
  417. tdcha = '>' mmdcha 0. ;
  418. lok = lok 'ET' tdcha ;
  419. 'SI' ('NON' tdcha) ; 'MESS' '!!! Calcul recomposition' ; 'FINS' ;
  420. 'SI' lok ; 'MESS' 'OK' ; 'SINO' ; 'ERRE' stop ; 'FINS' ;
  421. 'FIN' iikas ;
  422. *
  423. *
  424. *
  425. 'OPTION' 'DIME' 3 'ELEM' 'TET4' ;
  426. 'OPTI' 'MODE' 'TRID' ;
  427. 'MESS' ' ********** ' ;
  428. 'MESS' ' * 3D * ' ;
  429. 'MESS' ' ********** ' ;
  430. *
  431. 'REPE' iikas 3 ;
  432. ikas = &iikas ;
  433. * Scaling global des termes de la matrice
  434. puig = 'BRUI' 'BLAN' 'UNIF' 0. ('/' lpet -2.) el ;
  435. epsg = 'EXP' puig ;
  436. vp1 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  437. *
  438. 'SI' ('EGA' ikas 1) ;
  439. 'MESS' 'Valeurs propres distinctes' ;
  440. vp2 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  441. vp3 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  442. 'FINS' ;
  443. 'SI' ('EGA' ikas 2) ;
  444. 'MESS' 'Deux valeurs propres proches' ;
  445. vp2 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  446. puin = 'ENTI' 'PROC' ('BRUI' 'BLAN' 'UNIF' lpre ('*' lpre -1.d0) el) ;
  447. eps = 'EXP' puin ;
  448. vp3 = vp2 '+' ('*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) (eps '*' epsg)) ;
  449. 'FINS' ;
  450. 'SI' ('EGA' ikas 3) ;
  451. 'MESS' 'Trois valeurs propres proches' ;
  452. puin = 'ENTI' 'PROC' ('BRUI' 'BLAN' 'UNIF' lpre ('*' lpre -1.d0) el) ;
  453. eps = 'EXP' puin ;
  454. vp2 = vp1 '+' ('*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) (eps '*' epsg)) ;
  455. vp3 = vp1 '+' ('*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) (eps '*' epsg)) ;
  456. 'FINS' ;
  457. * Les plus grandes valeurs dans d1, les plus petites dans d3, les autres au milieu
  458. m12 = 'MASQ' vp1 'EGSUPE' vp2 ; m21 = 1. '-' m12 ;
  459. m23 = 'MASQ' vp2 'EGSUPE' vp3 ; m32 = 1. '-' m23 ;
  460. m13 = 'MASQ' vp1 'EGSUPE' vp3 ; m31 = 1. '-' m13 ;
  461. * Pour trouver ces formules, on a énuméré les cas et utilisé le fait que le ET logique est la multiplication
  462. * Plus grandes valeurs
  463. d1vp1 = m12 '*' m13 ; d1vp2 = m21 '*' m23 ; d1vp3 = m31 '*' m32 ;
  464. * Plus petites valeurs
  465. d3vp1 = m21 '*' m31 ; d3vp2 = m12 '*' m32 ; d3vp3 = m13 '*' m23 ;
  466. *
  467. d2vp1 = 1. '-' (d1vp1 '+' d3vp1) ;
  468. d2vp2 = 1. '-' (d1vp2 '+' d3vp2) ;
  469. d2vp3 = 1. '-' (d1vp3 '+' d3vp3) ;
  470. *
  471. d1 = ('*' d1vp1 vp1) '+' ('*' d1vp2 vp2) '+' ('*' d1vp3 vp3) ;
  472. d1 = 'NOMC' 'SI11' d1 'NATURE' 'DIFFUS' ;
  473. d2 = ('*' d2vp1 vp1) '+' ('*' d2vp2 vp2) '+' ('*' d2vp3 vp3) ;
  474. d2 = 'NOMC' 'SI22' d2 'NATURE' 'DIFFUS' ;
  475. d3 = ('*' d3vp1 vp1) '+' ('*' d3vp2 vp2) '+' ('*' d3vp3 vp3) ;
  476. d3 = 'NOMC' 'SI33' d3 'NATURE' 'DIFFUS' ;
  477. *
  478. * Génération d'une matrice de rotation quelconque
  479. * Algo III.4 Graphics Gems III par James Arvo (1995)
  480. *
  481. theta = 'BRUI' 'BLAN' 'UNIF' 0. 180. el ;
  482. phi = 'BRUI' 'BLAN' 'UNIF' 0. 180. el ;
  483. zed = 'BRUI' 'BLAN' 'UNIF' 0.5 0.5 el ;
  484. * Rotation autour de l'axe z
  485. ct = 'COS' theta ; st = 'SIN' theta ; mst = st '*' -1. ;
  486. trz = 'TABL' ;
  487. trz . 1 = 'TABL' ;
  488. trz . 1 . 1 = ct ; trz . 1 . 2 = st ; trz . 1 . 3 = 0. ;
  489. trz . 2 = 'TABL' ;
  490. trz . 2 . 1 = mst ; trz . 2 . 2 = ct ; trz . 2 . 3 = 0. ;
  491. trz . 3 = 'TABL' ;
  492. trz . 3 . 1 = 0. ; trz . 3 . 2 = 0. ; trz . 3 . 3 = 1. ;
  493. * Matrice de Householder H = 2 vvt - I
  494. cp = 'COS' phi ; sp = 'SIN' phi ; sqz = '**' zed 0.5 ; msqz = '**' (1. '-' zed) 0.5 ;
  495. v1 = cp '*' sqz ; v2 = sp '*' sqz ; v3 = msqz ;
  496. th = 'TABL' ;
  497. th . 1 = 'TABL' ;
  498. th . 1 . 1 = 2. '*' v1 '*' v1 '-' 1. ; th . 1 . 2 = 2. '*' v1 '*' v2 ; th . 1 . 3 = 2. '*' v1 '*' v3 ;
  499. th . 2 = 'TABL' ;
  500. th . 2 . 1 = th . 1 . 2 ; th . 2 . 2 = 2. '*' v2 '*' v2 '-' 1. ; th . 2 . 3 = 2. '*' v2 '*' v3 ;
  501. th . 3 = 'TABL' ;
  502. th . 3 . 1 = th . 1 . 3 ; th . 3 . 2 = th . 2 . 3 ; th . 3 . 3 = 2. '*' v3 '*' v3 '-' 1. ;
  503. * Le produit de H et R
  504. vdim = 'VALE' 'DIME' ;
  505. charot = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  506. 'REPE' ij vdim ;
  507. j = &ij ;
  508. 'REPE' ik vdim ;
  509. k = &ik ;
  510. ngjk = 'CHAI' 'CO' j k ;
  511. gjk = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  512. 'REPE' ii vdim ;
  513. i = &ii ;
  514. gjk = gjk '+' (th . j . i '*' trz . i . k) ;
  515. 'FIN' ii ;
  516. gjk = 'NOMC' ngjk gjk 'NATURE' 'DIFFUS' ;
  517. charot = charot 'ET' gjk ;
  518. 'FIN' ik ;
  519. 'FIN' ij ;
  520. * Vérif tenseur de rotation
  521. ltens = ttensrot charot tolrot ;
  522. lok = lok 'ET' ltens ;
  523. 'SI' ('NON' ltens) ;
  524. 'MESS' '!!! Test tenseur de rotation not ok' ;
  525. 'SINO' ;
  526. 'MESS' 'Test tenseur de rotation OK' ;
  527. 'FINS' ;
  528. vprot = d1 'ET' d2 'ET' d3 'ET' charot ;
  529. *dbg mpn6 = 'MANU' 'POI1' ('NOEU' 6) ;
  530. *dbg vprot = 'REDU' vprot mpn6 ;
  531. *dbg d1 = 'REDU' d1 mpn6 ;
  532. *dbg d2 = 'REDU' d2 mpn6 ;
  533. *dbg d3 = 'REDU' d3 mpn6 ;
  534. * Rotation de la matrice diagonale des vps
  535. cha = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  536. 'REPE' ij vdim ;
  537. j = &ij ;
  538. 'REPE' ik j ;
  539. k = &ik ;
  540. ngjk = 'CHAI' 'G' j k ;
  541. gjk = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  542. 'REPE' ii vdim ;
  543. i = &ii ;
  544. nqji = 'CHAI' 'CO' i j ;
  545. nli = 'CHAI' 'SI' i i ;
  546. nqik = 'CHAI' 'CO' i k ;
  547. qji = 'EXCO' vprot nqji ;
  548. li = 'EXCO' vprot nli ;
  549. qik = 'EXCO' vprot nqik ;
  550. gjk = gjk '+' (qji '*' li '*' qik) ;
  551. 'FIN' ii ;
  552. gjk = 'NOMC' ngjk gjk 'NATURE' 'DIFFUS' ;
  553. cha = cha 'ET' gjk ;
  554. 'FIN' ik ;
  555. 'FIN' ij ;
  556. *
  557. * Décomposition spectrale
  558. *
  559. decb = 'TENS' 'PRIN' cha ;
  560. decc = 'EXCO' ('MOTS' 'CO11' 'CO12' 'CO13' 'CO21' 'CO22' 'CO23' 'CO31' 'CO32' 'CO33') decb ;
  561. *
  562. ltens = ttensrot decc tolrot ;
  563. lok = lok 'ET' ltens ;
  564. 'SI' ('NON' ltens) ;
  565. 'MESS' '!!! Test vecteurs propres orthonormaux not ok' ;
  566. 'SINO' ;
  567. 'MESS' 'Test vecteurs propres orthonormaux OK' ;
  568. 'FINS' ;
  569. lvect = tvectp cha decb tolvecp ;
  570. 'SI' ('NON' lvect) ;
  571. 'MESS' '!!! Test vecteurs propres not ok' ;
  572. 'SINO' ;
  573. 'MESS' 'Test vecteurs propres OK' ;
  574. 'FINS' ;
  575. *
  576. chab = 'TENS' 'RECO' decb ;
  577. d1b = 'EXCO' 'SI11' decb 'SI11' ;
  578. d2b = 'EXCO' 'SI22' decb 'SI22' ;
  579. d3b = 'EXCO' 'SI33' decb 'SI33' ;
  580. * Test valeurs propres
  581. dd1 = 'NOMC' 'SCAL' ('ABS' ('-' d1 d1b)) ;
  582. mdd1 = 'MASQ' dd1 'INFERIEUR' ('*' tol epsg) ;
  583. mmdd1 = 'MINI' mdd1 ;
  584. tdd1 = '>' mmdd1 0. ;
  585. lok = lok 'ET' tdd1 ;
  586. 'SI' ('NON' tdd1) ; 'MESS' '!!! Calcul valp1' ; 'FINS' ;
  587. dd2 = 'NOMC' 'SCAL' ('ABS' ('-' d2 d2b)) ;
  588. mdd2 = 'MASQ' dd2 'INFERIEUR' ('*' tol epsg) ;
  589. mmdd2 = 'MINI' mdd2 ;
  590. tdd2 = '>' mmdd2 0. ;
  591. lok = lok 'ET' tdd2 ;
  592. 'SI' ('NON' tdd2) ; 'MESS' '!!! Calcul valp2' ; 'FINS' ;
  593. dd3 = 'NOMC' 'SCAL' ('ABS' ('-' d3 d3b)) ;
  594. mdd3 = 'MASQ' dd3 'INFERIEUR' ('*' tol epsg) ;
  595. mmdd3 = 'MINI' mdd3 ;
  596. tdd3 = '>' mmdd3 0. ;
  597. lok = lok 'ET' tdd3 ;
  598. 'SI' ('NON' tdd3) ; 'MESS' '!!! Calcul valp3' ; 'FINS' ;
  599. * Test recomposition matrice
  600. tolreco = tolrec3d ;
  601. dcha = 'TENS' 'NORMINF' ('-' chab cha) ;
  602. mdcha = 'MASQ' dcha 'INFERIEUR' ('*' tolreco epsg) ;
  603. mmdcha = 'MINI' mdcha ;
  604. tdcha = '>' mmdcha 0. ;
  605. lok = lok 'ET' tdcha ;
  606. 'SI' ('NON' tdcha) ; 'MESS' '!!! Calcul recomposition' ; 'FINS' ;
  607. 'SI' lok ; 'MESS' 'OK' ; 'SINO' ; 'ERRE' stop ; 'FINS' ;
  608. 'FIN' iikas ;
  609. *
  610. 'SI' ('NON' lok) ;
  611. 'MESSAGE' ('CHAINE' 'Il y a eu des erreurs') ;
  612. 'ERREUR' 5 ;
  613. 'SINON' ;
  614. 'MESSAGE' ('CHAINE' 'Tout sest bien passe !') ;
  615. 'FINSI' ;
  616. *
  617. 'SI' interact ;
  618. 'OPTION' 'ECHO' 1 'DONN' 5 ;
  619. 'FINSI' ;
  620. *
  621. * End of dgibi file TENS2
  622. *
  623. 'FIN' ;
  624.  
  625.  
  626.  

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