3#if (defined SENSITIVITY_4DVAR || \
4 defined tl_rbl4dvar || \
5 defined tl_r4dvar) && \
8 SUBROUTINE tl_congrad (ng, model, outLoop, innLoop, NinnLoop, &
21# if defined R4DVAR_ANA_SENSITIVITY || defined TL_R4DVAR
62# elif defined RBL4DVAR_ANA_SENSITIVITY || defined TL_RBL4DVAR
133 logical,
intent(in) :: Lcgini
134 integer,
intent(in) :: ng, model, outLoop, innLoop, NinnLoop
140 integer :: i, j, iobs, ivec, Lscale, info
142 real(r8) :: dla, zbet
145 real(r8) :: zsum, zck, zgk
146 real(r8) :: tl_zsum, tl_zck, tl_zgk
149 real(r8),
dimension(NinnLoop) :: zu, zgam
150 real(r8),
dimension(NinnLoop) :: tl_zu, tl_zrhs
151 real(r8),
dimension(Ndatum(ng)) :: pgrad, zt
152 real(r8),
dimension(Ndatum(ng)) :: tl_px, tl_pgrad, tl_zt
154 real(r8),
dimension(innLoop,innLoop) :: ztriT, zLT, zLTt
155 real(r8),
dimension(innLoop,innLoop) :: tl_ztriT, tl_zLT
156 real(r8),
dimension(innLoop,innLoop) :: tl_zLTt
157 real(r8),
dimension(innLoop) :: tau, zwork1, ze, zeref
158 real(r8),
dimension(innLoop) :: tl_tau, tl_zwork1, tl_ze, tl_zeref
179 master_thread :
IF (
master)
THEN
190 IF (innloop.eq.0)
THEN
192# if defined RBL4DVAR || defined TL_RBL4DVAR
203 IF ((outloop.eq.1).or.(.not.
lhotstart))
THEN
219# if defined RBL4DVAR || defined TL_RBL4DVAR
236 IF (
obserr(iobs).NE.0.0_r8)
THEN
239 tl_pgrad(iobs)=tl_pgrad(iobs)/sqrt(
obserr(iobs))
256 tl_cg_gnorm(outloop)=0.0_r8
266 tl_cg_gnorm(outloop)=tl_cg_gnorm(outloop)+ &
274 tl_cg_gnorm(outloop)=0.5_r8*tl_cg_gnorm(outloop)/ &
282 & tl_cg_gnorm(outloop)* &
283 &
zcglwk(iobs,1,outloop))/ &
303 IF (
obserr(iobs).NE.0.0_r8)
THEN
334# if defined RBL4DVAR || defined TL_RBL4DVAR
355 IF (
obserr(iobs).NE.0.0_r8)
THEN
375 tl_pgrad(iobs)=
obsscale(iobs)*tlmodval(iobs)
376 IF (
obserr(iobs).NE.0.0_r8)
THEN
379 tl_pgrad(iobs)=tl_pgrad(iobs)/sqrt(
obserr(iobs))
388 tl_pgrad(iobs)=tl_pgrad(iobs)+
obsscale(iobs)* &
405 tl_cg_gnorm(outloop)=0.0_r8
416 tl_cg_gnorm(outloop)=tl_cg_gnorm(outloop)+ &
425 tl_cg_gnorm(outloop)=0.5_r8*tl_cg_gnorm(outloop)/ &
433 & tl_cg_gnorm(outloop)* &
434 &
zcglwk(iobs,1,outloop))/ &
452 IF (
obserr(iobs).NE.0.0_r8)
THEN
482 pgrad(iobs)=
obsscale(iobs)*tlmodval_s(iobs,innloop,outloop)
484 tl_pgrad(iobs)=
obsscale(iobs)*tlmodval(iobs)
488 IF (
obserr(iobs).NE.0.0_r8)
THEN
489 pgrad(iobs)=pgrad(iobs)/sqrt(
obserr(iobs))
490 tl_pgrad(iobs)=tl_pgrad(iobs)/sqrt(
obserr(iobs))
495 zt(iobs)=
zcglwk(iobs,innloop,outloop)
508 pgrad(iobs)=pgrad(iobs)+
obsscale(iobs)*zt(iobs)
509 tl_pgrad(iobs)=tl_pgrad(iobs)+
obsscale(iobs)*tl_zt(iobs)
530 &
zcglwk(iobs,innloop,outloop)* &
546 pgrad(iobs)=pgrad(iobs)- &
548 &
zcglwk(iobs,innloop,outloop)
549 tl_pgrad(iobs)=tl_pgrad(iobs)- &
551 &
zcglwk(iobs,innloop,outloop)- &
555 IF (innloop.gt.1)
THEN
557 pgrad(iobs)=pgrad(iobs)- &
559 &
zcglwk(iobs,innloop-1,outloop)
560 tl_pgrad(iobs)=tl_pgrad(iobs)- &
562 &
zcglwk(iobs,innloop-1,outloop)- &
580 & tl_pgrad(iobs)*
zcglwk(iobs,ivec,outloop)+ &
584 pgrad(iobs)=pgrad(iobs)- &
586 &
zcglwk(iobs,ivec,outloop)
587 tl_pgrad(iobs)=tl_pgrad(iobs)- &
589 & tl_dla*
zcglwk(iobs,ivec,outloop)
601 & 2.0_r8*tl_pgrad(iobs)*pgrad(iobs)
612 tl_zcglwk(iobs,innloop+1)=(tl_pgrad(iobs)- &
614 &
zcglwk(iobs,innloop+1,outloop))/ &
629 &
zcglwk(iobs,innloop+1,outloop)* &
632 IF (innloop.eq.ninnloop)
THEN
649 ztrit(i,i+1)=
cg_beta(i+1,outloop)
653 ztrit(i,i-1)=
cg_beta(i,outloop)
659 CALL tl_sqlq(innloop, ztrit, tl_ztrit, tau, tl_tau, zwork1, &
671 tl_zlt(i,j)=tl_ztrit(i,j)
677 tl_zltt(i,j)=tl_zlt(j,i)
686 ze(i)=-
cg_qg(i,outloop)
698 tl_zeref(j)=tl_ztrit(i,j)
703 zsum=zsum+ze(j)*zeref(j)
704 tl_zsum=tl_zsum+tl_ze(j)*zeref(j)+ze(j)*tl_zeref(j)
707 ze(j)=ze(j)-tau(i)*zsum*zeref(j)
708 tl_ze(j)=tl_ze(j)-tl_tau(i)*zsum*zeref(j)- &
709 & tau(i)*tl_zsum*zeref(j)- &
710 & tau(i)*zsum*tl_zeref(j)
716 zgk=sqrt(zlt(innloop,innloop)*zlt(innloop,innloop)+ &
718 IF (zgk.GT.0.0_r8)
THEN
719 tl_zgk=(tl_zlt(innloop,innloop)*zlt(innloop,innloop)+ &
725 zck=zlt(innloop,innloop)/zgk
726 tl_zck=tl_zlt(innloop,innloop)/zgk-tl_zgk*zck/zgk
727 ze(innloop)=zck*ze(innloop)
728 tl_ze(innloop)=tl_zck*ze(innloop)+zck*tl_ze(innloop)
735 ze(j)=ze(j)/zltt(j,j)
737 ze(i)=ze(i)-ze(j)*zltt(i,j)
746 tl_zrhs(i)=tl_zrhs(i)+tl_zltt(i,j)*ze(j)
748 tl_ze(i)=tl_ze(i)-tl_zrhs(i)
754 tl_ze(j)=tl_ze(j)/zltt(j,j)
756 tl_ze(i)=tl_ze(i)-tl_ze(j)*zltt(i,j)
772 IF (ninnloop.eq.1)
THEN
775 tl_zu(1)=tl_zrhs(1)/
cg_delta(1,outloop)
781 zu(1)=-
cg_qg(1,outloop)/zbet
783 zgam(ivec)=
cg_beta(ivec,outloop)/zbet
785 &
cg_beta(ivec,outloop)*zgam(ivec)
789 DO ivec=innloop-1,1,-1
790 zu(ivec)=zu(ivec)-zgam(ivec+1)*zu(ivec+1)
804 tl_zrhs(innloop)=-
tl_cg_qg(innloop)- &
811 tl_zu(1)=tl_zrhs(1)/zbet
813 zgam(ivec)=
cg_beta(ivec,outloop)/zbet
815 &
cg_beta(ivec,outloop)*zgam(ivec)
816 tl_zu(ivec)=(tl_zrhs(ivec)-
cg_beta(ivec,outloop)* &
817 & tl_zu(ivec-1))/zbet
820 DO ivec=innloop-1,1,-1
823 tl_zu(ivec)=tl_zu(ivec)-zgam(ivec+1)*tl_zu(ivec+1)
842 tl_px(iobs)=tl_px(iobs)+ &
844 &
zcglwk(iobs,ivec,outloop)*tl_zu(ivec)
866 IF ((innloop.eq.ninnloop))
THEN
913 IF (
obserr(iobs).NE.0.0_r8)
THEN
931 CALL mp_bcastf (ng, model, tl_cg_gnorm(:))
real(dp), dimension(:), allocatable cg_gnorm_v
real(dp), dimension(:,:), allocatable cg_beta
real(r8), dimension(:), allocatable tl_obsval
integer, dimension(:), allocatable ndatum
real(r8), dimension(:,:), allocatable cg_dla
real(dp), dimension(:,:), allocatable cg_qg
real(r8), dimension(:), allocatable tl_cg_innov
real(dp), dimension(:), allocatable tl_cg_qg
real(r8), dimension(:), allocatable obsscale
real(r8), dimension(:), allocatable obserr
real(r8), dimension(:), allocatable tl_zgrad0
real(dp), dimension(:), allocatable tl_cg_delta
real(dp), dimension(:), allocatable cg_gnorm
real(r8), dimension(:,:), allocatable tl_zcglwk
real(dp), dimension(:), allocatable tl_cg_beta
real(r8), dimension(:), allocatable admodval
real(r8), dimension(:,:,:), allocatable zcglwk
real(r8), dimension(:), allocatable nlmodval
real(dp), dimension(:,:), allocatable cg_delta
real(r8), dimension(:), allocatable tl_cg_pxsave
real(r8), dimension(:,:), allocatable zgrad0
subroutine tl_sqlq(innloop, a, tl_a, tau, tl_tau, y, tl_y)