3#if defined SENSITIVITY_4DVAR && !defined RPCG
4 SUBROUTINE ad_congrad (ng, model, outLoop, innLoop, NinnLoop, &
17# if defined TL_R4DVAR || defined R4DVAR_ANA_SENSITIVITY
58# elif defined TL_RBL4DVAR || defined RBL4DVAR_ANA_SENSITIVITY
129 integer,
intent(in) :: ng, model, outLoop, innLoop, NinnLoop
130 logical,
intent(in) :: Lcgini
136 integer :: i, j, iobs, ivec, Lscale, info
138 real(r8) :: dla, zbet
139 real(r8) :: adfac, ad_dla
142 real(r8) :: zsum, zck, zgk
143 real(r8) :: ad_zsum, ad_zck, ad_zgk
146 real(r8),
dimension(NinnLoop) :: zu, zgam
147 real(r8),
dimension(NinnLoop) :: ad_zu, ad_zrhs
148 real(r8),
dimension(Ndatum(ng)) :: pgrad, zt, pgrad_S
149 real(r8),
dimension(Ndatum(ng)) :: ad_px, ad_pgrad, ad_zt
151 real(r8),
dimension(innLoop,innLoop) :: ztriT, zLT, zLTt
152 real(r8),
dimension(innLoop,innLoop) :: ztriTs
153 real(r8),
dimension(innLoop,innLoop) :: ad_ztriT, ad_zLT
154 real(r8),
dimension(innLoop,innLoop) :: ad_zLTt
155 real(r8),
dimension(innLoop) :: tau, zwork1, ze, zeref, zes
156 real(r8),
dimension(innLoop) :: ad_tau, ad_zwork1, ad_ze, ad_zeref
171 master_thread :
IF (
master)
THEN
204 IF (innloop.eq.0)
THEN
215 IF ((outloop.eq.1).or.(.not.
lhotstart))
THEN
234 IF (
obserr(iobs).NE.0.0_r8)
THEN
238 tlmodval(iobs)=tlmodval(iobs)/sqrt(
obserr(iobs))
257 tlmodval(iobs)=0.0_r8
266 &
zcglwk(iobs,1,outloop)*adfac
286 ad_pgrad(iobs)=ad_pgrad(iobs)+
ad_zgrad0(iobs)
306 IF (
obserr(iobs).NE.0.0_r8)
THEN
309 ad_pgrad(iobs)=ad_pgrad(iobs)/sqrt(
obserr(iobs))
316 ad_pgrad(iobs)=0.0_r8
327 ad_pgrad(iobs)=0.0_r8
331# ifdef RBL4DVAR_ANA_SENSITIVITY
347 IF (
obserr(iobs).NE.0.0_r8)
THEN
354 tlmodval(iobs)=tlmodval(iobs)/sqrt(
obserr(iobs))
385 tlmodval(iobs)=0.0_r8
405 IF (
obserr(iobs).NE.0.0_r8)
THEN
409 tlmodval(iobs)=tlmodval(iobs)/sqrt(
obserr(iobs))
428 tlmodval(iobs)=0.0_r8
436 &
zcglwk(iobs,1,outloop)*adfac
437 ad_pgrad(iobs)=ad_pgrad(iobs)+adfac
452 & 2.0_r8*
zgrad0(iobs,outloop)* &
456 ad_pgrad(iobs)=ad_pgrad(iobs)+
ad_zgrad0(iobs)
486 IF (
obserr(iobs).NE.0.0_r8)
THEN
489 ad_pgrad(iobs)=ad_pgrad(iobs)/sqrt(
obserr(iobs))
497 ad_pgrad(iobs)=0.0_r8
507 IF (
obserr(iobs).NE.0.0_r8)
THEN
511 tlmodval(iobs)=tlmodval(iobs)/sqrt(
obserr(iobs))
515 IF (innloop.eq.ninnloop)
THEN
540 ad_px(iobs)=ad_px(iobs)+tlmodval(iobs)
542 tlmodval(iobs)=0.0_r8
563 tlmodval(iobs)=0.0_r8
572 IF (innloop.eq.ninnloop)
THEN
585 ztrit(i,i+1)=
cg_beta(i+1,outloop)
588 ztrit(i,i-1)=
cg_beta(i,outloop)
595 ztrits(i,j)=ztrit(i,j)
599 CALL sqlq(innloop, ztrit, tau, zwork1)
620 ze(i)=-
cg_qg(i,outloop)
632 zsum=zsum+ze(j)*zeref(j)
635 ze(j)=ze(j)-tau(i)*zsum*zeref(j)
647 zgk=sqrt(zlt(innloop,innloop)*zlt(innloop,innloop)+ &
649 zck=zlt(innloop,innloop)/zgk
650 ze(innloop)=zck*ze(innloop)
655 ze(j)=ze(j)/zltt(j,j)
657 ze(i)=ze(i)-ze(j)*zltt(i,j)
671 zu(1)=-
cg_qg(1,outloop)/zbet
673 zgam(ivec)=
cg_beta(ivec,outloop)/zbet
675 &
cg_beta(ivec,outloop)*zgam(ivec)
679 DO ivec=innloop-1,1,-1
680 zu(ivec)=zu(ivec)-zgam(ivec+1)*zu(ivec+1)
689 ad_zu(ivec)=ad_zu(ivec)+ &
690 &
zcglwk(iobs,ivec,outloop)*ad_px(iobs)
692 & zu(ivec)*ad_px(iobs)
703 ad_ze(i)=ad_ze(i)+ad_zu(i)
713 ad_ze(j)=ad_ze(j)-ad_ze(i)*zltt(i,j)
717 ad_ze(j)=ad_ze(j)/zltt(j,j)
723 ad_zrhs(i)=ad_zrhs(i)-ad_ze(i)
727 ad_zltt(i,j)=ad_zltt(i,j)+ze(j)*ad_zrhs(i)
738 ad_zck=ad_zck+zes(innloop)*ad_ze(innloop)
739 ad_ze(innloop)=zck*ad_ze(innloop)
743 ad_zlt(innloop,innloop)=ad_zlt(innloop,innloop)+adfac
744 ad_zgk=ad_zgk-zck*adfac
746 IF (zgk.GT.0.0_r8)
THEN
752 ad_zlt(innloop,innloop)=ad_zlt(innloop,innloop)+ &
753 & zlt(innloop,innloop)*adfac
755 &
cg_beta(innloop+1,outloop)*adfac
771 ze(j)=-
cg_qg(j,outloop)
783 zsum=zsum+ze(j)*zeref(j)
792 ze(j)=ze(j)-tau(ii)*zsum*zeref(j)
801 ad_tau(i)=ad_tau(i)-zsum*zeref(j)*ad_ze(j)
802 ad_zsum=ad_zsum-tau(i)*zeref(j)*ad_ze(j)
803 ad_zeref(j)=ad_zeref(j)-tau(i)*zsum*ad_ze(j)
808 ad_ze(j)=ad_ze(j)+zeref(j)*ad_zsum
809 ad_zeref(j)=ad_zeref(j)+zes(j)*ad_zsum
816 ad_ztrit(i,j)=ad_ztrit(i,j)+ad_zeref(j)
839 ad_zlt(j,i)=ad_zlt(j,i)+ad_zltt(i,j)
847 ad_ztrit(i,j)=ad_ztrit(i,j)+ad_zlt(i,j)
862 ztrit(i,j)=ztrits(i,j)
866 CALL ad_sqlq (innloop, ztrit, ad_ztrit, tau, ad_tau, &
873 ad_ztrit(i,i-1)=0.0_r8
879 ad_ztrit(i,i+1)=0.0_r8
891 IF (ninnloop.eq.1)
THEN
895 ad_zrhs(1)=ad_zrhs(1)+ad_zu(1)/
cg_delta(1,outloop)
908 ad_zu(ivec+1)=ad_zu(ivec+1)-zgam(ivec+1)*ad_zu(ivec)
914 &
cg_beta(ivec,outloop)*zgam(ivec)
918 adfac=ad_zu(ivec)/zbet
919 ad_zu(ivec-1)=ad_zu(ivec-1)- &
921 ad_zrhs(ivec)=ad_zrhs(ivec)+adfac
927 ad_zrhs(1)=ad_zrhs(1)+ad_zu(1)/zbet
935 & zu(innloop-1)*ad_zrhs(innloop)
937 & zu(innloop)*ad_zrhs(innloop)
938 ad_zrhs(innloop)=0.0_r8
948 & zu(ivec-1)*ad_zrhs(ivec)
950 & zu(ivec)*ad_zrhs(ivec)
952 & zu(ivec+1)*ad_zrhs(ivec)
975 &
zcglwk(iobs,innloop+1,outloop)* &
992 &
zcglwk(iobs,innloop+1,outloop)*adfac
993 ad_pgrad(iobs)=ad_pgrad(iobs)+adfac
1005 pgrad(iobs)=
obsscale(iobs)*tlmodval_s(iobs,innloop,outloop)
1009 IF (
obserr(iobs).NE.0.0_r8)
THEN
1010 pgrad(iobs)=pgrad(iobs)/sqrt(
obserr(iobs))
1014 zt(iobs)=
zcglwk(iobs,innloop,outloop)
1026 pgrad(iobs)=pgrad(iobs)+
obsscale(iobs)*zt(iobs)
1041 pgrad(iobs)=pgrad(iobs)- &
1043 &
zcglwk(iobs,innloop,outloop)
1045 IF (innloop.gt.1)
THEN
1047 pgrad(iobs)=pgrad(iobs)- &
1049 &
zcglwk(iobs,innloop-1,outloop)
1055 DO ivec=innloop,1,-1
1057 pgrad(iobs)=pgrad(iobs)- &
1058 &
cg_dla(ivec,outloop)* &
1059 &
zcglwk(iobs,ivec,outloop)
1067 ad_pgrad(iobs)=ad_pgrad(iobs)+ &
1077 pgrad(iobs)=
obsscale(iobs)*tlmodval_s(iobs,innloop,outloop)
1081 IF (
obserr(iobs).NE.0.0_r8)
THEN
1082 pgrad(iobs)=pgrad(iobs)/sqrt(
obserr(iobs))
1086 zt(iobs)=
zcglwk(iobs,innloop,outloop)
1098 pgrad(iobs)=pgrad(iobs)+
obsscale(iobs)*zt(iobs)
1113 pgrad(iobs)=pgrad(iobs)- &
1115 &
zcglwk(iobs,innloop,outloop)
1117 IF (innloop.gt.1)
THEN
1119 pgrad(iobs)=pgrad(iobs)- &
1121 &
zcglwk(iobs,innloop-1,outloop)
1128 pgrad_s(iobs)=pgrad(iobs)
1138 pgrad(iobs)=pgrad_s(iobs)
1142 pgrad(iobs)=pgrad(iobs)- &
1155 &
cg_dla(ivec,outloop)*ad_pgrad(iobs)
1156 ad_dla=ad_dla-
zcglwk(iobs,ivec,outloop)*ad_pgrad(iobs)
1164 & pgrad(iobs)*ad_dla
1165 ad_pgrad(iobs)=ad_pgrad(iobs)+ &
1166 &
zcglwk(iobs,ivec,outloop)*ad_dla
1173 IF (innloop.gt.1)
THEN
1185 &
zcglwk(iobs,innloop-1,outloop)* &
1200 &
zcglwk(iobs,innloop,outloop)* &
1207 pgrad(iobs)=
obsscale(iobs)*tlmodval_s(iobs,innloop,outloop)
1211 IF (
obserr(iobs).NE.0.0_r8)
THEN
1212 pgrad(iobs)=pgrad(iobs)/sqrt(
obserr(iobs))
1216 zt(iobs)=
zcglwk(iobs,innloop,outloop)
1228 pgrad(iobs)=pgrad(iobs)+
obsscale(iobs)*zt(iobs)
1245 ad_pgrad(iobs)=ad_pgrad(iobs)+ &
1246 &
zcglwk(iobs,innloop,outloop)* &
1266 ad_zt(iobs)=ad_zt(iobs)+
obsscale(iobs)*ad_pgrad(iobs)
1284 IF (
obserr(iobs).NE.0.0_r8)
THEN
1287 ad_pgrad(iobs)=ad_pgrad(iobs)/sqrt(
obserr(iobs))
1294 ad_pgrad(iobs)=0.0_r8
1298 END IF master_thread
subroutine ad_sqlq(innloop, a, ad_a, tau, ad_tau, y, ad_y)
real(dp), dimension(:), allocatable cg_gnorm_v
real(dp), dimension(:,:), allocatable cg_beta
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_obsval
real(r8), dimension(:), allocatable ad_zgrad0
real(r8), dimension(:), allocatable obsscale
real(r8), dimension(:), allocatable obserr
real(dp), dimension(:), allocatable cg_gnorm
real(dp), dimension(:), allocatable ad_cg_gnorm
real(r8), dimension(:), allocatable ad_cg_pxsave
real(r8), dimension(:), allocatable admodval
real(dp), dimension(:), allocatable ad_cg_qg
real(r8), dimension(:,:,:), allocatable zcglwk
real(r8), dimension(:), allocatable nlmodval
real(r8), dimension(:), allocatable ad_cg_innov
real(dp), dimension(:,:), allocatable cg_delta
real(dp), dimension(:), allocatable ad_cg_beta
real(dp), dimension(:), allocatable ad_cg_delta
real(r8), dimension(:,:), allocatable zgrad0