source: trunk/tools/bsf/build_laplacien_f.pro @ 2

Last change on this file since 2 was 2, checked in by post_it, 17 years ago

Initial import from ~/POST_IT/

File size: 4.0 KB
Line 
1;+
2;;   
3;; Construction du laplacien 2D
4;; cherche a le lire dans le fichier
5;; '/workdir/rech/ces/rces023/laplacien_T.dat', sinon il le calcul   
6;;
7;;
8;; le laplacien correspond a l''ancienne grille globale d''OPA
9;;
10;; il faut modifier cette routine pour toute autre grille
11;;
12;; Creation     : juin 1998 :  G. Roullet
13;; Modification : 26/02/00  :  G.Roullet
14;;                                Adpation pour ORCA : repliement au pole
15;;                                Changement du traitement des conditions
16;;                                Est-Ouest (on masque au lieu de supprimer les points)
17;;                                   => routine inversion corrigee
18;;
19;-
20PRO build_laplacien_f
21@common
22@com_eg
23   COMMON laplaciens, lapla_t, lapla_f
24
25   N = jpi
26   N2 = long(N)*(jpj)
27   bande = dblarr(N2, 5)
28
29
30   fm = fmaskr(*, *, 0)/(e1f*e2f)
31
32;
33; On masque le domaine non physique (points en double)
34;
35   fm(0, *) = 0
36   fm(jpi-1, *) = 0
37;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
38; specificite ORCA
39   fm(*, jpj-1) = 0
40   fm(*, jpj-2) = 0
41;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
42   um = umaskr(*, *, 0)*e1u/e2u
43   vm = vmaskr(*, *, 0)*e2v/e1v
44;
45;  construction des 5 bandes
46;
47
48;      Sud
49   bande( 0:N2-1 , 1) = fm*shift(um, 0, 0)
50;      Ouest                 
51   bande( 0:N2-1 , 2) = fm*shift(vm, 0, 0)
52;      Est                   
53   bande( 0:N2-1 , 3) = fm*shift(vm,-1, 0)
54;      Nord                 
55   bande( 0:N2-1 , 4) = fm*shift(um, 0,-1)
56;
57;
58;
59   bande(0:N-1      , 1) = 0.
60;
61;  elements ci dessous non nuls du fait des CL periodiques E-W
62;  decommenter les 2 lignes si votre domaine est ferme a l''Est et a l''Ouest
63;   bande(0          , 2) = 0.
64;   bande(N2-1       , 3) = 0.
65
66   bande(N2-N:N2-1  , 4) = 0.
67   
68;      Centre
69   bande( * , 0) = - bande(*, 1) -  bande(*, 2) -  bande(*, 3) -  bande(*, 4)
70
71
72;  construction de la matrice creuse
73;
74
75   ;; nb d'elements de la matrice creuse
76   Nb = N2+n_elements(where(bande(*, 1:4) NE 0))+1
77
78   ;; definition de la matrice creuse
79   lapla_f = { laplacien_f, sa:dblarr(Nb), ija:lonarr(Nb) }
80
81   ;; elements diagonaux
82   lapla_f.sa[0:N2-1] = bande(0:N2-1, 0)
83   lapla_f.sa[N2] = 0
84   lapla_f.ija[N2] = Nb+1
85   lapla_f.ija[0] = N2+2
86
87;   
88; elements extra-diagonaux
89;
90   ;;  -  i balaye dans l'ordre tout les elements susceptibles d'etre
91   ;;     non nuls dans l'immense matrice i.e. 4 colonnes par ligne.
92
93   ;;  -  k repere l'indice de la matrice creuse courant
94
95   ;;  -  ligne et colonne sont les coordonnees dans la matrice pleine
96
97   ;;  -  zligne et zcol reperent la position du point courant dans la
98   ;;          matrice jpixjpj
99
100   ;;  - decalage repere la position *relative* des 4 voisins dans la matrice
101   ;;    creuse                       ^^^^^^^^
102
103   i = long(0)
104   k = long(N2)
105   compteur = long(0)
106   REPEAT BEGIN
107      ligne = i/4
108      ;;
109      ;; conditions aux limites periodiques selon W-E
110      ;;
111     
112      zcol = ligne MOD N
113      zligne = ligne/N
114
115      IF i MOD 4 EQ 0 THEN begin
116         decalage = [-N, -1, 1, N]
117         ordre = [1, 2, 3, 4]
118         IF zcol EQ 1 THEN BEGIN               
119            decalage = [-N, -3+N, 1, N]
120            ordre = [1, 3, 2, 4]
121         ENDIF
122         IF zcol EQ (N-2) THEN BEGIN
123            decalage = [-N, -1, +3-N, N]
124            ordre = [1, 3, 2, 4]
125         ENDIF
126;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
127;
128; ajout ORCA
129;
130; conditions de repliement au Nord
131;
132         IF (zligne EQ jpj-3) THEN BEGIN
133            ptN = 2*(N/2-zcol)-1
134            decalage[3] = ptN
135            IF zcol GE N/2 THEN ordre = [1, 4, 2, 3]
136         ENDIF
137;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
138      ENDIF
139
140      colonne = ligne+decalage(ordre(i MOD 4)-1)
141;
142      IF (colonne GE 0) AND (colonne LT N2) THEN  BEGIN
143         x = bande(ligne, ordre(i MOD 4) )
144         IF x NE 0. THEN BEGIN
145            k = k+1
146            lapla_f.sa[k] = x
147            lapla_f.ija[k] = colonne+1
148         ENDIF ELSE BEGIN
149         ENDELSE
150      ENDIF
151;
152      IF (i MOD 4) EQ 3 THEN lapla_f.ija[ligne+1] = k+2
153;
154      i = i+1
155   ENDREP UNTIL i EQ 4*N2-1
156
157END
158
Note: See TracBrowser for help on using the repository browser.