4
5
6
7
8
9
10
11
12
13
14
15
16
17
23
24# ifdef DISTRIBUTE
25
27# endif
28
29 implicit none
30
31
32
33 integer, intent(in) :: ng, model, outLoop, NinnLoop
34
35
36
37 integer :: i, j, iobs, ivec, innLoop
38# ifdef IMPACT_INNER
39 integer :: mloop
40# endif
41# ifdef MINRES
42 integer :: info
43 integer, dimension(NinnLoop) :: ipiv
44# endif
45
46 real(r8) :: zbet
47
48 real(r8), dimension(NinnLoop) :: zu, zgam, zt
49# ifdef MINRES
50 real(r8) :: zsum, zck, zgk
51 real(r8), dimension(NinnLoop,NinnLoop) :: ztriT, zLT, zLTt
52 real(r8), dimension(NinnLoop) :: tau, zwork1, zeref
53# endif
54# ifdef RPCG
55 real(r8), dimension(NinnLoop) :: zfact
56# endif
57# ifdef IMPACT_INNER
58
59
60
61
62
63
64 master_thread :
IF (
master)
THEN
65
66 DO mloop=1,ninnloop
67
70 END DO
71 DO innloop=1,ninnloop
72 zt(innloop)=0.0_r8
73 END DO
74# ifdef RPCG
75 DO innloop=1,ninnloop
76 IF (innloop.eq.1) THEN
77 zfact(innloop)=1.0_r8/
cg_qg(1,outloop)
78 ELSE
79 zfact(innloop)=1.0_r8/
cg_beta(innloop,outloop)
80 END IF
81 END DO
82# endif
83
84
85
86
87
88 DO innloop=1,mloop
90 IF (
obserr(iobs).NE.0.0_r8)
THEN
91# ifdef RPCG
92 zt(innloop)=zt(innloop)+ &
94 &
zcglwk(iobs,innloop,outloop)* &
95 & tlmodval(iobs)
96# else
97 zt(innloop)=zt(innloop)+ &
99 &
zcglwk(iobs,innloop,outloop)* &
100 & tlmodval(iobs)/ &
102# endif
103 END IF
104 END DO
105 END DO
106
107# ifdef MINRES
108
109
110
111
112
113
114
115
116 ztrit=0.0_r8
117 DO i=1,mloop
119 END DO
120 DO i=1,mloop-1
121 ztrit(i,i+1)=
cg_beta(i+1,outloop)
122 END DO
123 DO i=2,mloop
124 ztrit(i,i-1)=
cg_beta(i,outloop)
125 END DO
126 CALL sqlq (mloop, ztrit, tau, zwork1)
127
128
129
130 zlt=0.0_r8
131 zltt=0.0_r8
132 DO i=1,mloop
133 DO j=1,i
134 zlt(i,j)=ztrit(i,j)
135 END DO
136 END DO
137 DO j=1,mloop
138 DO i=1,mloop
139 zltt(i,j)=zlt(j,i)
140 END DO
141 END DO
142
143
144
145 zgk=sqrt(zlt(mloop,mloop)*zlt(mloop,mloop)+ &
147 zck=zlt(mloop,mloop)/zgk
148
149
150
151
152 DO j=1,mloop
153 DO i=j-1,1,-1
154 zt(j)=zt(j)-zt(i)*zltt(i,j)
155 END DO
156 zt(j)=zt(j)/zltt(j,j)
157 END DO
158
159
160
161 zt(mloop)=zck*zt(mloop)
162
163
164
165 DO i=mloop,1,-1
166 DO j=1,mloop
167 zeref(j)=0.0_r8
168 END DO
169 zeref(i)=1.0_r8
170 DO j=i+1,mloop
171 zeref(j)=ztrit(i,j)
172 END DO
173 zsum=0.0_r8
174 DO j=1,mloop
175 zsum=zsum+zt(j)*zeref(j)
176 END DO
177 DO j=1,mloop
178 zt(j)=zt(j)-tau(i)*zsum*zeref(j)
179 END DO
180 END DO
181
182
183
184 DO i=1,mloop
185 zu(i)=zt(i)
186 END DO
187# else
188
189
190
192 zu(1)=zt(1)/zbet
193 DO ivec=2,mloop
194 zgam(ivec)=
cg_beta(ivec,outloop)/zbet
196 zu(ivec)=(zt(ivec)-
cg_beta(ivec,outloop)* &
197 & zu(ivec-1))/zbet
198 END DO
199
200 DO ivec=mloop-1,1,-1
201 zu(ivec)=zu(ivec)-zgam(ivec+1)*zu(ivec+1)
202 END DO
203# endif
204
205
206# ifndef RPCG
207
208
209# endif
210
212 DO innloop=1,mloop
213 IF (
obserr(iobs).NE.0.0_r8)
THEN
214# ifdef RPCG
217 & tlmodval_s(iobs,innloop,outloop)* &
218 & zu(innloop)*zfact(innloop)/ &
220# else
223 &
zcglwk(iobs,innloop,outloop)* &
224 & zu(innloop)/ &
226# endif
227 END IF
228 END DO
229 END DO
230
231 END DO
232
233 END IF master_thread
234
235# else
236
237
238
239
240
241
242 master_thread :
IF (
master)
THEN
243
246 END DO
247 DO innloop=1,ninnloop
248 zt(innloop)=0.0_r8
249 END DO
250# ifdef RPCG
251 DO innloop=1,ninnloop
252 IF (innloop.eq.1) THEN
253 zfact(innloop)=1.0_r8/
cg_qg(1,outloop)
254 ELSE
255 zfact(innloop)=1.0_r8/
cg_beta(innloop,outloop)
256 ENDIF
257 END DO
258# endif
259
260
261
262
263
264 DO innloop=1,ninnloop
266 IF (
obserr(iobs).NE.0.0_r8)
THEN
267# ifdef RPCG
268 zt(innloop)=zt(innloop)+
obsscale(iobs)* &
269 &
zcglwk(iobs,innloop,outloop)*tlmodval(iobs)
270# else
271 zt(innloop)=zt(innloop)+
obsscale(iobs)* &
272 &
zcglwk(iobs,innloop,outloop)*tlmodval(iobs)/ &
274# endif
275 END IF
276 END DO
277 END DO
278
279# ifdef MINRES
280
281
282
283
284
285
286
287
288 ztrit=0.0_r8
289 DO i=1,ninnloop
291 END DO
292 DO i=1,ninnloop-1
293 ztrit(i,i+1)=
cg_beta(i+1,outloop)
294 END DO
295 DO i=2,ninnloop
296 ztrit(i,i-1)=
cg_beta(i,outloop)
297 END DO
298 CALL sqlq (ninnloop, ztrit, tau, zwork1)
299
300
301
302 zlt=0.0_r8
303 zltt=0.0_r8
304 DO i=1,ninnloop
305 DO j=1,i
306 zlt(i,j)=ztrit(i,j)
307 END DO
308 END DO
309 DO j=1,ninnloop
310 DO i=1,ninnloop
311 zltt(i,j)=zlt(j,i)
312 END DO
313 END DO
314
315
316
317 zgk=sqrt(zlt(ninnloop,ninnloop)*zlt(ninnloop,ninnloop)+ &
319 zck=zlt(ninnloop,ninnloop)/zgk
320
321
322
323
324 DO j=1,ninnloop
325 DO i=j-1,1,-1
326 zt(j)=zt(j)-zt(i)*zltt(i,j)
327 END DO
328 zt(j)=zt(j)/zltt(j,j)
329 END DO
330
331
332
333 zt(ninnloop)=zck*zt(ninnloop)
334
335
336
337 DO i=ninnloop,1,-1
338 DO j=1,ninnloop
339 zeref(j)=0.0_r8
340 END DO
341 zeref(i)=1.0_r8
342 DO j=i+1,ninnloop
343 zeref(j)=ztrit(i,j)
344 END DO
345 zsum=0.0_r8
346 DO j=1,ninnloop
347 zsum=zsum+zt(j)*zeref(j)
348 END DO
349 DO j=1,ninnloop
350 zt(j)=zt(j)-tau(i)*zsum*zeref(j)
351 END DO
352 END DO
353
354
355
356 DO i=1,ninnloop
357 zu(i)=zt(i)
358 END DO
359# else
360
361
362
364 zu(1)=zt(1)/zbet
365 DO ivec=2,ninnloop
366 zgam(ivec)=
cg_beta(ivec,outloop)/zbet
368 zu(ivec)=(zt(ivec)-
cg_beta(ivec,outloop)* &
369 & zu(ivec-1))/zbet
370 END DO
371
372 DO ivec=ninnloop-1,1,-1
373 zu(ivec)=zu(ivec)-zgam(ivec+1)*zu(ivec+1)
374 END DO
375# endif
376
377
378# ifndef RPCG
379
380
381# endif
382
384 DO innloop=1,ninnloop
385 IF (
obserr(iobs).NE.0.0_r8)
THEN
386# ifdef RPCG
389 & tlmodval_s(iobs,innloop,outloop)* &
390 & zu(innloop)*zfact(innloop)/ &
392# else
395 &
zcglwk(iobs,innloop,outloop)* &
396 & zu(innloop)/ &
398# endif
399 END IF
400 END DO
401 END DO
402
403 END IF master_thread
404
405# endif
406# ifdef DISTRIBUTE
407
408
409
410
411
413# endif
414
415 RETURN
real(dp), dimension(:,:), allocatable cg_beta
integer, dimension(:), allocatable ndatum
real(dp), dimension(:,:), allocatable cg_qg
real(r8), dimension(:,:), allocatable ad_obsval
real(r8), dimension(:), allocatable obsscale
real(r8), dimension(:), allocatable obserr
real(r8), dimension(:,:,:), allocatable zcglwk
real(dp), dimension(:,:), allocatable cg_delta