source: trunk/tools/bsf/build_laplacien_f.pro

Last change on this file was 173, checked in by pinsard, 15 years ago

split files with multiple pro or function (except wavelets because external)

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