77 logical,
intent(in) :: lcgini
78 integer,
intent(in) :: ng, model, outloop, innloop, ninnloop
82 logical :: ltrans, laug
84 integer :: i, ic, j, iobs, ivec, lscale, info
86 real(dp) :: zbet, eps, preducv, preducy
87 real(dp) :: jopt, jf, jmod, jdata, jb,
jobs, jact, cff
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
98 character (len=13) :: string
100 character (len=*),
parameter :: myfile = &
111 CALL wclock_on (ng, model, 85, __line__, myfile)
146 master_thread :
IF (
master)
THEN
151 IF (innloop.gt.0)
THEN
153 tlmodval(iobs)=
obsscale(iobs)*tlmodval(iobs)
161 minimize :
IF (innloop.eq.0)
THEN
163# if defined RBL4DVAR || \
164 defined rbl4dvar_ana_sensitivity || \
165 defined rbl4dvar_fct_sensitivity || \
175 IF (outloop.eq.1)
THEN
180 hbk(iobs,outloop)=0.0_dp
186 hbk(iobs,outloop)=-tlmodval(iobs)
194 CALL rprecond (ng, lscale, laug, outloop, ninnloop-1, &
211# if defined RBL4DVAR || \
212 defined rbl4dvar_ana_sensitivity || \
213 defined rbl4dvar_fct_sensitivity || \
216 & (
obsval(iobs)-bckmodval(iobs))
219 & (
obsval(iobs)-tlmodval(iobs))
221 IF (
obserr(iobs).ne.0.0_r8)
THEN
222 pgrad(iobs)=pgrad(iobs)/
obserr(iobs)
231 pgrad(
ndatum(ng)+1)=1.0_dp
239 IF (
lprecond.and.(outloop.gt.1))
THEN
242 CALL rprecond (ng, lscale, laug, outloop, ninnloop-1, &
251 zgrad0(iobs,outloop)=pgrad(iobs)
275 IF (innloop.EQ.1)
THEN
279 & tlmodval(iobs)*
vgrad0(iobs)
288 & hbk(iobs,outloop)* &
291 & hbk(iobs,outloop)* &
329 tlmodval_s(iobs,innloop,outloop)=tlmodval(iobs)
330 tlmodval(iobs)=tlmodval(iobs)/
cg_gnorm_v(outloop)
344 IF (
obserr(iobs).ne.0.0_r8)
THEN
360 pgrad(iobs)=
zcglwk(iobs,innloop,outloop)
365 cg_beta(innloop,outloop)=0.0_dp
368 & pgrad(iobs)*tlmodval(iobs)
375 & hbk(iobs,outloop)* &
379 & hbk(iobs,outloop)* &
381 &
vcglwk(iobs,innloop,outloop)
399 zcglwk(iobs,innloop,outloop)=pgrad(iobs)/ &
404 vcglwk(iobs,innloop,outloop)=
vcglwk(iobs,innloop,outloop)/&
413 tlmodval_s(iobs,innloop,outloop)=tlmodval(iobs)
414 tlmodval(iobs)=tlmodval(iobs)/
cg_beta(innloop,outloop)
419 cg_qg(innloop,outloop)=0.0_dp
421 cg_qg(innloop,outloop)=
cg_qg(innloop,outloop)+ &
429 cg_qg(innloop,outloop)=
cg_qg(innloop,outloop)+ &
430 & hbk(iobs,outloop)* &
434 & hbk(iobs,outloop)* &
435 &
vcglwk(iobs,innloop,outloop)* &
438 cg_qg(innloop,outloop)=
cg_qg(innloop,outloop)+ &
452 zu(1)=
cg_qg(1,outloop)/zbet
454 zgam(ivec)=
cg_beta(ivec,outloop)/zbet
460 zwork(innloop-1,3)=zu(innloop-1)
462 DO ivec=innloop-2,1,-1
463 zu(ivec)=zu(ivec)-zgam(ivec+1)*zu(ivec+1)
464 zwork(ivec,3)=zu(ivec)
470 zw(iobs)=
zgrad0(iobs,outloop)+ &
472 &
vcglwk(iobs,innloop,outloop)* &
483 &
zcglwk(iobs,ivec,outloop)*zwork(ivec,3)
492 IF (
lprecond.and.(outloop.gt.1))
THEN
495 CALL rprecond (ng, lscale, laug, outloop, ninnloop-1, px)
508 IF (
lprecond.and.(outloop.gt.1))
THEN
511 CALL rprecond (ng, lscale, laug, outloop, ninnloop-1, zw)
519 preducv=preducv+zw(iobs)*zw(iobs)
527 eps=abs(
cg_beta(innloop,outloop)*zwork(innloop-1,3))
553 IF (outloop.eq.1)
THEN
555 IF (
obserr(iobs).ne.0.0_r8)
THEN
557 jopt=jopt+px(iobs)*tlmodval_s(iobs,1,outloop)
559 jf=jf+
vgrad0(iobs)*tlmodval_s(iobs,1,outloop)
569 IF (
obserr(iobs).ne.0.0_r8)
THEN
585 zfact(ivec)=1.0_dp/
cg_beta(ivec,outloop)
605 ztemp1(ivec)=ztemp1(ivec)+ &
606 & tlmodval_s(iobs,ivec,outloop)* &
609 ztemp3(ivec)=ztemp3(ivec)+ &
610 &
vcglwk(iobs,ivec,outloop)* &
612 ztemp4(ivec)=ztemp4(ivec)+ &
613 & tlmodval_s(iobs,ivec,outloop)* &
623 ztemp1(ivec)=ztemp1(ivec)+ &
625 & hbk(iobs,outloop)* &
627 & hbk(iobs,outloop)* &
628 &
vcglwk(iobs,ivec,outloop)* &
630 ztemp4(ivec)=ztemp4(ivec)+ &
632 & hbk(iobs,outloop)* &
634 & hbk(iobs,outloop)* &
635 &
vcglwk(iobs,ivec,outloop)* &
638 ztemp1(ivec)=ztemp1(ivec)+ &
642 ztemp3(ivec)=ztemp3(ivec)+ &
645 ztemp4(ivec)=ztemp4(ivec)+ &
656 zu1(1)=
cg_qg(1,outloop)/zbet
659 zgam(ivec)=
cg_beta(ivec,outloop)/zbet
661 &
cg_beta(ivec,outloop)*zgam(ivec)
663 zu1(ivec)=(ztemp4(ivec)- &
664 &
cg_beta(ivec,outloop)*zu1(ivec-1))/zbet
666 ztemp2(innloop-1)=zu1(innloop-1)
668 DO ivec=innloop-2,1,-1
669 zu1(ivec)=zu1(ivec)-zgam(ivec+1)*zu1(ivec+1)
670 ztemp2(ivec)=zu1(ivec)
676 IF (
obserr(iobs).ne.0.0_r8)
THEN
681 jb=jb+ztemp2(ivec)*ztemp2(ivec)
684 jact=jact-ztemp1(ivec)*ztemp2(ivec)
687 jb=jb-2.0_dp*px(iobs)*hbk(iobs,outloop)
689 jact=jact+2.0_dp*px(iobs)*hbk(iobs,outloop)
692 jb=jb-2.0_dp*px(
ndatum(ng)+1)*
jb0(outloop-1)
694 jact=jact+2.0_dp*px(
ndatum(ng)+1)*
jb0(outloop-1)
711 pgrad(iobs)=tlmodval(iobs)+ &
712 & hbk(iobs,outloop)* &
719 IF (
obserr(iobs).ne.0.0_r8)
THEN
723 pgrad(iobs)=pgrad(iobs)/
obserr(iobs)
726 pgrad(
ndatum(ng)+1)=0.0_dp
731 pgrad(iobs)=pgrad(iobs)+
vcglwk(iobs,innloop,outloop)
736 IF (innloop.gt.1)
THEN
743 pgrad(iobs)=pgrad(iobs)- &
745 &
zcglwk(iobs,innloop-1,outloop)
759 & hbk(iobs,outloop)* &
763 & hbk(iobs,outloop)* &
764 &
vcglwk(iobs,innloop,outloop)* &
775 IF (
cg_delta(innloop,outloop).le.0.0_dp)
THEN
787 pgrad(iobs)=pgrad(iobs)-
cg_delta(innloop,outloop)* &
788 &
zcglwk(iobs,innloop,outloop)
799 zfact(ivec)=1.0_dp/
cg_beta(ivec,outloop)
808 cg_dla(ivec,outloop)=0.0_dp
812 & tlmodval_s(iobs,ivec,outloop)* &
813 & zfact(ivec)+pgrad(iobs)* &
814 & hbk(iobs,outloop)* &
816 & hbk(iobs,outloop)* &
817 &
vcglwk(iobs,ivec,outloop)* &
825 pgrad(iobs)=pgrad(iobs)- &
827 &
vcglwk(iobs,ivec,outloop)
840 zcglwk(iobs,innloop+1,outloop)=pgrad(iobs)
847 IF (
lprecond.and.(outloop.gt.1))
THEN
850 CALL rprecond (ng, lscale, laug, outloop, ninnloop-1, pgrad)
858 vcglwk(iobs,innloop+1,outloop)=pgrad(iobs)
865 IF (innloop.eq.ninnloop)
THEN
876 fourdvar(ng)%cg_pxsave(iobs)=px(iobs)
896 IF (innloop.gt.0)
THEN
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, &
912 &
cg_beta(ivec,outloop), zwork(ivec,3)
928 & trim(adjustl(string)), &
934 & trim(adjustl(string))
946 & trim(adjustl(string)), &
949 string=
'not converged'
952 & trim(adjustl(string))
964 IF (innloop.eq.ninnloop)
THEN
970 zwork(ivec,1)=
cg_beta(ivec+1,outloop)
977 CALL dsteqr (
'I', innloop-1,
cg_ritz(1,outloop), zwork(1,1),&
978 & zgv,
ninner, work, info)
980 WRITE (
stdout,*)
' RPCG_LANCZOS - Error in DSTEQR:', &
988 cg_zv(i,j,outloop)=zgv(i,j)
996 &
cg_zv(innloop-1,ivec,outloop))
1003 WRITE (
stdout,*)
' RPCG_LANCZOS - negative Ritz value', &
1012 DO ivec=1,ninnloop-1
1021 DO ivec=1,ninnloop-1
1027 & trim(adjustl(string)), &
1030 string=
'not converged'
1033 & trim(adjustl(string))
1039 CALL rpevecs (ng, outloop, ninnloop-1)
1043 END IF master_thread
1062# if defined RBL4DVAR || defined R4DVAR || \
1063 defined sensitivity_4dvar || defined tl_rbl4dvar || \
1066 CALL mp_bcastf (ng, model, hbk(:,outloop))
1109 IF (innloop.gt.0)
THEN
1111 & jf, jdata, jmod, jopt, jb,
jobs, jact, &
1119 CALL wclock_off (ng, model, 85, __line__, myfile)
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,/)
1469 & Jf, Jdata, Jmod, Jopt, Jb, Jobs, &
1470 & Jact, preducv, preducy)
1477 integer,
intent(in) :: ng, model, innloop, outloop
1479 real(dp),
intent(in) :: jf, jdata, jmod, jopt, preducv, preducy
1480 real(dp),
intent(in) :: jb,
jobs, jact
1484 integer ::
nconv, status
1486 character (len=*),
parameter :: myfile = &
1487 & __FILE__//
", cg_write_rpcg_nf90"
1500 & ncid =
dav(ng)%ncid)
1506 & ncid =
dav(ng)%ncid)
1511 IF (innloop.eq.
ninner)
THEN
1514 & (/outloop/), (/1/), &
1515 & ncid =
dav(ng)%ncid)
1521 IF (innloop.eq.
ninner)
THEN
1525 & (/1,outloop/), (/
nconv,1/), &
1526 & ncid =
dav(ng)%ncid)
1532 IF (innloop.gt.0)
THEN
1536 & ncid =
dav(ng)%ncid)
1542 IF (innloop.gt.0)
THEN
1546 & ncid =
dav(ng)%ncid)
1552 IF (innloop.gt.0)
THEN
1556 & ncid =
dav(ng)%ncid)
1562 IF (innloop.eq.1)
THEN
1566 & ncid =
dav(ng)%ncid)
1572 & ncid =
dav(ng)%ncid)
1578 IF (innloop.gt.0)
THEN
1582 & ncid =
dav(ng)%ncid)
1588 IF (innloop.gt.0)
THEN
1590 &
'cg_Greduc_y', preducy, &
1591 & (/innloop,outloop/), (/1,1/), &
1592 & ncid =
dav(ng)%ncid)
1596 &
'cg_Greduc_v', preducv, &
1597 & (/innloop,outloop/), (/1,1/), &
1598 & ncid =
dav(ng)%ncid)
1604 IF (innloop.gt.0)
THEN
1608 & ncid =
dav(ng)%ncid)
1614 IF (innloop.gt.0)
THEN
1618 & ncid =
dav(ng)%ncid)
1624 IF (innloop.gt.0)
THEN
1626 &
'cg_zv',
cg_zv(:,:,outloop), &
1628 & ncid =
dav(ng)%ncid)
1634 IF (innloop.gt.0)
THEN
1637 & (/innloop+1,outloop/), (/1,1/), &
1638 & ncid =
dav(ng)%ncid)
1645 & (/innloop+1,outloop/), (/1,1/), &
1646 & ncid =
dav(ng)%ncid)
1653 & (/innloop+1,outloop/), (/1,1/), &
1654 & ncid =
dav(ng)%ncid)
1661 & (/innloop+1,outloop/), (/1,1/), &
1662 & ncid =
dav(ng)%ncid)
1669 & (/innloop+1,outloop/), (/1,1/), &
1670 & ncid =
dav(ng)%ncid)
1677 & (/innloop+1,outloop/), (/1,1/), &
1678 & ncid =
dav(ng)%ncid)
1685 & (/innloop+1,outloop/), (/1,1/), &
1686 & ncid =
dav(ng)%ncid)
1692 IF (innloop.eq.1)
THEN
1694 &
'zgrad0',
zgrad0(:,outloop), &
1695 & (/1,outloop/), (/
ndatum(ng)+1,1/), &
1696 & ncid =
dav(ng)%ncid)
1701 & (/1/), (/
ndatum(ng)+1/), &
1702 & ncid =
dav(ng)%ncid)
1706 &
'Hbk', hbk(:,outloop), &
1707 & (/1,outloop/), (/
ndatum(ng),1/), &
1708 & ncid =
dav(ng)%ncid)
1714 IF (innloop.gt.0)
THEN
1716 &
'zcglwk',
zcglwk(:,innloop,outloop), &
1717 & (/1,innloop,outloop/), &
1718 & (/
ndatum(ng)+1,1,1/), &
1719 & ncid =
dav(ng)%ncid)
1723 &
'vcglwk',
vcglwk(:,innloop,outloop), &
1724 & (/1,innloop,outloop/), &
1725 & (/
ndatum(ng)+1,1,1/), &
1726 & ncid =
dav(ng)%ncid)
1734 & tlmodval_s(:,innloop,outloop), &
1735 & (/1,innloop,outloop/), (/
ndatum(ng),1,1/), &
1736 & ncid =
dav(ng)%ncid)
1752 & Jf, Jdata, Jmod, Jopt, Jb, Jobs, &
1753 & Jact, preducv, preducy)
1760 integer,
intent(in) :: ng, model, innloop, outloop
1762 real(dp),
intent(in) :: jf, jdata, jmod, jopt, preducv, preducy
1763 real(dp),
intent(in) :: jb,
jobs, jact
1767 integer ::
nconv, status
1769 character (len=*),
parameter :: myfile = &
1770 & __FILE__//
", cg_write_rpcg_pio"
1783 & piofile =
dav(ng)%pioFile)
1789 & piofile =
dav(ng)%pioFile)
1794 IF (innloop.eq.
ninner)
THEN
1797 & (/outloop/), (/1/), &
1798 & piofile =
dav(ng)%pioFile)
1804 IF (innloop.eq.
ninner)
THEN
1808 & (/1,outloop/), (/
nconv,1/), &
1809 & piofile =
dav(ng)%pioFile)
1815 IF (innloop.gt.0)
THEN
1819 & piofile =
dav(ng)%pioFile)
1825 IF (innloop.gt.0)
THEN
1829 & piofile =
dav(ng)%pioFile)
1835 IF (innloop.gt.0)
THEN
1839 & piofile =
dav(ng)%pioFile)
1845 IF (innloop.eq.1)
THEN
1849 & piofile =
dav(ng)%pioFile)
1855 & piofile =
dav(ng)%pioFile)
1861 IF (innloop.gt.0)
THEN
1865 & piofile =
dav(ng)%pioFile)
1871 IF (innloop.gt.0)
THEN
1873 &
'cg_Greduc_y', preducy, &
1874 & (/innloop,outloop/), (/1,1/), &
1875 & piofile =
dav(ng)%pioFile)
1879 &
'cg_Greduc_v', preducv, &
1880 & (/innloop,outloop/), (/1,1/), &
1881 & piofile =
dav(ng)%pioFile)
1887 IF (innloop.gt.0)
THEN
1891 & piofile =
dav(ng)%pioFile)
1897 IF (innloop.gt.0)
THEN
1901 & piofile =
dav(ng)%pioFile)
1907 IF (innloop.gt.0)
THEN
1909 &
'cg_zv',
cg_zv(:,:,outloop), &
1911 & piofile =
dav(ng)%pioFile)
1917 IF (innloop.gt.0)
THEN
1920 & (/innloop+1,outloop/), (/1,1/), &
1921 & piofile =
dav(ng)%pioFile)
1928 & (/innloop+1,outloop/), (/1,1/), &
1929 & piofile =
dav(ng)%pioFile)
1936 & (/innloop+1,outloop/), (/1,1/), &
1937 & piofile =
dav(ng)%pioFile)
1944 & (/innloop+1,outloop/), (/1,1/), &
1945 & piofile =
dav(ng)%pioFile)
1952 & (/innloop+1,outloop/), (/1,1/), &
1953 & piofile =
dav(ng)%pioFile)
1960 & (/innloop+1,outloop/), (/1,1/), &
1961 & piofile =
dav(ng)%pioFile)
1968 & (/innloop+1,outloop/), (/1,1/), &
1969 & piofile =
dav(ng)%pioFile)
1975 IF (innloop.eq.1)
THEN
1977 &
'zgrad0',
zgrad0(:,outloop), &
1978 & (/1,outloop/), (/
ndatum(ng)+1,1/), &
1979 & piofile =
dav(ng)%pioFile)
1984 & (/1/), (/
ndatum(ng)+1/), &
1985 & piofile =
dav(ng)%pioFile)
1989 &
'Hbk', hbk(:,outloop), &
1990 & (/1,outloop/), (/
ndatum(ng),1/), &
1991 & piofile =
dav(ng)%pioFile)
1997 IF (innloop.gt.0)
THEN
1999 &
'zcglwk',
zcglwk(:,innloop,outloop), &
2000 & (/1,innloop,outloop/), &
2001 & (/
ndatum(ng)+1,1,1/), &
2002 & piofile =
dav(ng)%pioFile)
2006 &
'vcglwk',
vcglwk(:,innloop,outloop), &
2007 & (/1,innloop,outloop/), &
2008 & (/
ndatum(ng)+1,1,1/), &
2009 & piofile =
dav(ng)%pioFile)
2017 & tlmodval_s(:,innloop,outloop), &
2018 & (/1,innloop,outloop/), &
2020 & piofile =
dav(ng)%pioFile)