1 | MODULE surdetermine |
---|
2 | |
---|
3 | USE in_out_manager ! I/O units |
---|
4 | |
---|
5 | IMPLICIT NONE |
---|
6 | PUBLIC |
---|
7 | |
---|
8 | INTEGER, PARAMETER :: jpincomax = 18 |
---|
9 | INTEGER, PARAMETER :: jpdimsparse = jpincomax*300*24 |
---|
10 | |
---|
11 | INTEGER, PUBLIC :: nsparse, ninco |
---|
12 | REAL(wp), PUBLIC, DIMENSION(jpdimsparse) :: valuesparse |
---|
13 | INTEGER , PUBLIC, DIMENSION(jpdimsparse) :: njsparse, nisparse |
---|
14 | |
---|
15 | INTEGER, SAVE, DIMENSION(jpincomax) :: ipos1 |
---|
16 | REAL(wp), DIMENSION(jpincomax) :: tmp4, tmp7 |
---|
17 | REAL(wp), SAVE, DIMENSION(jpincomax,jpincomax) :: ztmp3, zpilier |
---|
18 | REAL(wp), SAVE, DIMENSION(jpincomax) :: zpivot |
---|
19 | |
---|
20 | !!--------------------------------------------------------------------------------- |
---|
21 | !! |
---|
22 | !!--------------------------------------------------------------------------------- |
---|
23 | |
---|
24 | CONTAINS |
---|
25 | |
---|
26 | SUBROUTINE SUR_DETERMINE(init) |
---|
27 | |
---|
28 | INTEGER, INTENT(in) :: init |
---|
29 | |
---|
30 | INTEGER :: & |
---|
31 | ji_sd, jj_sd, ji1_sd, ji2_sd, jk1_sd, jk2_sd |
---|
32 | REAL(wp) :: zval1, zval2, zx1 |
---|
33 | REAL(wp), DIMENSION(jpincomax) :: ztmpx, zcol1, zcol2 |
---|
34 | INTEGER, DIMENSION(jpincomax) :: ipos2, ipivot |
---|
35 | !--------------------------------------------------------------------------------- |
---|
36 | |
---|
37 | IF (init==1) THEN |
---|
38 | IF(nsparse .gt. jpdimsparse) STOP 'surdetermine erreur1' |
---|
39 | IF(ninco .gt. jpincomax)THEN |
---|
40 | IF (lwp) WRITE(numout,*)'ninco =',ninco |
---|
41 | IF (lwp) WRITE(numout,*)'jpincomax=',jpincomax |
---|
42 | STOP 'DONC dans surdetermine erreur2' |
---|
43 | END IF |
---|
44 | |
---|
45 | ztmp3(:,:)=0.e0 |
---|
46 | |
---|
47 | DO jk1_sd=1,nsparse |
---|
48 | DO jk2_sd=1,nsparse |
---|
49 | nisparse(jk2_sd)=nisparse(jk2_sd) |
---|
50 | njsparse(jk2_sd)=njsparse(jk2_sd) |
---|
51 | IF(nisparse(jk2_sd) .eq. nisparse(jk1_sd)) & |
---|
52 | ztmp3(njsparse(jk1_sd),njsparse(jk2_sd))= & |
---|
53 | ztmp3(njsparse(jk1_sd),njsparse(jk2_sd)) & |
---|
54 | +valuesparse(jk1_sd)*valuesparse(jk2_sd) |
---|
55 | END DO |
---|
56 | END DO |
---|
57 | |
---|
58 | DO jj_sd=1,ninco |
---|
59 | ipos1(jj_sd)=jj_sd |
---|
60 | ipos2(jj_sd)=jj_sd |
---|
61 | ENDDO |
---|
62 | |
---|
63 | DO ji_sd=1,ninco |
---|
64 | ! recherche du plus grand pivot non nul |
---|
65 | zval1=ABS(ztmp3(ji_sd,ji_sd)) |
---|
66 | |
---|
67 | ipivot(ji_sd)=ji_sd |
---|
68 | DO jj_sd=ji_sd,ninco |
---|
69 | zval2=ABS(ztmp3(ji_sd,jj_sd)) |
---|
70 | IF(zval2.GE.zval1) THEN |
---|
71 | ipivot(ji_sd)=jj_sd |
---|
72 | zval1=zval2 |
---|
73 | ENDIF |
---|
74 | END DO |
---|
75 | |
---|
76 | DO ji1_sd=1,ninco |
---|
77 | zcol1(ji1_sd)=ztmp3(ji1_sd,ji_sd) |
---|
78 | zcol2(ji1_sd)=ztmp3(ji1_sd,ipivot(ji_sd)) |
---|
79 | ztmp3(ji1_sd,ji_sd)=zcol2(ji1_sd) |
---|
80 | ztmp3(ji1_sd,ipivot(ji_sd))=zcol1(ji1_sd) |
---|
81 | END DO |
---|
82 | |
---|
83 | ipos2(ji_sd)=ipos1(ipivot(ji_sd)) |
---|
84 | ipos2(ipivot(ji_sd))=ipos1(ji_sd) |
---|
85 | ipos1(ji_sd)=ipos2(ji_sd) |
---|
86 | ipos1(ipivot(ji_sd))=ipos2(ipivot(ji_sd)) |
---|
87 | |
---|
88 | |
---|
89 | !------------------------------- |
---|
90 | zpivot(ji_sd)=ztmp3(ji_sd,ji_sd) |
---|
91 | DO jj_sd=1,ninco |
---|
92 | ztmp3(ji_sd,jj_sd)=ztmp3(ji_sd,jj_sd)/zpivot(ji_sd) |
---|
93 | END DO |
---|
94 | !------------------------------- |
---|
95 | |
---|
96 | !------------------------------- |
---|
97 | DO ji2_sd=ji_sd+1,ninco |
---|
98 | zpilier(ji2_sd,ji_sd)=ztmp3(ji2_sd,ji_sd) |
---|
99 | DO jj_sd=1,ninco |
---|
100 | ztmp3(ji2_sd,jj_sd)= & |
---|
101 | ztmp3(ji2_sd,jj_sd)-ztmp3(ji_sd,jj_sd)*zpilier(ji2_sd,ji_sd) |
---|
102 | END DO |
---|
103 | END DO |
---|
104 | |
---|
105 | END DO |
---|
106 | |
---|
107 | ENDIF ! End init==1 |
---|
108 | |
---|
109 | ! |
---|
110 | DO ji_sd=1,ninco |
---|
111 | tmp4(ji_sd)=tmp4(ji_sd)/zpivot(ji_sd) |
---|
112 | DO ji2_sd=ji_sd+1,ninco |
---|
113 | tmp4(ji2_sd)=tmp4(ji2_sd)-tmp4(ji_sd)*zpilier(ji2_sd,ji_sd) |
---|
114 | END DO |
---|
115 | END DO |
---|
116 | |
---|
117 | ! resolution du systeme: |
---|
118 | ztmpx(ninco)=tmp4(ninco)/ztmp3(ninco,ninco) |
---|
119 | ji_sd=ninco |
---|
120 | DO ji_sd=ninco-1,1,-1 |
---|
121 | zx1=0. |
---|
122 | DO jj_sd=ji_sd+1,ninco |
---|
123 | zx1=zx1+ztmpx(jj_sd)*ztmp3(ji_sd,jj_sd) |
---|
124 | END DO |
---|
125 | ztmpx(ji_sd)=tmp4(ji_sd)-zx1 |
---|
126 | END DO |
---|
127 | |
---|
128 | DO jj_sd=1,ninco |
---|
129 | tmp7(ipos1(jj_sd))=ztmpx(jj_sd) |
---|
130 | END DO |
---|
131 | |
---|
132 | |
---|
133 | END SUBROUTINE SUR_DETERMINE |
---|
134 | |
---|
135 | END MODULE surdetermine |
---|