[3] | 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 8.5, LODYC-IPSL (2002) |
---|
| 28 | !!---------------------------------------------------------------------- |
---|
| 29 | |
---|
| 30 | ikstp1 = ikst + 1 |
---|
| 31 | ikenm2 = jpk - 2 |
---|
| 32 | |
---|
| 33 | DO jj = 2, jpjm1 |
---|
| 34 | DO ji = fs_2, fs_jpim1 |
---|
| 35 | zwt(ji,jj,ikst) = zwd(ji,jj,ikst) |
---|
| 36 | END DO |
---|
| 37 | END DO |
---|
| 38 | |
---|
| 39 | DO jk = ikstp1, jpkm1 |
---|
| 40 | DO jj = 2, jpjm1 |
---|
| 41 | DO ji = fs_2, fs_jpim1 |
---|
| 42 | zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwt(ji,jj,jk-1) |
---|
| 43 | END DO |
---|
| 44 | END DO |
---|
| 45 | END DO |
---|
| 46 | |
---|
| 47 | DO jk = ikstp1, jpkm1 |
---|
| 48 | DO jj = 2, jpjm1 |
---|
| 49 | DO ji = fs_2, fs_jpim1 |
---|
| 50 | zwy(ji,jj,jk) = zwy(ji,jj,jk) - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * zwy(ji,jj,jk-1) |
---|
| 51 | END DO |
---|
| 52 | END DO |
---|
| 53 | END DO |
---|
| 54 | |
---|
| 55 | DO jj = 2, jpjm1 |
---|
| 56 | DO ji = fs_2, fs_jpim1 |
---|
| 57 | zwx(ji,jj,jpkm1) = zwy(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) |
---|
| 58 | END DO |
---|
| 59 | END DO |
---|
| 60 | |
---|
| 61 | DO jk = ikenm2, ikst, -1 |
---|
| 62 | DO jj = 2, jpjm1 |
---|
| 63 | DO ji = fs_2, fs_jpim1 |
---|
| 64 | zwx(ji,jj,jk) = ( zwy(ji,jj,jk) - zws(ji,jj,jk) * zwx(ji,jj,jk+1) ) / zwt(ji,jj,jk) |
---|
| 65 | END DO |
---|
| 66 | END DO |
---|
| 67 | END DO |
---|