73
74
75
76
77 logical, intent(in) :: Lcgini
78 integer, intent(in) :: ng, model, outLoop, innLoop, NinnLoop
79
80
81
82 logical :: Ltrans, Laug
83
84 integer :: i, ic, j, iobs, ivec, Lscale, info
85
86 real(dp) :: zbet, eps, preducv, preducy
87 real(dp) :: Jopt, Jf, Jmod, Jdata, Jb, Jobs, Jact, cff
88
89 real(dp), dimension(NinnLoop) :: zu, zgam, zfact, ztemp3
90 real(dp), dimension(NinnLoop) :: ztemp1, ztemp2, zu1, zu2
91 real(dp), dimension(NinnLoop) :: ztemp4
92 real(dp), dimension(Ndatum(ng)+1) :: px, pgrad, zw, zt
93 real(dp), dimension(Ndatum(ng)+1) :: zhv, zht, zd
94 real(dp), dimension(Ninner,3) :: zwork
95 real(dp), dimension(2*(NinnLoop-1)) :: work
96 real(dp), dimension(Ninner,Ninner) :: zgv
97
98 character (len=13) :: string
99
100 character (len=*), parameter :: MyFile = &
101 & __FILE__
102
103
104
105
106
107# ifdef PROFILE
108
109
110
111 CALL wclock_on (ng, model, 85, __line__, myfile)
112# endif
113
114
115
116
117
118
119
120
121
122
123
124
125
126 ltrans=.false.
127
128
129
130
131 jopt=0.0_dp
132 jf=0.0_dp
133 jdata=0.0_dp
134 jmod=0.0_dp
135 jb=jb0(outloop-1)
136 jobs=0.0_dp
137 jact=0.0_dp
138 ritzmaxerr=hevecerr
139 eps=0.0_dp
140 preducv=0.0_dp
141 preducy=0.0_dp
142 zwork=0.0_dp
143 zgv=0.0_dp
144
145
146 master_thread : IF (master) THEN
147
148
149
150
151 IF (innloop.gt.0) THEN
152 DO iobs=1,ndatum(ng)
153 tlmodval(iobs)=obsscale(iobs)*tlmodval(iobs)
154 END DO
155 END IF
156
157
158
159
160
161 minimize : IF (innloop.eq.0) THEN
162
163# if defined RBL4DVAR || \
164 defined rbl4dvar_ana_sensitivity || \
165 defined rbl4dvar_fct_sensitivity || \
166 defined tl_rbl4dvar
167
168 DO iobs=1,ndatum(ng)
169 bckmodval(iobs)=nlmodval(iobs)
170 END DO
171# endif
172
173
174
175 IF (outloop.eq.1) THEN
176 DO iobs=1,ndatum(ng)+1
177 px(iobs)=0.0_dp
178 END DO
179 DO iobs=1,ndatum(ng)
180 hbk(iobs,outloop)=0.0_dp
181 END DO
182 ELSE
183
184
185 DO iobs=1,ndatum(ng)
186 hbk(iobs,outloop)=-tlmodval(iobs)
187 END DO
188 IF (lprecond) THEN
189 DO iobs=1,ndatum(ng)+1
190 fourdvar(ng)%cg_Dpxsum(iobs)=fourdvar(ng)%cg_pxsum(iobs)
191 END DO
192 lscale=1
193 laug=.false.
194 CALL rprecond (ng, lscale, laug, outloop, ninnloop-1, &
195 & fourdvar(ng)%cg_Dpxsum)
196 DO iobs=1,ndatum(ng)+1
197 fourdvar(ng)%cg_Dpxsum(iobs)= &
198 & -fourdvar(ng)%cg_Dpxsum(iobs)+fourdvar(ng)%cg_pxsum(iobs)
199 END DO
200 END IF
201 END IF
202
203
204
205
206
207 DO iobs=1,ndatum(ng)
208
209
210
211# if defined RBL4DVAR || \
212 defined rbl4dvar_ana_sensitivity || \
213 defined rbl4dvar_fct_sensitivity || \
214 defined tl_rbl4dvar
215 pgrad(iobs)=obsscale(iobs)* &
216 & (obsval(iobs)-bckmodval(iobs))
217# else
218 pgrad(iobs)=obsscale(iobs)* &
219 & (obsval(iobs)-tlmodval(iobs))
220# endif
221 IF (obserr(iobs).ne.0.0_r8) THEN
222 pgrad(iobs)=pgrad(iobs)/obserr(iobs)
223 END IF
224 vgrad0(iobs)=pgrad(iobs)
225 vgrad0s(iobs)=vgrad0(iobs)
226 END DO
227
228
229
230
231 pgrad(ndatum(ng)+1)=1.0_dp
232 vgrad0(ndatum(ng)+1)=pgrad(ndatum(ng)+1)
233 vgrad0s(ndatum(ng)+1)=vgrad0(ndatum(ng)+1)
234
235
236
237
238
239 IF (lprecond.and.(outloop.gt.1)) THEN
240 lscale=1
241 laug=.true.
242 CALL rprecond (ng, lscale, laug, outloop, ninnloop-1, &
243 & pgrad)
244 END IF
245
246
247
248
249
250 DO iobs=1,ndatum(ng)+1
251 zgrad0(iobs,outloop)=pgrad(iobs)
252 END DO
253
254
255
256 DO iobs=1,ndatum(ng)
257 admodval(iobs)=zgrad0(iobs,outloop)
258 END DO
259
260 preducv=1.0_dp
261 preducy=1.0_dp
262
263
264
265
266
267 ELSE
268
269
270
271
272
273
274
275 IF (innloop.EQ.1) THEN
276 cg_gnorm_v(outloop)=0.0_dp
277 DO iobs=1,ndatum(ng)
278 cg_gnorm_v(outloop)=cg_gnorm_v(outloop)+ &
279 & tlmodval(iobs)*vgrad0(iobs)
280 END DO
281
282
283
284
285
286 DO iobs=1,ndatum(ng)
287 cg_gnorm_v(outloop)=cg_gnorm_v(outloop)+ &
288 & hbk(iobs,outloop)* &
289 & zgrad0(ndatum(ng)+1,outloop)* &
290 & vgrad0(iobs)+ &
291 & hbk(iobs,outloop)* &
292 & vgrad0(ndatum(ng)+1)* &
293 & zgrad0(iobs,outloop)
294 END DO
295 cg_gnorm_v(outloop)=cg_gnorm_v(outloop)+ &
296 & jb0(outloop-1)*vgrad0(ndatum(ng)+1)* &
297 & zgrad0(ndatum(ng)+1,outloop)
298
299 cg_gnorm_v(outloop)=sqrt(cg_gnorm_v(outloop))
300
301
302
303
304 cg_qg(1,outloop)=cg_gnorm_v(outloop)
305
306
307
308
309
310 DO iobs=1,ndatum(ng)+1
311
312
313
314 zcglwk(iobs,1,outloop)=vgrad0(iobs)/ &
315 & cg_gnorm_v(outloop)
316
317
318
319 vcglwk(iobs,1,outloop)=zgrad0(iobs,outloop)/ &
320 & cg_gnorm_v(outloop)
321 END DO
322
323
324
325 DO iobs=1,ndatum(ng)
326
327
328
329 tlmodval_s(iobs,innloop,outloop)=tlmodval(iobs)
330 tlmodval(iobs)=tlmodval(iobs)/cg_gnorm_v(outloop)
331 END DO
332
333 preducv=1.0_dp
334 preducy=1.0_dp
335
336
337
338 jobs=0.0_dp
339
340
341
342 jact=jb
343 DO iobs=1,ndatum(ng)
344 IF (obserr(iobs).ne.0.0_r8) THEN
345 jact=jact+obserr(iobs)*vgrad0s(iobs)*vgrad0s(iobs)
346 END IF
347 END DO
348 jobs=jact-jb
349
350 ELSE
351
352
353
354
355
356 DO iobs=1,ndatum(ng)+1
357
358
359
360 pgrad(iobs)=zcglwk(iobs,innloop,outloop)
361 END DO
362
363
364
365 cg_beta(innloop,outloop)=0.0_dp
366 DO iobs=1,ndatum(ng)
367 cg_beta(innloop,outloop)=cg_beta(innloop,outloop)+ &
368 & pgrad(iobs)*tlmodval(iobs)
369 END DO
370
371
372
373 DO iobs=1,ndatum(ng)
374 cg_beta(innloop,outloop)=cg_beta(innloop,outloop)+ &
375 & hbk(iobs,outloop)* &
376 & vcglwk(ndatum(ng)+1,innloop, &
377 & outloop)* &
378 & pgrad(iobs)+ &
379 & hbk(iobs,outloop)* &
380 & pgrad(ndatum(ng)+1)* &
381 & vcglwk(iobs,innloop,outloop)
382 END DO
383 cg_beta(innloop,outloop)=cg_beta(innloop,outloop)+ &
384 & jb0(outloop-1)* &
385 & pgrad(ndatum(ng)+1)* &
386 & vcglwk(ndatum(ng)+1,innloop, &
387 & outloop)
388
389 cg_beta(innloop,outloop)=sqrt(cg_beta(innloop,outloop))
390
391
392
393
394
395 DO iobs=1,ndatum(ng)+1
396
397
398
399 zcglwk(iobs,innloop,outloop)=pgrad(iobs)/ &
400 & cg_beta(innloop,outloop)
401
402
403
404 vcglwk(iobs,innloop,outloop)=vcglwk(iobs,innloop,outloop)/&
405 & cg_beta(innloop,outloop)
406 END DO
407
408
409
410
411
412 DO iobs=1,ndatum(ng)
413 tlmodval_s(iobs,innloop,outloop)=tlmodval(iobs)
414 tlmodval(iobs)=tlmodval(iobs)/cg_beta(innloop,outloop)
415 END DO
416
417
418
419 cg_qg(innloop,outloop)=0.0_dp
420 DO iobs=1,ndatum(ng)
421 cg_qg(innloop,outloop)=cg_qg(innloop,outloop)+ &
422 & tlmodval(iobs)* &
423 & vgrad0(iobs)
424 END DO
425
426
427
428 DO iobs=1,ndatum(ng)
429 cg_qg(innloop,outloop)=cg_qg(innloop,outloop)+ &
430 & hbk(iobs,outloop)* &
431 & vcglwk(ndatum(ng)+1,innloop, &
432 & outloop)* &
433 & vgrad0(iobs)+ &
434 & hbk(iobs,outloop)* &
435 & vcglwk(iobs,innloop,outloop)* &
436 & vgrad0(ndatum(ng)+1)
437 END DO
438 cg_qg(innloop,outloop)=cg_qg(innloop,outloop)+ &
439 & jb0(outloop-1)* &
440 & vcglwk(ndatum(ng)+1,innloop, &
441 & outloop)* &
442 & vgrad0(ndatum(ng)+1)
443
444
445
446
447
448
449
450
451 zbet=cg_delta(1,outloop)
452 zu(1)=cg_qg(1,outloop)/zbet
453 DO ivec=2,innloop-1
454 zgam(ivec)=cg_beta(ivec,outloop)/zbet
455 zbet=cg_delta(ivec,outloop)-cg_beta(ivec,outloop)* &
456 & zgam(ivec)
457 zu(ivec)=(cg_qg(ivec,outloop)-cg_beta(ivec,outloop)* &
458 & zu(ivec-1))/zbet
459 END DO
460 zwork(innloop-1,3)=zu(innloop-1)
461
462 DO ivec=innloop-2,1,-1
463 zu(ivec)=zu(ivec)-zgam(ivec+1)*zu(ivec+1)
464 zwork(ivec,3)=zu(ivec)
465 END DO
466
467
468
469 DO iobs=1,ndatum(ng)+1
470 zw(iobs)=zgrad0(iobs,outloop)+ &
471 & cg_beta(innloop,outloop)* &
472 & vcglwk(iobs,innloop,outloop)* &
473 & zwork(innloop-1,3)
474 END DO
475
476
477
478
479 DO iobs=1,ndatum(ng)+1
480 px(iobs)=0.0_dp
481 DO ivec=1,innloop-1
482 px(iobs)=px(iobs)+ &
483 & zcglwk(iobs,ivec,outloop)*zwork(ivec,3)
484 zw(iobs)=zw(iobs)+ &
485 & zcglwk(iobs,ivec,outloop)*cg_qg(ivec,outloop)
486 END DO
487 END DO
488
489
490
491
492 IF (lprecond.and.(outloop.gt.1)) THEN
493 lscale=1
494 laug=.true.
495 CALL rprecond (ng, lscale, laug, outloop, ninnloop-1, px)
496 END IF
497
498
499
500
501
502
503
504
505
506
507
508 IF (lprecond.and.(outloop.gt.1)) THEN
509 lscale=1
510 laug=.true.
511 CALL rprecond (ng, lscale, laug, outloop, ninnloop-1, zw)
512 END IF
513
514 preducv=0.0_dp
515
516
517
518 DO iobs=1,ndatum(ng)+1
519 preducv=preducv+zw(iobs)*zw(iobs)
520 END DO
521 preducv=sqrt(preducv)/cg_gnorm_v(outloop)
522
523
524
525
526
527 eps=abs(cg_beta(innloop,outloop)*zwork(innloop-1,3))
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553 IF (outloop.eq.1) THEN
554 DO iobs=1,ndatum(ng)
555 IF (obserr(iobs).ne.0.0_r8) THEN
556
557 jopt=jopt+px(iobs)*tlmodval_s(iobs,1,outloop)
558
559 jf=jf+vgrad0(iobs)*tlmodval_s(iobs,1,outloop)
560 END IF
561
562
563 END DO
564
565 ELSE
566 DO iobs=1,ndatum(ng)
567
568
569 IF (obserr(iobs).ne.0.0_r8) THEN
570 jf=jf+cg_innov(iobs)*cg_innov(iobs)
571 END IF
572
573
574
575 END DO
576 jmod=jopt-jdata
577 END IF
578
579
580
581 DO ivec=1,innloop-1
582 IF (ivec.eq.1) THEN
583 zfact(ivec)=1.0_dp/cg_gnorm_v(outloop)
584 ELSE
585 zfact(ivec)=1.0_dp/cg_beta(ivec,outloop)
586 ENDIF
587 END DO
588
589
590
591 DO iobs=1,ndatum(ng)+1
592 zd(iobs)=vgrad0s(iobs)
593 END DO
594
595
596
597 DO iobs=1,ndatum(ng)+1
598 zhv(iobs)=zd(iobs)
599 END DO
600 DO ivec=1,innloop-1
601 ztemp1(ivec)=0.0_dp
602 ztemp3(ivec)=0.0_dp
603 ztemp4(ivec)=0.0_dp
604 DO iobs=1,ndatum(ng)
605 ztemp1(ivec)=ztemp1(ivec)+ &
606 & tlmodval_s(iobs,ivec,outloop)* &
607 & zhv(iobs)* &
608 & zfact(ivec)
609 ztemp3(ivec)=ztemp3(ivec)+ &
610 & vcglwk(iobs,ivec,outloop)* &
611 & hbk(iobs,outloop)
612 ztemp4(ivec)=ztemp4(ivec)+ &
613 & tlmodval_s(iobs,ivec,outloop)* &
614 & zgrad0(iobs,outloop)* &
615 & zfact(ivec)
616 END DO
617
618
619
620
621
622 DO iobs=1,ndatum(ng)
623 ztemp1(ivec)=ztemp1(ivec)+ &
624 & zhv(iobs)* &
625 & hbk(iobs,outloop)* &
626 & vcglwk(ndatum(ng)+1,ivec,outloop)+ &
627 & hbk(iobs,outloop)* &
628 & vcglwk(iobs,ivec,outloop)* &
629 & zhv(ndatum(ng)+1)
630 ztemp4(ivec)=ztemp4(ivec)+ &
631 & zgrad0(iobs,outloop)* &
632 & hbk(iobs,outloop)* &
633 & vcglwk(ndatum(ng)+1,ivec,outloop)+ &
634 & hbk(iobs,outloop)* &
635 & vcglwk(iobs,ivec,outloop)* &
636 & zgrad0(ndatum(ng)+1,outloop)
637 END DO
638 ztemp1(ivec)=ztemp1(ivec)+ &
639 & zhv(ndatum(ng)+1)* &
640 & jb0(outloop-1)* &
641 & vcglwk(ndatum(ng)+1,ivec,outloop)
642 ztemp3(ivec)=ztemp3(ivec)+ &
643 & jb0(outloop-1)* &
644 & vcglwk(ndatum(ng)+1,ivec,outloop)
645 ztemp4(ivec)=ztemp4(ivec)+ &
646 & zgrad0(ndatum(ng)+1,outloop)* &
647 & jb0(outloop-1)* &
648 & vcglwk(ndatum(ng)+1,ivec,outloop)
649
650 ztemp4(ivec)=0.0_dp
651
652 END DO
653 zbet=cg_delta(1,outloop)
654
655
656 zu1(1)=cg_qg(1,outloop)/zbet
657
658 DO ivec=2,innloop-1
659 zgam(ivec)=cg_beta(ivec,outloop)/zbet
660 zbet=cg_delta(ivec,outloop)- &
661 & cg_beta(ivec,outloop)*zgam(ivec)
662
663 zu1(ivec)=(ztemp4(ivec)- &
664 & cg_beta(ivec,outloop)*zu1(ivec-1))/zbet
665 END DO
666 ztemp2(innloop-1)=zu1(innloop-1)
667
668 DO ivec=innloop-2,1,-1
669 zu1(ivec)=zu1(ivec)-zgam(ivec+1)*zu1(ivec+1)
670 ztemp2(ivec)=zu1(ivec)
671 END DO
672
673 jb=jb0(outloop-1)
674 jact=jb
675 DO iobs=1,ndatum(ng)
676 IF (obserr(iobs).ne.0.0_r8) THEN
677 jact=jact+obserr(iobs)*vgrad0s(iobs)*vgrad0s(iobs)
678 END IF
679 END DO
680 DO ivec=1,innloop-1
681 jb=jb+ztemp2(ivec)*ztemp2(ivec)
682
683
684 jact=jact-ztemp1(ivec)*ztemp2(ivec)
685 END DO
686 DO iobs=1,ndatum(ng)
687 jb=jb-2.0_dp*px(iobs)*hbk(iobs,outloop)
688
689 jact=jact+2.0_dp*px(iobs)*hbk(iobs,outloop)
690
691 END DO
692 jb=jb-2.0_dp*px(ndatum(ng)+1)*jb0(outloop-1)
693
694 jact=jact+2.0_dp*px(ndatum(ng)+1)*jb0(outloop-1)
695
696 jobs=jact-jb
697
698 END IF
699
700
701
702
703
704
705
706
707 DO iobs=1,ndatum(ng)
708
709
710
711 pgrad(iobs)=tlmodval(iobs)+ &
712 & hbk(iobs,outloop)* &
713 & vcglwk(ndatum(ng)+1,innloop,outloop)
714 END DO
715 DO iobs=1,ndatum(ng)
716
717
718
719 IF (obserr(iobs).ne.0.0_r8) THEN
720
721
722
723 pgrad(iobs)=pgrad(iobs)/obserr(iobs)
724 END IF
725 END DO
726 pgrad(ndatum(ng)+1)=0.0_dp
727
728
729
730 DO iobs=1,ndatum(ng)
731 pgrad(iobs)=pgrad(iobs)+vcglwk(iobs,innloop,outloop)
732 END DO
733 pgrad(ndatum(ng)+1)=pgrad(ndatum(ng)+1)+ &
734 & vcglwk(ndatum(ng)+1,innloop,outloop)
735
736 IF (innloop.gt.1) THEN
737
738
739
740
741
742 DO iobs=1,ndatum(ng)+1
743 pgrad(iobs)=pgrad(iobs)- &
744 & cg_beta(innloop,outloop)* &
745 & zcglwk(iobs,innloop-1,outloop)
746 END DO
747 END IF
748
749 cg_delta(innloop,outloop)=0.0_dp
750
751
752
753
754
755 DO iobs=1,ndatum(ng)
756 cg_delta(innloop,outloop)=cg_delta(innloop,outloop)+ &
757 & tlmodval(iobs)* &
758 & pgrad(iobs)+ &
759 & hbk(iobs,outloop)* &
760 & vcglwk(ndatum(ng)+1,innloop, &
761 & outloop)* &
762 & pgrad(iobs)+ &
763 & hbk(iobs,outloop)* &
764 & vcglwk(iobs,innloop,outloop)* &
765 & pgrad(ndatum(ng)+1)
766 END DO
767 cg_delta(innloop,outloop)=cg_delta(innloop,outloop)+ &
768 & jb0(outloop-1)* &
769 & vcglwk(ndatum(ng)+1,innloop, &
770 & outloop)* &
771 & pgrad(ndatum(ng)+1)
772
773
774
775 IF (cg_delta(innloop,outloop).le.0.0_dp) THEN
776 WRITE (stdout,20) cg_delta(innloop,outloop), outloop, &
777 & innloop
778 exit_flag=8
779 GO TO 10
780 END IF
781
782
783
784
785
786 DO iobs=1,ndatum(ng)+1
787 pgrad(iobs)=pgrad(iobs)-cg_delta(innloop,outloop)* &
788 & zcglwk(iobs,innloop,outloop)
789 END DO
790
791
792
793
794
795 DO ivec=1,innloop
796 IF (ivec.eq.1) THEN
797 zfact(ivec)=1.0_dp/cg_gnorm_v(outloop)
798 ELSE
799 zfact(ivec)=1.0_dp/cg_beta(ivec,outloop)
800 ENDIF
801 END DO
802
803
804
805
806
807 DO ivec=innloop,1,-1
808 cg_dla(ivec,outloop)=0.0_dp
809 DO iobs=1,ndatum(ng)
810 cg_dla(ivec,outloop)=cg_dla(ivec,outloop)+ &
811 & pgrad(iobs)* &
812 & tlmodval_s(iobs,ivec,outloop)* &
813 & zfact(ivec)+pgrad(iobs)* &
814 & hbk(iobs,outloop)* &
815 & vcglwk(ndatum(ng)+1,ivec,outloop)+ &
816 & hbk(iobs,outloop)* &
817 & vcglwk(iobs,ivec,outloop)* &
818 & pgrad(ndatum(ng)+1)
819 END DO
820 cg_dla(ivec,outloop)=cg_dla(ivec,outloop)+ &
821 & jb0(outloop-1)* &
822 & vcglwk(ndatum(ng)+1,ivec,outloop)* &
823 & pgrad(ndatum(ng)+1)
824 DO iobs=1,ndatum(ng)+1
825 pgrad(iobs)=pgrad(iobs)- &
826 & cg_dla(ivec,outloop)* &
827 & vcglwk(iobs,ivec,outloop)
828 END DO
829 END DO
830
831
832
833
834
835
836
837
838
839 DO iobs=1,ndatum(ng)+1
840 zcglwk(iobs,innloop+1,outloop)=pgrad(iobs)
841 END DO
842
843
844
845
846
847 IF (lprecond.and.(outloop.gt.1)) THEN
848 lscale=1
849 laug=.true.
850 CALL rprecond (ng, lscale, laug, outloop, ninnloop-1, pgrad)
851 END IF
852
853
854
855
856
857 DO iobs=1,ndatum(ng)+1
858 vcglwk(iobs,innloop+1,outloop)=pgrad(iobs)
859 END DO
860
861
862
863
864
865 IF (innloop.eq.ninnloop) THEN
866
867
868
869
870 DO iobs=1,ndatum(ng)
871 admodval(iobs)=px(iobs)
872 END DO
873 DO iobs=1,ndatum(ng)+1
874 fourdvar(ng)%cg_pxsum(iobs)=fourdvar(ng)%cg_pxsum(iobs)+ &
875 & fourdvar(ng)%cg_pxsave(iobs)
876 fourdvar(ng)%cg_pxsave(iobs)=px(iobs)
877
878
879 END DO
880 ELSE
881
882
883
884 DO iobs=1,ndatum(ng)
885 admodval(iobs)=vcglwk(iobs,innloop+1,outloop)
886 END DO
887
888 END IF
889
890 END IF minimize
891
892
893
894
895
896 IF (innloop.gt.0) THEN
897 WRITE (stdout,30) ndatum(ng), &
898 & outloop, innloop-1, eps, &
899 & outloop, innloop-1, preducy, &
900 & outloop, innloop-1, preducv, &
901 & outloop, innloop-1, jf, &
902 & outloop, innloop-1, jdata, &
903 & outloop, innloop-1, jmod, &
904 & outloop, innloop-1, jopt, &
905 & outloop, innloop-1, jb, &
906 & outloop, innloop-1, jobs, &
907 & outloop, innloop-1, jact, &
908 & outloop, innloop-1
909 END IF
910 DO ivec=1,innloop
911 WRITE (stdout,40) ivec, cg_delta(ivec,outloop), &
912 & cg_beta(ivec,outloop), zwork(ivec,3)
913 END DO
914 WRITE (stdout,50) innloop+1, cg_beta(innloop+1,outloop)
915
916
917
918 IF ((lhessianev.or.lprecond).and.(outloop.gt.1)) THEN
919 IF (nritzev.gt.0) THEN
920 WRITE (stdout,60) outloop, innloop, nconvritz
921 ic=0
922 DO ivec=1,ninnloop-1
923 IF (ivec.gt.(ninnloop-1-nconvritz)) THEN
924 string=' '
925 ic=ic+1
926 WRITE (stdout,70) ivec, cg_ritz(ivec,outloop-1), &
927 & cg_ritzerr(ivec,outloop-1), &
928 & trim(adjustl(string)), &
929 & 'Used=', ic
930 ELSE
931 string=' '
932 WRITE (stdout,80) ivec, cg_ritz(ivec,outloop-1), &
933 & cg_ritzerr(ivec,outloop-1), &
934 & trim(adjustl(string))
935 END IF
936 END DO
937 ELSE
938 WRITE (stdout,90) outloop, innloop, ritzmaxerr
939 ic=0
940 DO ivec=1,ninnloop
941 IF (cg_ritzerr(ivec,outloop-1).le.ritzmaxerr) THEN
942 string='converged'
943 ic=ic+1
944 WRITE (stdout,70) ivec, cg_ritz(ivec,outloop-1), &
945 & cg_ritzerr(ivec,outloop-1), &
946 & trim(adjustl(string)), &
947 & 'Good=', ic
948 ELSE
949 string='not converged'
950 WRITE (stdout,80) ivec, cg_ritz(ivec,outloop-1), &
951 & cg_ritzerr(ivec,outloop-1), &
952 & trim(adjustl(string))
953 END IF
954 END DO
955 END IF
956 END IF
957
958
959
960
961
962
963
964 IF (innloop.eq.ninnloop) THEN
965 IF (lhessianev.or.lprecond) THEN
966 DO ivec=1,innloop-1
967 cg_ritz(ivec,outloop)=cg_delta(ivec,outloop)
968 END DO
969 DO ivec=1,innloop-2
970 zwork(ivec,1)=cg_beta(ivec+1,outloop)
971 END DO
972
973
974
975
976
977 CALL dsteqr ('I', innloop-1, cg_ritz(1,outloop), zwork(1,1),&
978 & zgv, ninner, work, info)
979 IF (info.ne.0) THEN
980 WRITE (stdout,*) ' RPCG_LANCZOS - Error in DSTEQR:', &
981 & ' info = ',info
982 exit_flag=8
983 GO TO 10
984 END IF
985
986 DO j=1,ninner
987 DO i=1,ninner
988 cg_zv(i,j,outloop)=zgv(i,j)
989 END DO
990 END DO
991
992
993
994 DO ivec=1,innloop-1
995 cg_ritzerr(ivec,outloop)=abs(cg_beta(innloop,outloop)* &
996 & cg_zv(innloop-1,ivec,outloop))
997 END DO
998
999
1000
1001 DO ivec=1,innloop-1
1002 IF (cg_ritzerr(ivec,outloop).lt.0.0_dp) THEN
1003 WRITE (stdout,*) ' RPCG_LANCZOS - negative Ritz value', &
1004 & ' found.'
1005 exit_flag=8
1006 GO TO 10
1007 END IF
1008 END DO
1009
1010
1011
1012 DO ivec=1,ninnloop-1
1013 cg_ritzerr(ivec,outloop)=cg_ritzerr(ivec,outloop)/ &
1014 & cg_ritz(ninnloop-1,outloop)
1015 END DO
1016
1017
1018
1019 WRITE (stdout,100) outloop, innloop, ritzmaxerr
1020 ic=0
1021 DO ivec=1,ninnloop-1
1022 IF (cg_ritzerr(ivec,outloop).le.ritzmaxerr) THEN
1023 string='converged'
1024 ic=ic+1
1025 WRITE (stdout,70) ivec, cg_ritz(ivec,outloop), &
1026 & cg_ritzerr(ivec,outloop), &
1027 & trim(adjustl(string)), &
1028 & 'Good=', ic
1029 ELSE
1030 string='not converged'
1031 WRITE (stdout,80) ivec, cg_ritz(ivec,outloop), &
1032 & cg_ritzerr(ivec,outloop), &
1033 & trim(adjustl(string))
1034 END IF
1035 END DO
1036
1037
1038
1039 CALL rpevecs (ng, outloop, ninnloop-1)
1040 END IF
1041 END IF
1042
1043 END IF master_thread
1044
1045
1046
1047
1048
1049 10 CONTINUE
1050# ifdef DISTRIBUTE
1051 CALL mp_bcasti (ng, model, exit_flag)
1052# endif
1053 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1054
1055# ifdef DISTRIBUTE
1056
1057
1058
1059
1060
1061 CALL mp_bcastf (ng, model, admodval)
1062# if defined RBL4DVAR || defined R4DVAR || \
1063 defined sensitivity_4dvar || defined tl_rbl4dvar || \
1064 defined tl_r4dvar
1065
1066 CALL mp_bcastf (ng, model, hbk(:,outloop))
1067 CALL mp_bcastf (ng, model, jb0(outloop-1))
1068# endif
1069 CALL mp_bcasti (ng, model, info)
1070 CALL mp_bcastf (ng, model, cg_beta(:,outloop))
1071 CALL mp_bcastf (ng, model, cg_qg(:,outloop))
1072 CALL mp_bcastf (ng, model, cg_delta(:,outloop))
1073 CALL mp_bcastf (ng, model, cg_dla(:,outloop))
1074 CALL mp_bcastf (ng, model, cg_gnorm_y(:))
1075 CALL mp_bcastf (ng, model, cg_gnorm_v(:))
1076 CALL mp_bcastf (ng, model, fourdvar(ng)%cg_pxsave(:))
1077
1078 CALL mp_bcastf (ng, model, cg_innov(:))
1079 CALL mp_bcastf (ng, model, zgrad0(:,outloop))
1080 CALL mp_bcastf (ng, model, zcglwk(:,:,outloop))
1081 CALL mp_bcastf (ng, model, vcglwk(:,:,outloop))
1082 IF ((lhessianev.or.lprecond).and.(innloop.eq.ninnloop)) THEN
1083 CALL mp_bcastf (ng, model, cg_ritz(:,outloop))
1084 CALL mp_bcastf (ng, model, cg_ritzerr(:,outloop))
1085 CALL mp_bcastf (ng, model, cg_zv(:,:,outloop))
1086 CALL mp_bcastf (ng, model, vcglev(:,:,outloop))
1087 END IF
1088 CALL mp_bcastf (ng, model, jf)
1089 CALL mp_bcastf (ng, model, jdata)
1090 CALL mp_bcastf (ng, model, jmod)
1091 CALL mp_bcastf (ng, model, jopt)
1092 CALL mp_bcastf (ng, model, jobs)
1093 CALL mp_bcastf (ng, model, jact)
1094 CALL mp_bcastf (ng, model, preducv)
1095 CALL mp_bcastf (ng, model, preducy)
1096# endif
1097
1098
1099
1100
1101
1102# ifdef BGQC
1103
1104
1105
1106 jact_s(innloop)=jact
1107
1108# endif
1109 IF (innloop.gt.0) THEN
1110 CALL cg_write_rpcg (ng, model, innloop, outloop, &
1111 & jf, jdata, jmod, jopt, jb, jobs, jact, &
1112 & preducv, preducy)
1113 END IF
1114
1115# ifdef PROFILE
1116
1117
1118
1119 CALL wclock_off (ng, model, 85, __line__, myfile)
1120# endif
1121
1122 20 FORMAT (/,' RPCG_LANCZOS - Fatal error, not possitive definite', &
1123 & ' algorithm:',/, &
1124 & /,11x,'cg_delta = ',1p,e15.8,0p,3x,'(',i3.3,', ',i3.3,')')
1125 30 FORMAT (/,' RPCG_LANCZOS - Conjugate Gradient Information:',/, &
1126 & /,11x,'Ndatum = ',i0,/, /, &
1127 & 1x,'(',i3.3,',',i3.3,'): ', &
1128 & 'Residual estimate, eps = ', &
1129 & 1p,e14.7,/,1x,'(',i3.3,',',i3.3,'): ', &
1130 & 'Reduction in gradient norm, Greduc y-space = ', &
1131 & 1p,e14.7,/,1x,'(',i3.3,',',i3.3,'): ', &
1132 & 'Reduction in gradient norm, Greduc v-space = ', &
1133 & 1p,e14.7,/,1x,'(',i3.3,',',i3.3,'): ', &
1134 & 'First guess initial data misfit, Jf = ', &
1135 & 1p,e14.7,/,1x,'(',i3.3,',',i3.3,'): ', &
1136 & 'State estimate data misfit, Jdata = ', &
1137 & 1p,e14.7,/,1x,'(',i3.3,',',i3.3,'): ', &
1138 & 'Model penalty function, Jmod = ', &
1139 & 1p,e14.7,/,1x,'(',i3.3,',',i3.3,'): ', &
1140 & 'Optimal penalty function, Jopt = ', &
1141 & 1p,e14.7,/,/,1x,'(',i3.3,',',i3.3,'): ', &
1142 & 'Actual Model penalty function, Jb = ', &
1143 & 1p,e14.7,/,1x,'(',i3.3,',',i3.3,'): ', &
1144 & 'Actual data penalty function, Jobs = ', &
1145 & 1p,e14.7,/,/,1x,'(',i3.3,',',i3.3,'): ', &
1146 & 'Actual total penalty function, Jact = ', &
1147 & 1p,e14.7,/,/,1x,'(',i3.3,',',i3.3,'): ', &
1148 & 'Lanczos vectors - cg_delta, cg_beta, zwork:',/)
1149 40 FORMAT (6x,i3.3,4x,3(1p,e15.8,5x))
1150 50 FORMAT (6x,i3.3,24x,1p,e15.8)
1151 60 FORMAT (/,1x,'(',i3.3,',',i3.3,'): ', &
1152 & 'Ritz eigenvalues used in preconditioning, ', &
1153 & 'nConvRitz = ',i3.3,/)
1154 70 FORMAT (6x,i3.3,2x,1p,e14.7,2x,1p,e14.7,2x,a,5x,'('a,i3.3,')')
1155 80 FORMAT (6x,i3.3,2x,1p,e14.7,2x,1p,e14.7,2x,a)
1156 90 FORMAT (/,1x,'(',i3.3,',',i3.3,'): ', &
1157 & 'Ritz eigenvalues used in preconditioning, ', &
1158 & 'RitzMaxErr = ',1p,e12.5,/)
1159100 FORMAT (/,1x,'(',i3.3,',',i3.3,'): ', &
1160 & 'New Ritz eigenvalues and their accuracy, ', &
1161 & 'RitzMaxErr = ',1p,e12.5,/)
1162
1163 RETURN
recursive subroutine wclock_off(ng, model, region, line, routine)
recursive subroutine wclock_on(ng, model, region, line, routine)