1 | !! |
---|
2 | !! ZDF.MATRIXSOLVER |
---|
3 | !! ******************** |
---|
4 | !! |
---|
5 | !! Matrix inversion |
---|
6 | !!---------------------------------------------------------------------- |
---|
7 | !! solve m.x = y where m is a tri diagonal matrix ( jpk*jpk ) |
---|
8 | !! |
---|
9 | !! ( zwd1 zws1 0 0 0 )( zwx1 ) ( zwy1 ) |
---|
10 | !! ( zwi2 zwd2 zws2 0 0 )( zwx2 ) ( zwy2 ) |
---|
11 | !! ( 0 zwi3 zwd3 zws3 0 )( zwx3 )=( zwy3 ) |
---|
12 | !! ( ... )( ... ) ( ... ) |
---|
13 | !! ( 0 0 0 zwik zwdk )( zwxk ) ( zwyk ) |
---|
14 | !! |
---|
15 | !! m is decomposed in the product of an upper and lower triangular |
---|
16 | !! matrix |
---|
17 | !! The 3 diagonal terms are in 2d arrays: zwd, zws, zwi |
---|
18 | !! The second member is in 2d array zwy |
---|
19 | !! The solution is in 2d array zwx |
---|
20 | !! The 3d arry zwt is a work space array |
---|
21 | !! zwy is used and then used as a work space array : its value is modified! |
---|
22 | !! |
---|
23 | !! N.B. the starting vertical index (ikst) is equal to 1 except for |
---|
24 | !! the resolution of tke matrix where surface tke value is prescribed |
---|
25 | !! so that ikstrt=2. |
---|
26 | !!---------------------------------------------------------------------- |
---|
27 | !! OPA 9.0 , LOCEAN-IPSL (2005) |
---|
28 | !! $Header$ |
---|
29 | !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt |
---|
30 | !!---------------------------------------------------------------------- |
---|
31 | |
---|
32 | ikstp1 = ikst + 1 |
---|
33 | ikenm2 = jpk - 2 |
---|
34 | |
---|
35 | DO jj = 2, jpjm1 |
---|
36 | DO ji = fs_2, fs_jpim1 |
---|
37 | zwt(ji,jj,ikst) = zwd(ji,jj,ikst) |
---|
38 | END DO |
---|
39 | END DO |
---|
40 | |
---|
41 | DO jk = ikstp1, jpkm1 |
---|
42 | DO jj = 2, jpjm1 |
---|
43 | DO ji = fs_2, fs_jpim1 |
---|
44 | zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwt(ji,jj,jk-1) |
---|
45 | END DO |
---|
46 | END DO |
---|
47 | END DO |
---|
48 | |
---|
49 | DO jk = ikstp1, jpkm1 |
---|
50 | DO jj = 2, jpjm1 |
---|
51 | DO ji = fs_2, fs_jpim1 |
---|
52 | zwy(ji,jj,jk) = zwy(ji,jj,jk) - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * zwy(ji,jj,jk-1) |
---|
53 | END DO |
---|
54 | END DO |
---|
55 | END DO |
---|
56 | |
---|
57 | DO jj = 2, jpjm1 |
---|
58 | DO ji = fs_2, fs_jpim1 |
---|
59 | zwx(ji,jj,jpkm1) = zwy(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) |
---|
60 | END DO |
---|
61 | END DO |
---|
62 | |
---|
63 | DO jk = ikenm2, ikst, -1 |
---|
64 | DO jj = 2, jpjm1 |
---|
65 | DO ji = fs_2, fs_jpim1 |
---|
66 | zwx(ji,jj,jk) = ( zwy(ji,jj,jk) - zws(ji,jj,jk) * zwx(ji,jj,jk+1) ) / zwt(ji,jj,jk) |
---|
67 | END DO |
---|
68 | END DO |
---|
69 | END DO |
---|