4 (defined sensitivity_4dvar || \
5 defined tl_rbl4dvar || \
8 SUBROUTINE ad_rpcg_lanczos (ng, model, outLoop, innLoop, &
21# if defined R4DVAR_ANA_SENSITIVITY || defined TL_R4DVAR
62# elif defined RBL4DVAR_ANA_SENSITIVITY || \
63 defined rbl4dvar_fct_sensitivity || \
138 logical,
intent(in) :: Lcgini
139 integer,
intent(in) :: ng, model, outLoop, innLoop, NinnLoop
143 logical :: Ltrans, Laug
144 integer :: i, ic, j, iobs, ivec, Lscale, info
146 real(r8) :: zbet, eps, preducv, preducy
147 real(r8) :: cff, fact, ad_dla, adfac
149 real(r8),
dimension(NinnLoop) :: zu, zgam, zfact, ad_zfact
150 real(r8),
dimension(NinnLoop) :: ad_zu, ad_zrhs
151 real(r8),
dimension(Ndatum(ng)+1) :: px, pgrad, pgrad_S
152 real(r8),
dimension(Ndatum(ng)+1) :: ad_px, ad_pgrad
153 real(r8),
dimension(Ninner,3) :: zwork, ad_zwork
155 character (len=13) :: string
175 master_thread :
IF (
master)
THEN
200# if defined ANL_EOFS || defined TRACE_EOFS
202 IF (innloop.eq.ninnloop)
THEN
226 ad_bckmodval(iobs)=0.0_r8
246 minimize :
IF (innloop.eq.0)
THEN
248# if defined RBL4DVAR || \
249 defined rbl4dvar_ana_sensitivity || \
250 defined rbl4dvar_fct_sensitivity || \
264 tlmodval(iobs)=0.0_r8
274 ad_pgrad(iobs)=ad_pgrad(iobs)+
ad_zgrad0(iobs)
304 ad_pgrad(
ndatum(ng)+1)=0.0_r8
311# if defined RBL4DVAR || \
312 defined rbl4dvar_ana_sensitivity || \
313 defined rbl4dvar_fct_sensitivity || \
331 ad_pgrad(iobs)=ad_pgrad(iobs)+
ad_vgrad0(iobs)
334 IF (
obserr(iobs).NE.0.0_r8)
THEN
342 & pgrad(iobs)/
obserr(iobs)
343 ad_pgrad(iobs)=ad_pgrad(iobs)/
obserr(iobs)
345# if defined RBL4DVAR || \
346 defined rbl4dvar_ana_sensitivity || \
347 defined rbl4dvar_fct_sensitivity || \
360 ad_bckmodval(iobs)=ad_bckmodval(iobs)- &
364 & (
obsval(iobs)-bckmodval(iobs))
365 ad_pgrad(iobs)=0.0_r8
389 & tlmodval_s(iobs,innloop,outloop))
390 ad_pgrad(iobs)=0.0_r8
396 IF (outloop.eq.1)
THEN
433# if defined RBL4DVAR_ANA_SENSITIVITY || \
434 defined rbl4dvar_fct_sensitivity
439 ad_bckmodval(iobs)=0.0_r8
455 IF (innloop.eq.ninnloop)
THEN
463 ad_px(iobs)=ad_px(iobs)+
fourdvar(ng)%ad_cg_pxsave(iobs)
464 fourdvar(ng)%ad_cg_pxsave(iobs)=0.0_r8
470 ad_px(iobs)=ad_px(iobs)+tlmodval(iobs)
471 tlmodval(iobs)=0.0_r8
481 tlmodval(iobs)=0.0_r8
493 ad_pgrad(iobs)=ad_pgrad(iobs)+
ad_vcglwk(iobs,innloop+1)
520 ad_pgrad(iobs)=ad_pgrad(iobs)+
ad_zcglwk(iobs,innloop+1)
530 IF (innloop.eq.1)
THEN
533 fact=1.0_r8/
cg_beta(innloop,outloop)
536 pgrad(iobs)=tlmodval_s(iobs,innloop,outloop)*fact+ &
537 & hbk(iobs,outloop)*
vcglwk(
ndatum(ng)+1,innloop,outloop)
540 IF (
obserr(iobs).NE.0.0_r8)
THEN
541 pgrad(iobs)=pgrad(iobs)/
obserr(iobs)
544 pgrad(
ndatum(ng)+1)=0.0_r8
546 pgrad(iobs)=pgrad(iobs)+
vcglwk(iobs,innloop,outloop)
550 IF (innloop.gt.1)
THEN
552 pgrad(iobs)=pgrad(iobs)-
cg_beta(innloop,outloop)* &
553 &
zcglwk(iobs,innloop-1,outloop)
557 pgrad(iobs)=pgrad(iobs)-
cg_delta(innloop,outloop)* &
558 &
zcglwk(iobs,innloop,outloop)
564 pgrad_s(iobs)=pgrad(iobs)
575 zfact(ivec)=1.0_r8/
cg_beta(ivec,outloop)
587 pgrad(iobs)=pgrad_s(iobs)
591 pgrad(iobs)=pgrad(iobs)- &
602 ad_dla=ad_dla-ad_pgrad(iobs)*
vcglwk(iobs,ivec,outloop)
604 &
cg_dla(ivec,outloop)*ad_pgrad(iobs)
617 & pgrad(
ndatum(ng)+1)*ad_dla
620 & pgrad(
ndatum(ng)+1)*ad_dla
648 ad_pgrad(iobs)=ad_pgrad(iobs)+ &
649 & tlmodval_s(iobs,ivec,outloop)* &
651 ad_tlmodval_s(iobs,ivec,outloop)= &
652 & ad_tlmodval_s(iobs,ivec,outloop)+ &
653 & pgrad(iobs)*zfact(ivec)*ad_dla
654 ad_zfact(ivec)=ad_zfact(ivec)+ &
656 & tlmodval_s(iobs,ivec,outloop)*ad_dla
657 ad_pgrad(iobs)=ad_pgrad(iobs)+ &
658 & hbk(iobs,outloop)* &
660 ad_hbk(iobs)=ad_hbk(iobs)+ &
665 & hbk(iobs,outloop)*ad_dla
666 ad_hbk(iobs)=ad_hbk(iobs)+ &
667 &
vcglwk(iobs,ivec,outloop)* &
668 & pgrad(
ndatum(ng)+1)*ad_dla
670 & hbk(iobs,outloop)* &
671 & pgrad(
ndatum(ng)+1)*ad_dla
673 & hbk(iobs,outloop)* &
674 &
vcglwk(iobs,ivec,outloop)*ad_dla
688 & ad_zfact(ivec)*zfact(ivec)/ &
690 ad_zfact(ivec)=0.0_r8
692 zfact(ivec)=1.0_r8/
cg_beta(ivec,outloop)
696 & ad_zfact(ivec)*zfact(ivec)/ &
698 ad_zfact(ivec)=0.0_r8
714 &
zcglwk(iobs,innloop,outloop)* &
727 IF (innloop.eq.1)
THEN
730 fact=1.0_r8/
cg_beta(innloop,outloop)
733 pgrad(iobs)=tlmodval_s(iobs,innloop,outloop)*fact+ &
734 & hbk(iobs,outloop)* &
738 IF (
obserr(iobs).NE.0.0_r8)
THEN
739 pgrad(iobs)=pgrad(iobs)/
obserr(iobs)
742 pgrad(
ndatum(ng)+1)=0.0_r8
744 pgrad(iobs)=pgrad(iobs)+
vcglwk(iobs,innloop,outloop)
748 IF (innloop.gt.1)
THEN
750 pgrad(iobs)=pgrad(iobs)- &
752 &
zcglwk(iobs,innloop-1,outloop)
781 IF (innloop.eq.1)
THEN
784 fact=1.0_r8/
cg_beta(innloop,outloop)
815 ad_pgrad(iobs)=ad_pgrad(iobs)+ &
816 & tlmodval_s(iobs,innloop,outloop)* &
819 ad_hbk(iobs)=ad_hbk(iobs)+ &
825 & hbk(iobs,outloop)* &
828 ad_pgrad(iobs)=ad_pgrad(iobs)+ &
829 & hbk(iobs,outloop)* &
832 ad_hbk(iobs)=ad_hbk(iobs)+ &
833 &
vcglwk(iobs,innloop,outloop)* &
837 & hbk(iobs,outloop)* &
841 & hbk(iobs,outloop)* &
842 &
vcglwk(iobs,innloop,outloop)* &
850 IF (innloop.gt.1)
THEN
864 &
zcglwk(iobs,innloop-1,outloop)* &
889 ad_pgrad(
ndatum(ng)+1)=0.0_r8
893 IF (innloop.eq.1)
THEN
896 fact=1.0_r8/
cg_beta(innloop,outloop)
899 pgrad(iobs)=tlmodval_s(iobs,innloop,outloop)*fact+ &
900 & hbk(iobs,outloop)* &
908 IF (
obserr(iobs).NE.0.0_r8)
THEN
909 pgrad(iobs)=pgrad(iobs)/
obserr(iobs)
917 & pgrad(iobs)*ad_pgrad(iobs)/
obserr(iobs)
918 ad_pgrad(iobs)=ad_pgrad(iobs)/
obserr(iobs)
922 IF (innloop.eq.1)
THEN
925 fact=1.0_r8/
cg_beta(innloop,outloop)
939 ad_hbk(iobs)=ad_hbk(iobs)+ &
944 & hbk(iobs,outloop)* &
946 ad_pgrad(iobs)=0.0_r8
955 IF (innloop.EQ.1)
THEN
969 & tlmodval_s(iobs,innloop,outloop)/ &
976 & ad_tlmodval_s(iobs,innloop,outloop)
977 ad_tlmodval_s(iobs,innloop,outloop)=0.0_r8
996 &
vcglwk(iobs,1,outloop)* &
1012 &
zcglwk(iobs,1,outloop)* &
1075 ad_hbk(iobs)=ad_hbk(iobs)+ &
1080 & hbk(iobs,outloop)* &
1084 & hbk(iobs,outloop)* &
1087 ad_hbk(iobs)=ad_hbk(iobs)+ &
1089 &
zgrad0(iobs,outloop)* &
1092 & hbk(iobs,outloop)* &
1093 &
zgrad0(iobs,outloop)* &
1096 & hbk(iobs,outloop)* &
1112 & tlmodval_s(iobs,innloop,outloop)* &
1121 IF (innloop.eq.ninnloop)
THEN
1136 zu(1)=
cg_qg(1,outloop)/zbet
1138 zgam(ivec)=
cg_beta(ivec,outloop)/zbet
1140 &
cg_beta(ivec,outloop)*zgam(ivec)
1144 zwork(innloop-1,3)=zu(innloop-1)
1146 DO ivec=innloop-2,1,-1
1147 zu(ivec)=zu(ivec)-zgam(ivec+1)*zu(ivec+1)
1148 zwork(ivec,3)=zu(ivec)
1162 ad_zwork(ivec,3)=ad_zwork(ivec,3)+ &
1163 &
zcglwk(iobs,ivec,outloop)* &
1171 IF (ninnloop.eq.1)
THEN
1172 print *,
'Illegal configuration!'
1173 print *,
'Ninner must be ge 2'
1176 IF (ninnloop.eq.2)
THEN
1180 ad_zu(1)=ad_zu(1)+ad_zwork(1,3)
1181 ad_zwork(1,3)=0.0_r8
1184 ad_zrhs(1)=ad_zrhs(1)+ad_zu(1)/
cg_delta(1,outloop)
1197 ad_zu(ivec)=ad_zu(ivec)+ad_zwork(ivec,3)
1198 ad_zwork(ivec,3)=0.0_r8
1202 ad_zu(ivec+1)=ad_zu(ivec+1)-zgam(ivec+1)*ad_zu(ivec)
1206 ad_zu(innloop-1)=ad_zu(innloop-1)+ad_zwork(innloop-1,3)
1207 ad_zwork(innloop-1,3)=0.0_r8
1211 DO ivec=innloop-1,2,-1
1213 &
cg_beta(ivec,outloop)*zgam(ivec)
1217 adfac=ad_zu(ivec)/zbet
1218 ad_zu(ivec-1)=ad_zu(ivec-1)- &
1220 ad_zrhs(ivec)=ad_zrhs(ivec)+adfac
1226 ad_zrhs(1)=ad_zrhs(1)+ad_zu(1)/zbet
1234 & ad_zrhs(innloop-1)
1237 & ad_zrhs(innloop-1)
1240 & ad_zrhs(innloop-1)
1241 ad_zrhs(innloop-1)=0.0_r8
1251 & zu(ivec-1)*ad_zrhs(ivec)
1253 & zu(ivec)*ad_zrhs(ivec)
1255 & zu(ivec+1)*ad_zrhs(ivec)
1256 ad_zrhs(ivec)=0.0_r8
1315 ad_hbk(iobs)=ad_hbk(iobs)+ &
1321 & hbk(iobs,outloop)* &
1325 & hbk(iobs,outloop)* &
1328 ad_hbk(iobs)=ad_hbk(iobs)+ &
1329 &
vcglwk(iobs,innloop,outloop)* &
1333 & hbk(iobs,outloop)* &
1337 & hbk(iobs,outloop)* &
1338 &
vcglwk(iobs,innloop,outloop)* &
1354 & tlmodval_s(iobs,innloop,outloop)* &
1375 & tlmodval_s(iobs,innloop,outloop)* &
1377 & (
cg_beta(innloop,outloop)* &
1383 & ad_tlmodval_s(iobs,innloop,outloop)
1384 ad_tlmodval_s(iobs,innloop,outloop)=0.0_r8
1396 &
vcglwk(iobs,innloop,outloop)* &
1407 &
zcglwk(iobs,innloop,outloop)* &
1410 ad_pgrad(iobs)=ad_pgrad(iobs)+ &
1419 pgrad(iobs)=
zcglwk(iobs,innloop,outloop)* &
1474 ad_hbk(iobs)=ad_hbk(iobs)+ &
1480 & hbk(iobs,outloop)* &
1483 ad_pgrad(iobs)=ad_pgrad(iobs)+ &
1484 & hbk(iobs,outloop)* &
1487 ad_hbk(iobs)=ad_hbk(iobs)+ &
1489 &
vcglwk(iobs,innloop,outloop)* &
1492 & hbk(iobs,outloop)* &
1493 &
vcglwk(iobs,innloop,outloop)* &
1496 & hbk(iobs,outloop)* &
1509 ad_pgrad(iobs)=ad_pgrad(iobs)+ &
1510 & tlmodval_s(iobs,innloop,outloop)* &
1527 ad_pgrad(iobs)=0.0_r8
1534 IF (innloop.gt.0)
THEN
1542 & tlmodval_s(iobs,innloop,outloop)* &
1548 END IF master_thread
1566# if defined RBL4DVAR || \
1568 defined sensitivity_4dvar
1583 END SUBROUTINE ad_rpcg_lanczos
1586 SUBROUTINE ad_rpcg_lanczos
1588 END SUBROUTINE ad_rpcg_lanczos
real(dp), dimension(:), allocatable cg_gnorm_v
real(r8), dimension(:,:,:), allocatable vcglwk
real(r8), dimension(:), allocatable ad_obserr
type(t_fourdvar), dimension(:), allocatable fourdvar
real(dp), dimension(:,:), allocatable cg_beta
real(r8), dimension(:), allocatable ad_obsscale
real(r8), dimension(:,:), allocatable ad_zcglwk
integer, dimension(:), allocatable ndatum
real(r8), dimension(:,:), allocatable cg_dla
real(dp), dimension(:,:), allocatable cg_qg
real(r8), dimension(:), allocatable ad_vgrad0
real(r8), dimension(:), allocatable obsval
real(r8), dimension(:,:), allocatable ad_obsval
real(dp), dimension(:), allocatable ad_cg_gnorm_v
real(r8), dimension(:), allocatable ad_zgrad0
real(r8), dimension(:), allocatable ad_jb0
real(r8), dimension(:), allocatable obsscale
real(r8), dimension(:), allocatable obserr
real(r8), dimension(:), allocatable jb0
real(dp), dimension(:), allocatable ad_cg_gnorm
real(r8), dimension(:), allocatable ad_vgrad0s
real(r8), dimension(:), allocatable admodval
real(dp), dimension(:), allocatable ad_cg_qg
real(r8), dimension(:,:,:), allocatable zcglwk
real(r8), dimension(:), allocatable vgrad0
real(r8), dimension(:), allocatable nlmodval
real(dp), dimension(:,:), allocatable cg_delta
real(dp), dimension(:), allocatable ad_cg_beta
real(dp), dimension(:), allocatable ad_cg_delta
real(r8), dimension(:,:), allocatable ad_vcglwk
real(r8), dimension(:,:), allocatable zgrad0