20# if defined R4DVAR_ANA_SENSITIVITY || defined TL_R4DVAR
61# elif defined RBL4DVAR_ANA_SENSITIVITY || \
62 defined rbl4dvar_fct_sensitivity || \
137 logical,
intent(in) :: Lcgini
138 integer,
intent(in) :: ng, model, outLoop, innLoop, NinnLoop
142 logical :: Ltrans, Laug
143 integer :: i, ic, j, iobs, ivec, Lscale, info
145 real(r8) :: zbet, eps, preducv, preducy
146 real(r8) :: Jopt, Jf, Jmod, Jdata, Jb, Jobs, Jact, cff
147 real(r8) :: tl_dla, fact
149 real(r8),
dimension(NinnLoop) :: zu, zgam, zfact, tl_zfact
150 real(r8),
dimension(NinnLoop) :: tl_zu, tl_zrhs
151 real(r8),
dimension(Ndatum(ng)+1) :: px, pgrad
152 real(r8),
dimension(Ndatum(ng)+1) :: tl_px, tl_pgrad
153 real(r8),
dimension(Ninner,3) :: zwork, tl_zwork
155 character (len=13) :: string
175 master_thread :
IF (
master)
THEN
186 IF (innloop.gt.0)
THEN
193 & tlmodval_s(iobs,innloop,outloop)
201 minimize :
IF (innloop.eq.0)
THEN
203# if defined RBL4DVAR_ANA_SENSITIVITY || \
204 defined rbl4dvar_fct_sensitivity || \
205 defined tl_rbl4dvar || \
210 tl_bckmodval(iobs)=0.0_r8
222 IF (outloop.eq.1)
THEN
242 tl_hbk(iobs)=-tlmodval(iobs)
268# if defined RBL4DVAR || \
269 defined rbl4dvar_ana_sensitivity || \
270 defined rbl4dvar_fct_sensitivity || \
277 & tl_bckmodval(iobs))+ &
279 & (
obsval(iobs)-bckmodval(iobs))
296 & tlmodval_s(iobs,innloop,outloop))
298 IF (
obserr(iobs).NE.0.0_r8)
THEN
302 tl_pgrad(iobs)=tl_pgrad(iobs)/
obserr(iobs)- &
317 pgrad(
ndatum(ng)+1)=1.0_r8
318 tl_pgrad(
ndatum(ng)+1)=0.0_r8
374 IF (innloop.EQ.1)
THEN
385 & tlmodval_s(iobs,innloop,outloop)* &
406 & hbk(iobs,outloop)* &
409 & hbk(iobs,outloop)* &
415 & hbk(iobs,outloop)* &
418 & hbk(iobs,outloop)* &
464 &
zcglwk(iobs,1,outloop)/ &
475 &
vcglwk(iobs,1,outloop)/ &
487 tl_tlmodval_s(iobs,innloop,outloop)=tlmodval(iobs)
491 tlmodval(iobs)=tlmodval(iobs)/ &
494 & tlmodval_s(iobs,innloop,outloop)/ &
513 pgrad(iobs)=
zcglwk(iobs,innloop,outloop)* &
530 & tlmodval_s(iobs,innloop,outloop)+ &
551 & hbk(iobs,outloop)* &
554 & hbk(iobs,outloop)* &
559 &
vcglwk(iobs,innloop,outloop)+ &
560 & hbk(iobs,outloop)* &
561 & tl_pgrad(
ndatum(ng)+1)* &
562 &
vcglwk(iobs,innloop,outloop)+ &
563 & hbk(iobs,outloop)* &
578 & tl_pgrad(
ndatum(ng)+1)* &
600 tl_zcglwk(iobs,innloop)=tl_pgrad(iobs)/ &
603 &
zcglwk(iobs,innloop,outloop)/ &
615 &
vcglwk(iobs,innloop,outloop)/ &
626 tl_tlmodval_s(iobs,innloop,outloop)=tlmodval(iobs)
629 tlmodval(iobs)=tlmodval(iobs)/
cg_beta(innloop,outloop)- &
631 & tlmodval_s(iobs,innloop,outloop)/ &
649 & tlmodval_s(iobs,innloop,outloop)* &
670 & hbk(iobs,outloop)* &
673 & hbk(iobs,outloop)* &
677 &
vcglwk(iobs,innloop,outloop)* &
679 & hbk(iobs,outloop)* &
682 & hbk(iobs,outloop)* &
683 &
vcglwk(iobs,innloop,outloop)* &
706 IF (innloop.eq.ninnloop)
THEN
712 IF (ninnloop.eq.1)
THEN
713 print *,
'Illegal configuration!'
714 print *,
'Ninner must be ge 2'
717 IF (ninnloop.eq.2)
THEN
720 tl_zu(1)=tl_zrhs(1)/
cg_delta(1,outloop)
722 tl_zwork(1,3)=tl_zu(1)
728 zu(1)=
cg_qg(1,outloop)/zbet
730 zgam(ivec)=
cg_beta(ivec,outloop)/zbet
732 &
cg_beta(ivec,outloop)*zgam(ivec)
733 zu(ivec)=(
cg_qg(ivec,outloop)- &
737 zwork(innloop-1,3)=zu(innloop-1)
739 DO ivec=innloop-2,1,-1
740 zu(ivec)=zu(ivec)-zgam(ivec+1)*zu(ivec+1)
741 zwork(ivec,3)=zu(ivec)
755 tl_zrhs(innloop-1)=
tl_cg_qg(innloop-1)- &
762 tl_zu(1)=tl_zrhs(1)/zbet
764 zgam(ivec)=
cg_beta(ivec,outloop)/zbet
766 &
cg_beta(ivec,outloop)*zgam(ivec)
767 tl_zu(ivec)=(tl_zrhs(ivec)- &
769 & tl_zu(ivec-1))/zbet
771 tl_zwork(innloop-1,3)=tl_zu(innloop-1)
773 DO ivec=innloop-2,1,-1
776 tl_zu(ivec)=tl_zu(ivec)-zgam(ivec+1)*tl_zu(ivec+1)
777 tl_zwork(ivec,3)=tl_zu(ivec)
788 &
zcglwk(iobs,ivec,outloop)*zwork(ivec,3)
789 tl_px(iobs)=tl_px(iobs)+ &
792 &
zcglwk(iobs,ivec,outloop)* &
818 IF (innloop.eq.1)
THEN
821 fact=1.0_r8/
cg_beta(innloop,outloop)
832 pgrad(iobs)=tlmodval_s(iobs,innloop,outloop)* &
834 & hbk(iobs,outloop)* &
836 tl_pgrad(iobs)=tlmodval(iobs)+ &
839 & hbk(iobs,outloop)* &
847 IF (
obserr(iobs).ne.0.0_r8)
THEN
851 pgrad(iobs)=pgrad(iobs)/
obserr(iobs)
852 tl_pgrad(iobs)=tl_pgrad(iobs)/
obserr(iobs)- &
856 pgrad(
ndatum(ng)+1)=0.0_r8
857 tl_pgrad(
ndatum(ng)+1)=0.0_r8
862 pgrad(iobs)=pgrad(iobs)+ &
863 &
vcglwk(iobs,innloop,outloop)
864 tl_pgrad(iobs)=tl_pgrad(iobs)+ &
872 IF (innloop.gt.1)
THEN
879 pgrad(iobs)=pgrad(iobs)- &
881 &
zcglwk(iobs,innloop-1,outloop)
882 tl_pgrad(iobs)=tl_pgrad(iobs)- &
884 &
zcglwk(iobs,innloop-1,outloop)- &
898 IF (innloop.eq.1)
THEN
901 fact=1.0_r8/
cg_beta(innloop,outloop)
919 & tlmodval_s(iobs,innloop,outloop)* &
925 & hbk(iobs,outloop)* &
928 & hbk(iobs,outloop)* &
932 &
vcglwk(iobs,innloop,outloop)* &
934 & hbk(iobs,outloop)* &
937 & hbk(iobs,outloop)* &
938 &
vcglwk(iobs,innloop,outloop)* &
963 pgrad(iobs)=pgrad(iobs)- &
965 &
zcglwk(iobs,innloop,outloop)
966 tl_pgrad(iobs)=tl_pgrad(iobs)- &
968 &
zcglwk(iobs,innloop,outloop)- &
984 zfact(ivec)=1.0_r8/
cg_beta(ivec,outloop)
1013 & tlmodval_s(iobs,ivec,outloop)* &
1016 & tl_tlmodval_s(iobs,ivec,outloop)* &
1019 & tlmodval_s(iobs,ivec,outloop)* &
1022 & hbk(iobs,outloop)* &
1028 & hbk(iobs,outloop)* &
1031 &
vcglwk(iobs,ivec,outloop)* &
1033 & hbk(iobs,outloop)* &
1036 & hbk(iobs,outloop)* &
1037 &
vcglwk(iobs,ivec,outloop)* &
1056 pgrad(iobs)=pgrad(iobs)- &
1057 &
cg_dla(ivec,outloop)* &
1058 &
vcglwk(iobs,ivec,outloop)
1059 tl_pgrad(iobs)=tl_pgrad(iobs)-tl_dla* &
1060 &
vcglwk(iobs,ivec,outloop)- &
1061 &
cg_dla(ivec,outloop)* &
1077 tl_zcglwk(iobs,innloop+1)=tl_pgrad(iobs)
1098 tl_vcglwk(iobs,innloop+1)=tl_pgrad(iobs)
1105 IF (innloop.eq.ninnloop)
THEN
1121 fourdvar(ng)%tl_cg_pxsave(iobs)=tl_px(iobs)
1140 END IF master_thread
1153# if defined RBL4DVAR || defined R4DVAR || \
1154 defined sensitivity_4dvar || defined tl_rbl4dvar || \