494
495
496
497
498
499
500
501
502
503
504 real(dp), intent(inout) :: RunInterval
505
506
507
508 logical :: Lcgini, Linner, Lposterior, add
509
510 integer :: my_inner, my_outer
511 integer :: Lbck, Lini, Rec1, Rec2, ImpOrd
512 integer :: i, lstr, ng, status, tile
513 integer :: Fcount, NRMrec
514
515 integer, dimension(Ngrids) :: indxSave
516 integer, dimension(Ngrids) :: Nrec
517
518 real(r8) :: str_day, end_day, dstartS, rtime
519
520 character (len=1) :: charA, charB
521#ifdef OBS_SPACE
522 character (len=1) :: charC
523#endif
524 character (len=25) :: driver
525 character (len=20) :: string
526
527 character (len=*), parameter :: MyFile = &
528 & __FILE__//", ROMS_run"
529
530
531
532
533
534
535
536 DO ng=1,ngrids
537#if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
538 lfinp(ng)=1
539 lfout(ng)=1
540#endif
541#ifdef ADJUST_BOUNDARY
542 lbinp(ng)=1
543 lbout(ng)=1
544#endif
545 lold(ng)=1
546 lnew(ng)=2
547 END DO
548 lini=1
549 lbck=2
550 rec1=1
551 rec2=2
552 nrun=1
553 outer=0
554 inner=0
555 erstr=1
556 erend=nouter
557 driver='obs_sen_rbl4dvar_forecast'
558 chara='A'
559 charb='B'
560#ifdef OBS_SPACE
561 charc='C'
562#endif
563
564
565
566
567
568
569
570
571
572
573 impord=3
574
575
576
577
578
579
580
581
582
583
584 dstarts=dstart
585 rtime=0.0_r8
586 DO ng=1,ngrids
587 rtime=max(rtime, dt(ng)*ntimes_ana(ng))
588 END DO
589 dstart=dstart+rtime*sec2day
590
591 rtime=0.0_r8
592 DO ng=1,ngrids
593 rtime=max(rtime, dt(ng)*ntimes_fct(ng))
594 ntimes(ng)=ntimes_fct(ng)
595 END DO
596 runinterval=rtime
597
598
599
600
601
602
603
604 DO ng=1,ngrids
605 wrtforce(ng)=.false.
606 END DO
607
608
609
610 DO ng=1,ngrids
611 lreadfwd(ng)=.false.
612 lreadblk(ng)=.false.
613 wrtnlmod(ng)=.true.
614 wrtrpmod(ng)=.false.
615 wrttlmod(ng)=.false.
616 lsen4dvar(ng)=.false.
617#ifdef OBS_SPACE
618 lobspace(ng)=.false.
619# ifndef OBS_IMPACT
620 ladjvar(ng)=.false.
621# endif
622#endif
623 END DO
624
626 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
627
628
629
630
631
632
633 DO ng=1,ngrids
634 ini(ng)%Rindex=1
635 fcount=ini(ng)%load
636 ini(ng)%Nrec(fcount)=1
637#ifdef DISTRIBUTE
638 CALL wrt_ini (ng, myrank, 1)
639#else
640 CALL wrt_ini (ng, -1, 1)
641#endif
642 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
643 END DO
644
645
646
647
648
649
650
651
652
653
654
656 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
657
658
659
660
661
662
663
664
665
666
667 DO ng=1,ngrids
668 IF (any(lwrtnrm(:,ng))) THEN
669 CALL def_norm (ng, inlm, 1)
670 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
671
672 IF (nsa.eq.2) THEN
673 CALL def_norm (ng, inlm, 2)
674 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
675 END IF
676
677#ifdef ADJUST_BOUNDARY
678 CALL def_norm (ng, inlm, 3)
679 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
680#endif
681
682#if defined ADJUST_WSTRESS || defined ADJUST_STFLUX
683 CALL def_norm (ng, inlm, 4)
684 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
685#endif
686
687 DO tile=first_tile(ng),last_tile(ng),+1
688 CALL normalization (ng, tile, 2)
689 END DO
690
691 ldefnrm(1:4,ng)=.false.
692 lwrtnrm(1:4,ng)=.false.
693 ELSE
694 nrmrec=1
695 CALL get_state (ng, 14, 14, nrm(1,ng), nrmrec, 1)
696 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
697
698 IF (nsa.eq.2) THEN
699 CALL get_state (ng, 15, 15, nrm(2,ng), nrmrec, 2)
700 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
701 END IF
702
703#ifdef ADJUST_BOUNDARY
704 CALL get_state (ng, 16, 16, nrm(3,ng), nrmrec, 1)
705 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
706#endif
707
708#if defined ADJUST_WSTRESS || defined ADJUST_STFLUX
709 CALL get_state (ng, 17, 17, nrm(4,ng), nrmrec, 1)
710 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
711#endif
712 END IF
713 END DO
714
715#if defined BALANCE_OPERATOR && defined ZETA_ELLIPTIC
716
717
718
719
720 IF (balance(isfsur)) THEN
721 DO ng=1,ngrids
722 CALL get_state (ng, inlm, 2, ini(ng), lini, lini)
723 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
724
725 DO tile=first_tile(ng),last_tile(ng),+1
726 CALL balance_ref (ng, tile, lini)
727 CALL biconj (ng, tile, inlm, lini)
728 END DO
729 wrtzetaref(ng)=.true.
730 END DO
731 END IF
732#endif
733
734
735
736 DO ng=1,ngrids
737 ldefitl(ng)=.true.
738 CALL tl_def_ini (ng)
739 ldefitl(ng)=.false.
740 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
741 END DO
742
743
744
745 DO ng=1,ngrids
746 ldeftlf(ng)=.true.
747 CALL def_impulse (ng)
748 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
749 END DO
750
751#ifndef OBS_SPACE
752
753
754
755
756 DO ng=1,ngrids
757 ldefmod(ng)=.true.
758 CALL def_mod (ng)
759 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
760 END DO
761
762
763
764 sourcefile=myfile
765 DO ng=1,ngrids
766 SELECT CASE (dav(ng)%IOtype)
767 CASE (io_nf90)
768 CALL netcdf_put_ivar (ng, inlm, dav(ng)%name, &
769 & 'Nimpact', nimpact, &
770 & (/0/), (/0/), &
771 & ncid = dav(ng)%ncid)
772 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
773
774# if defined PIO_LIB && defined DISTRIBUTE
775 CASE (io_pio)
776 CALL pio_netcdf_put_ivar (ng, inlm, dav(ng)%name, &
777 & 'Nimpact', nimpact, &
778 & (/0/), (/0/), &
779 & piofile = dav(ng)%pioFile)
780 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
781# endif
782 END SELECT
783 END DO
784#endif
785
786
787
788
789
790
791
792
793 DO ng=1,ngrids
794 str_day=tdays(ng)+ntimes(ng)*dt(ng)*sec2day
795 end_day=tdays(ng)
796 IF ((dstrs(ng).eq.0.0_r8).and.(dends(ng).eq.0.0_r8)) THEN
797 dstrs(ng)=end_day
798 dends(ng)=str_day
799 END IF
800 IF (master) THEN
801 WRITE (stdout,70) 'AD', dends(ng), dstrs(ng)
802 END IF
803 END DO
804
805
806
807
808
809
810
811
812
813 sourcefile=myfile
814 DO ng=1,ngrids
815#ifdef OBS_SPACE
816 CALL close_file (ng, inlm, obs(ng), obs(ng)%name)
817 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
818
819 IF (impord.ne.2) THEN
820 WRITE (obs(ng)%name,90) trim(oifb(ng)%head)
821 ELSE
822 WRITE (obs(ng)%name,90) trim(oifa(ng)%head)
823 END IF
824#else
825 CALL close_file (ng, inlm, ads(ng), ads(ng)%name)
826 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
827
828 IF (impord.ne.2) THEN
829 WRITE (ads(ng)%name,90) trim(foib(ng)%head)
830 ELSE
831 WRITE (ads(ng)%name,90) trim(foia(ng)%head)
832 END IF
833#endif
834 END DO
835
836
837
838
839
840
841
843 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
844 DO ng=1,ngrids
845 lreadfwd(ng)=.true.
846 END DO
847
848
849
850
851
852
853
855 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
856 DO ng=1,ngrids
857 lreadblk(ng)=.true.
858 END DO
859
860 IF (master) THEN
861 WRITE (stdout,50)
862 END IF
863
864
865
866
867
868
869
870
871
872
873
874
875 DO ng=1,ngrids
876 lstiffness=.false.
877#ifdef OBS_SPACE
878 lsen4dvar(ng)=.false.
879 lsenfct(ng)=.true.
880 lobspace(ng)=.true.
881# ifndef OBS_IMPACT
882 ladjvar(ng)=.false.
883# endif
884#else
885 lsen4dvar(ng)=.true.
886 lsenfct(ng)=.false.
887#endif
888 CALL close_file (ng, iadm, obs(ng), obs(ng)%name)
889 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
890
892 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
893 END DO
894
895
896
897
898 DO ng=1,ngrids
899 wrtforce=.true.
900 IF (adm(ng)%ncid.ne.-1) ldefadj(ng)=.false.
901 fcount=adm(ng)%load
902 adm(ng)%Nrec(fcount)=0
903 adm(ng)%Rindex=0
904 END DO
905
906
907
908 DO ng=1,ngrids
909 IF (master) THEN
910 WRITE (stdout,20) 'AD', ng, ntstart(ng), ntend(ng)
911 END IF
912 END DO
913
914#ifdef SOLVE3D
916#else
918#endif
919 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
920
921
922
923
924
925 DO ng=1,ngrids
926#ifdef DISTRIBUTE
927 CALL ad_wrt_his (ng, myrank)
928#else
929 CALL ad_wrt_his (ng, -1)
930#endif
931 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
932 END DO
933
934
935
936
937 DO ng=1,ngrids
938 wrtforce(ng)=.false.
939 lwrtstate2d(ng)=.false.
940#ifdef DISTRIBUTE
941 CALL ad_wrt_his (ng, myrank)
942#else
943 CALL ad_wrt_his (ng, -1)
944#endif
945 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
946 END DO
947
948
949
950 DO ng=1,ngrids
951 CALL get_state (ng, itlm, 4, adm(ng), adm(ng)%Rindex, rec1)
952 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
953 END DO
954
955
956
957 IF (impord.gt.1) THEN
958 sourcefile=myfile
959 DO ng=1,ngrids
960#ifdef OBS_SPACE
961 CALL close_file (ng, inlm, obs(ng), obs(ng)%name)
962 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
963
964 IF (impord.eq.2) THEN
965 WRITE (obs(ng)%name,90) trim(oifb(ng)%head)
966 ELSE
967 WRITE (obs(ng)%name,90) trim(oifa(ng)%head)
968 END IF
969#else
970 CALL close_file (ng, inlm, ads(ng), ads(ng)%name)
971 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
972
973 IF (impord.eq.2) THEN
974 WRITE (ads(ng)%name,90) trim(foib(ng)%head)
975 ELSE
976 WRITE (ads(ng)%name,90) trim(foia(ng)%head)
977 END IF
978#endif
979 END DO
980
981
982
983
984
985
986
988 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
989 DO ng=1,ngrids
990 lreadfwd(ng)=.true.
991 END DO
992
993
994
995
996
997
998
1000 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1001 DO ng=1,ngrids
1002 lreadblk(ng)=.true.
1003 END DO
1004
1005 IF (master) THEN
1006 WRITE (stdout,50)
1007 END IF
1008
1009
1010
1011 DO ng=1,ngrids
1012 lstiffness=.false.
1013#ifdef OBS_SPACE
1014 lsen4dvar(ng)=.false.
1015 lsenfct(ng)=.true.
1016 lobspace(ng)=.true.
1017# ifndef OBS_IMPACT
1018 ladjvar(ng)=.false.
1019# endif
1020#else
1021 lsen4dvar(ng)=.true.
1022 lsenfct(ng)=.false.
1023#endif
1024 CALL close_file (ng, iadm, obs(ng), obs(ng)%name)
1025 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1026
1028 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1029 END DO
1030
1031
1032
1033
1034 DO ng=1,ngrids
1035 wrtforce=.true.
1036 IF (adm(ng)%ncid.ne.-1) ldefadj(ng)=.false.
1037 fcount=adm(ng)%load
1038 adm(ng)%Nrec(fcount)=0
1039 adm(ng)%Rindex=0
1040 END DO
1041
1042
1043
1044 DO ng=1,ngrids
1045 IF (master) THEN
1046 WRITE (stdout,20) 'AD', ng, ntstart(ng), ntend(ng)
1047 END IF
1048 END DO
1049
1050#ifdef SOLVE3D
1052#else
1054#endif
1055 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1056
1057
1058
1059
1060
1061 DO ng=1,ngrids
1062#ifdef DISTRIBUTE
1063 CALL ad_wrt_his (ng, myrank)
1064#else
1065 CALL ad_wrt_his (ng, -1)
1066#endif
1067 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1068 END DO
1069
1070
1071
1072
1073 DO ng=1,ngrids
1074 wrtforce(ng)=.false.
1075 lwrtstate2d(ng)=.false.
1076#ifdef DISTRIBUTE
1077 CALL ad_wrt_his (ng, myrank)
1078#else
1079 CALL ad_wrt_his (ng, -1)
1080#endif
1081 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1082 END DO
1083
1084
1085
1086 DO ng=1,ngrids
1087 CALL get_state (ng, iadm, 4, adm(ng), adm(ng)%Rindex, rec1)
1088 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1089 END DO
1090
1091
1092
1093
1094 add=.true.
1095 DO ng=1,ngrids
1096 DO tile=first_tile(ng),last_tile(ng),+1
1097 CALL load_adtotl (ng, tile, rec1, rec1, add)
1098 END DO
1099 END DO
1100
1101 END IF
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111 DO ng=1,ngrids
1112 str_day=tdays(ng)+ntimes(ng)*dt(ng)*sec2day
1113 end_day=tdays(ng)
1114 IF ((dstrs(ng).eq.0.0_r8).and.(dends(ng).eq.0.0_r8)) THEN
1115 dstrs(ng)=end_day
1116 dends(ng)=str_day
1117 END IF
1118 IF (master) THEN
1119 WRITE (stdout,70) 'AD', dends(ng), dstrs(ng)
1120 END IF
1121 END DO
1122
1123
1124
1125
1126
1127
1128 ad_outer_loop : DO my_outer=nimpact,nimpact
1129 outer=my_outer
1130 inner=0
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140 dstart=dstarts
1141
1142 rtime=0.0_r8
1143 DO ng=1,ngrids
1144 rtime=max(rtime, dt(ng)*ntimes_ana(ng))
1145 ntimes(ng)=ntimes_ana(ng)
1146 END DO
1147 runinterval=rtime
1148
1149#if defined ADJUST_WSTRESS || defined ADJUST_STFLUX || \
1150 defined adjust_boundary
1151
1152
1153
1154
1155 DO ng=1,ngrids
1156 lreadfwd(ng)=.false.
1157 lreadblk(ng)=.false.
1158 END DO
1159
1161#endif
1162
1163
1164
1165 DO ng=1,ngrids
1166 WRITE (fwd(ng)%name,10) trim(his(ng)%head), outer-1
1167 END DO
1168
1169
1170
1171
1172
1173
1174
1176 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1177 DO ng=1,ngrids
1178 lreadfwd(ng)=.true.
1179 END DO
1180
1181#ifdef FORWARD_FLUXES
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1196 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1197 DO ng=1,ngrids
1198 lreadblk(ng)=.true.
1199 lreadfrc(ng)=.false.
1200 lreadqck(ng)=.false.
1201 END DO
1202#endif
1203
1204 IF (master) THEN
1205 WRITE (stdout,50)
1206 END IF
1207
1208
1209
1210
1211 DO ng=1,ngrids
1212 lstiffness=.false.
1213
1214#ifdef OBS_SPACE
1215 lsen4dvar(ng)=.true.
1216 lsenfct(ng)=.false.
1217 lobspace(ng)=.false.
1218# ifndef OBS_IMPACT
1219 ladjvar(ng)=.false.
1220# endif
1221#else
1222 lsen4dvar(ng)=.false.
1223 lsenfct(ng)=.false.
1224#endif
1225
1226 CALL close_file (ng, iadm, obs(ng), obs(ng)%name)
1227 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1228
1230 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1231 END DO
1232
1233
1234
1235
1236
1237
1238 add=.false.
1239 DO ng=1,ngrids
1240 DO tile=first_tile(ng),last_tile(ng),+1
1241#if defined ADJUST_WSTRESS || defined ADJUST_STFLUX
1242 CALL initialize_forces (ng, tile, itlm)
1243#endif
1244#ifdef ADJUST_BOUNDARY
1245 CALL initialize_boundary (ng, tile, itlm)
1246#endif
1247 CALL load_tltoad (ng, tile, rec1, rec1, add)
1248 END DO
1249 END DO
1250
1251#if defined ADJUST_WSTRESS || defined ADJUST_STFLUX || \
1252 defined adjust_boundary
1253
1254
1255
1256 DO ng=1,ngrids
1257 DO tile=first_tile(ng),last_tile(ng),+1
1258 CALL initialize_forces (ng, tile, iadm)
1259# ifdef ADJUST_BOUNDARY
1260 CALL initialize_boundary (ng, tile, iadm)
1261# endif
1262 END DO
1263 END DO
1264#endif
1265
1266
1267
1268
1269 DO ng=1,ngrids
1270 wrtforce=.true.
1271 IF (adm(ng)%ncid.ne.-1) ldefadj(ng)=.false.
1272 fcount=adm(ng)%load
1273 adm(ng)%Nrec(fcount)=0
1274 adm(ng)%Rindex=0
1275 END DO
1276
1277
1278
1279
1280 DO ng=1,ngrids
1281 IF (master) THEN
1282 WRITE (stdout,20) 'AD', ng, ntstart(ng), ntend(ng)
1283 END IF
1284 END DO
1285
1286#ifdef SOLVE3D
1288#else
1290#endif
1291 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1292
1293
1294
1295
1296
1297 DO ng=1,ngrids
1298#ifdef DISTRIBUTE
1299 CALL ad_wrt_his (ng, myrank)
1300#else
1301 CALL ad_wrt_his (ng, -1)
1302#endif
1303 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1304 END DO
1305
1306
1307
1308
1309 DO ng=1,ngrids
1310 wrtforce(ng)=.false.
1311 lwrtstate2d(ng)=.false.
1312#ifdef DISTRIBUTE
1313 CALL ad_wrt_his (ng, myrank)
1314#else
1315 CALL ad_wrt_his (ng, -1)
1316#endif
1317 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1318 END DO
1319
1320
1321
1322 lposterior=.false.
1323 CALL error_covariance (itlm, driver, outer, inner, &
1324 & lbck, lini, lold, lnew, &
1325 & rec1, rec2, lposterior)
1326 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341#ifdef DISTRIBUTE
1342
1343#else
1344
1345#endif
1346
1347
1348
1349
1350
1351
1352
1353
1354#ifdef OBS_SPACE
1355
1356
1357
1358
1359 DO ng=1,ngrids
1360 CALL close_file (ng, inlm, obs(ng), obs(ng)%name)
1361 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1362
1363 WRITE (obs(ng)%name,80) trim(obs(ng)%head), charc
1364 END DO
1365
1366 CALL deallocate_fourdvar
1367 CALL initialize_fourdvar
1368
1369
1370
1371
1372
1373
1374
1375 sourcefile=myfile
1376 DO ng=1,ngrids
1377 SELECT CASE (lcz(ng)%IOtype)
1378 CASE (io_nf90)
1379 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1380 & 'cg_beta', cg_beta)
1381 IF (founderror(exit_flag, noerror, &
1382 & __line__, myfile)) RETURN
1383
1384 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1385 & 'cg_delta', cg_delta)
1386 IF (founderror(exit_flag, noerror, &
1387 & __line__, myfile)) RETURN
1388
1389 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1390 & 'cg_Gnorm_v', cg_gnorm_v)
1391 IF (founderror(exit_flag, noerror, &
1392 & __line__, myfile)) RETURN
1393
1394 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1395 & 'cg_dla', cg_dla)
1396 IF (founderror(exit_flag, noerror, &
1397 & __line__, myfile)) RETURN
1398
1399 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1400 & 'cg_QG', cg_qg)
1401 IF (founderror(exit_flag, noerror, &
1402 & __line__, myfile)) RETURN
1403
1404 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1405 & 'zgrad0', zgrad0)
1406 IF (founderror(exit_flag, noerror, &
1407 & __line__, myfile)) RETURN
1408
1409 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1410 & 'zcglwk', zcglwk)
1411 IF (founderror(exit_flag, noerror, &
1412 & __line__, myfile)) RETURN
1413
1414 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1415 & 'TLmodVal_S', tlmodval_s, &
1416 & broadcast = .false.)
1417 IF (founderror(exit_flag, noerror, &
1418 & __line__, myfile)) RETURN
1419
1420# ifdef RPCG
1421 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1422 & 'Hbk', hbk)
1423 IF (founderror(exit_flag, noerror, &
1424 & __line__, myfile)) RETURN
1425
1426 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1427 & 'Jb0', jb0)
1428 IF (founderror(exit_flag, noerror, &
1429 & __line__, myfile)) RETURN
1430
1431 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1432 & 'vcglwk', vcglwk)
1433 IF (founderror(exit_flag, noerror, &
1434 & __line__, myfile)) RETURN
1435# endif
1436
1437# if defined PIO_LIB && defined DISTRIBUTE
1438 CASE (io_pio)
1439 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1440 & 'cg_beta', cg_beta)
1441 IF (founderror(exit_flag, noerror, &
1442 & __line__, myfile)) RETURN
1443
1444 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1445 & 'cg_delta', cg_delta)
1446 IF (founderror(exit_flag, noerror, &
1447 & __line__, myfile)) RETURN
1448
1449 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1450 & 'cg_Gnorm_v', cg_gnorm_v)
1451 IF (founderror(exit_flag, noerror, &
1452 & __line__, myfile)) RETURN
1453
1454 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1455 & 'cg_dla', cg_dla)
1456 IF (founderror(exit_flag, noerror, &
1457 & __line__, myfile)) RETURN
1458
1459 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1460 & 'cg_QG', cg_qg)
1461 IF (founderror(exit_flag, noerror, &
1462 & __line__, myfile)) RETURN
1463
1464 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1465 & 'zgrad0', zgrad0)
1466 IF (founderror(exit_flag, noerror, &
1467 & __line__, myfile)) RETURN
1468
1469 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1470 & 'zcglwk', zcglwk)
1471 IF (founderror(exit_flag, noerror, &
1472 & __line__, myfile)) RETURN
1473
1474 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1475 & 'TLmodVal_S', tlmodval_s)
1476 IF (founderror(exit_flag, noerror, &
1477 & __line__, myfile)) RETURN
1478
1479# ifdef RPCG
1480 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1481 & 'Hbk', hbk)
1482 IF (founderror(exit_flag, noerror, &
1483 & __line__, myfile)) RETURN
1484
1485 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1486 & 'Jb0', jb0)
1487 IF (founderror(exit_flag, noerror, &
1488 & __line__, myfile)) RETURN
1489
1490 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1491 & 'vcglwk', vcglwk)
1492 IF (founderror(exit_flag, noerror, &
1493 & __line__, myfile)) RETURN
1494# endif
1495# endif
1496 END SELECT
1497 END DO
1498
1499
1500
1501
1502
1503
1504 sourcefile=myfile
1505 wrtobsscale(1:ngrids)=.false.
1506 DO ng=1,ngrids
1507 SELECT CASE (lcz(ng)%IOtype)
1508 CASE (io_nf90)
1509 CALL netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1510 & vname(1,idobss), obsscale)
1511 IF (founderror(exit_flag, &
1512 & noerror, __line__, myfile)) RETURN
1513
1514# if defined PIO_LIB && defined DISTRIBUTE
1515 CASE (io_pio)
1516 CALL pio_netcdf_get_fvar (ng, itlm, lcz(ng)%name, &
1517 & vname(1,idobss), obsscale)
1518 IF (founderror(exit_flag, &
1519 & noerror, __line__, myfile)) RETURN
1520# endif
1521 END SELECT
1522 END DO
1523
1524
1525
1526
1527 DO ng=1,ngrids
1528 ldefmod(ng)=.true.
1529 CALL def_mod (ng)
1530 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1531 END DO
1532#endif /* OBS_SPACE */
1533
1534 DO ng=1,ngrids
1535 wrtnlmod(ng)=.false.
1536 wrttlmod(ng)=.true.
1537 lwrttlm(ng)=.false.
1538 END DO
1539
1540
1541
1542
1543 DO ng=1,ngrids
1544 DO tile=first_tile(ng),last_tile(ng),+1
1545 CALL initialize_forces (ng, tile, itlm)
1546#ifdef ADJUST_BOUNDARY
1547 CALL initialize_boundary (ng, tile, itlm)
1548#endif
1549 END DO
1550 END DO
1551
1552
1553
1554 DO ng=1,ngrids
1555 WRITE (fwd(ng)%name,10) trim(his(ng)%head), outer-1
1556 lstr=len_trim(fwd(ng)%name)
1557 fwd(ng)%base=fwd(ng)%name(1:lstr-3)
1558 END DO
1559
1560
1561
1562
1563 DO ng=1,ngrids
1564 IF (frcrec(ng).gt.3) THEN
1565 frequentimpulse(ng)=.true.
1566 END IF
1567 END DO
1568
1569
1570
1571 DO ng=1,ngrids
1572 itl(ng)%Rindex=rec1
1573 CALL close_file (ng, itlm, obs(ng), obs(ng)%name)
1574 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1575
1577 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1578 END DO
1579
1580
1581
1582
1583
1584 DO ng=1,ngrids
1585 IF (master) THEN
1586 WRITE (stdout,20) 'TL', ng, ntstart(ng), ntend(ng)
1587 END IF
1588 END DO
1589
1590#ifdef SOLVE3D
1592#else
1594#endif
1595 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1596
1597 DO ng=1,ngrids
1598 wrtnlmod(ng)=.false.
1599 wrttlmod(ng)=.false.
1600 END DO
1601
1602#ifdef OBS_IMPACT
1603
1604
1605
1606 DO ng=1,ngrids
1607# ifdef RPCG
1609# else
1611# endif
1612 END DO
1613#else
1614
1615
1616
1617 DO ng=1,ngrids
1618 WRITE (fwd(ng)%name,10) trim(his(ng)%head), outer-1
1619 lstr=len_trim(fwd(ng)%name)
1620 fwd(ng)%base=fwd(ng)%name(1:lstr-3)
1621 END DO
1622
1623
1624
1625 DO ng=1,ngrids
1626 DO tile=first_tile(ng),last_tile(ng),+1
1627 CALL initialize_forces (ng, tile, itlm)
1628# ifdef ADJUST_BOUNDARY
1629 CALL initialize_boundary (ng, tile, itlm)
1630# endif
1631 END DO
1632 END DO
1633
1634# ifdef RPCG
1635 ad_inner_loop : DO my_inner=ninner,0,-1
1636# else
1637 ad_inner_loop : DO my_inner=ninner,1,-1
1638# endif
1639 inner=my_inner
1640
1641# ifdef RPCG
1642
1643
1644
1645 IF (inner.eq.0) THEN
1646 DO ng=1,ngrids
1647 SELECT CASE (dav(ng)%IOtype)
1648 CASE (io_nf90)
1649 CALL netcdf_get_fvar (ng, itlm, dav(ng)%name, &
1650 & 'NLmodel_value', nlmodval)
1651 IF (founderror(exit_flag, noerror, &
1652 & __line__, myfile)) RETURN
1653
1654# if defined PIO_LIB && defined DISTRIBUTE
1655 CASE (io_pio)
1656 CALL pio_netcdf_get_fvar (ng, itlm, dav(ng)%name, &
1657 & 'NLmodel_value', nlmodval)
1658 IF (founderror(exit_flag, noerror, &
1659 & __line__, myfile)) RETURN
1660# endif
1661 END SELECT
1662 END DO
1663 END IF
1664 IF (inner.ne.ninner) THEN
1665 linner=.true.
1666 ELSE
1667 linner=.false.
1668 END IF
1669# endif
1670 IF (master) THEN
1671 WRITE (stdout,60) 'Adjoint of', uppercase('rbl4dvar'), &
1672 & outer, inner
1673 END IF
1674# ifdef RPCG
1675
1676 inner_compute : IF (linner) THEN
1677
1678# else
1679
1680
1681
1682 lcgini=.false.
1683 DO ng=1,ngrids
1684 CALL ad_congrad (ng, itlm, outer, inner, ninner, lcgini)
1685 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1686 END DO
1687# endif
1688
1689
1690
1691 DO ng=1,ngrids
1692 lsen4dvar(ng)=.false.
1693 lsenfct(ng)=.true.
1694# ifdef OBS_SPACE
1695 lobspace(ng)=.true.
1696# ifndef OBS_IMPACT
1697 ladjvar(ng)=.true.
1698# endif
1699# endif
1700 CALL close_file (ng, iadm, obs(ng), obs(ng)%name)
1701 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1702
1704 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1705 wrtmisfit(ng)=.false.
1706 END DO
1707
1708
1709
1710
1711 DO ng=1,ngrids
1712 wrtforce(ng)=.true.
1713 IF (adm(ng)%ncid.ne.-1) ldefadj(ng)=.false.
1714 fcount=adm(ng)%load
1715 adm(ng)%Nrec(fcount)=0
1716 adm(ng)%Rindex=0
1717 END DO
1718
1719
1720
1721 DO ng=1,ngrids
1722 IF (master) THEN
1723 WRITE (stdout,20) 'AD', ng, ntstart(ng), ntend(ng)
1724 END IF
1725 END DO
1726
1727# ifdef SOLVE3D
1729# else
1731# endif
1732 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1733
1734
1735
1736
1737
1738 DO ng=1,ngrids
1739# ifdef DISTRIBUTE
1740 CALL ad_wrt_his (ng, myrank)
1741# else
1742 CALL ad_wrt_his (ng, -1)
1743# endif
1744 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1745 END DO
1746
1747
1748
1749
1750 DO ng=1,ngrids
1751 wrtforce(ng)=.false.
1752 lwrtstate2d(ng)=.false.
1753# ifdef DISTRIBUTE
1754 CALL ad_wrt_his (ng, myrank)
1755# else
1756 CALL ad_wrt_his (ng, -1)
1757# endif
1758 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1759 END DO
1760
1761
1762
1763 lposterior=.false.
1764 CALL error_covariance (itlm, driver, outer, inner, &
1765 & lbck, lini, lold, lnew, &
1766 & rec1, rec2, lposterior)
1767 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783# ifdef DISTRIBUTE
1784
1785# else
1786
1787# endif
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798 DO ng=1,ngrids
1799 wrtnlmod(ng)=.false.
1800 wrttlmod(ng)=.true.
1801 END DO
1802
1803
1804
1805
1806 DO ng=1,ngrids
1807 IF (frcrec(ng).gt.3) THEN
1808 frequentimpulse(ng)=.true.
1809 END IF
1810 END DO
1811
1812
1813
1814 DO ng=1,ngrids
1815 itl(ng)%Rindex=rec1
1816 CALL close_file (ng, itlm, obs(ng), obs(ng)%name)
1817
1819 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1820 END DO
1821
1822
1823
1824
1825
1826 DO ng=1,ngrids
1827 IF (inner.gt.ninner) ldeftlm(ng)=.false.
1828 fcount=tlm(ng)%load
1829 tlm(ng)%Nrec(fcount)=0
1830 tlm(ng)%Rindex=0
1831 END DO
1832
1833
1834
1835
1836 DO ng=1,ngrids
1837 IF (master) THEN
1838 WRITE (stdout,20) 'TL', ng, ntstart(ng), ntend(ng)
1839 END IF
1840 END DO
1841
1842# ifdef SOLVE3D
1844# else
1846# endif
1847 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1848
1849 DO ng=1,ngrids
1850 wrtnlmod(ng)=.false.
1851 wrttlmod(ng)=.false.
1852 END DO
1853# ifdef RPCG
1854 END IF inner_compute
1855
1856 DO ng=1,ngrids
1857 CALL ad_rpcg_lanczos (ng, irpm, outer, inner, ninner, &
1858 & lcgini)
1859 END DO
1860# endif
1861
1862 END DO ad_inner_loop
1863# ifndef RPCG
1864
1865
1866
1867 inner=0
1868 lcgini=.true.
1869 DO ng=1,ngrids
1870 CALL ad_congrad (ng, itlm, outer, inner, ninner, lcgini)
1871 END DO
1872# endif
1873
1874#endif /* !OBS_IMPACT */
1875
1876#ifdef OBS_IMPACT
1877
1878
1879
1880 sourcefile=myfile
1881 DO ng=1,ngrids
1882 SELECT CASE (dav(ng)%IOtype)
1883 CASE (io_nf90)
1884 CALL netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1885 & 'ObsImpact_total', ad_obsval, &
1886# ifdef IMPACT_INNER
1887 & (/1,1/), (/mobs,ninner/), &
1888# else
1889 & (/1/), (/mobs/), &
1890# endif
1891 & ncid = dav(ng)%ncid)
1892 IF (founderror(exit_flag, noerror, &
1893 & __line__, myfile)) RETURN
1894
1895 CALL netcdf_sync (ng, inlm, dav(ng)%name, dav(ng)%ncid)
1896 IF (founderror(exit_flag, noerror, &
1897 & __line__, myfile)) RETURN
1898
1899# if defined PIO_LIB && defined DISTRIBUTE
1900 CASE (io_pio)
1901 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1902 & 'ObsImpact_total', ad_obsval, &
1903# ifdef IMPACT_INNER
1904 & (/1,1/), (/mobs,ninner/), &
1905# else
1906 & (/1/), (/mobs/), &
1907# endif
1908 & piofile = dav(ng)%pioFile)
1909 IF (founderror(exit_flag, noerror, &
1910 & __line__, myfile)) RETURN
1911
1912 CALL pio_netcdf_sync (ng, inlm, dav(ng)%name, &
1913 & dav(ng)%pioFile)
1914 IF (founderror(exit_flag, noerror, &
1915 & __line__, myfile)) RETURN
1916# endif
1917 END SELECT
1918 END DO
1919#else
1920
1921
1922
1923 sourcefile=myfile
1924 DO ng=1,ngrids
1925 SELECT CASE (dav(ng)%IOtype)
1926 CASE (io_nf90)
1927 CALL netcdf_put_fvar (ng, itlm, dav(ng)%name, &
1928 & 'ObsSens_total', ad_obsval, &
1929# ifdef IMPACT_INNER
1930 & (/1,1/), (/mobs,ninner/), &
1931# else
1932 & (/1/), (/mobs/), &
1933# endif
1934 & ncid = dav(ng)%ncid)
1935 IF (founderror(exit_flag, noerror, &
1936 & __line__, myfile)) RETURN
1937
1938 CALL netcdf_sync (ng, inlm, dav(ng)%name, dav(ng)%ncid)
1939 IF (founderror(exit_flag, noerror, &
1940 & __line__, myfile)) RETURN
1941
1942# if defined PIO_LIB && defined DISTRIBUTE
1943 CASE (io_pio)
1944 CALL pio_netcdf_put_fvar (ng, itlm, dav(ng)%name, &
1945 & 'ObsSens_total', ad_obsval, &
1946# ifdef IMPACT_INNER
1947 & (/1,1/), (/mobs,ninner/), &
1948# else
1949 & (/1/), (/mobs/), &
1950# endif
1951 & piofile = dav(ng)%pioFile)
1952 IF (founderror(exit_flag, noerror, &
1953 & __line__, myfile)) RETURN
1954
1955 CALL pio_netcdf_sync (ng, inlm, dav(ng)%name, &
1956 & dav(ng)%pioFile)
1957 IF (founderror(exit_flag, noerror, &
1958 & __line__, myfile)) RETURN
1959# endif
1960 END SELECT
1961 END DO
1962#endif
1963
1964
1965
1966 sourcefile=myfile
1967 DO ng=1,ngrids
1968 CALL close_file (ng, itlm, tlm(ng), tlm(ng)%name)
1969 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1970 END DO
1971
1972#if defined OBS_IMPACT && defined OBS_IMPACT_SPLIT
1973
1974
1975
1976
1977
1978
1979
1980 DO ng=1,ngrids
1981 wrtnlmod(ng)=.false.
1982 wrttlmod(ng)=.true.
1983 lwrttlm(ng)=.false.
1984 END DO
1985
1986
1987
1988
1989
1990
1991 DO ng=1,ngrids
1992 DO tile=first_tile(ng),last_tile(ng),+1
1993 CALL initialize_forces (ng, tile, itlm)
1994# ifdef ADJUST_BOUNDARY
1995 CALL initialize_boundary (ng, tile, itlm)
1996# endif
1997 END DO
1998 END DO
1999
2000
2001
2002 DO ng=1,ngrids
2003 WRITE (fwd(ng)%name,10) trim(his(ng)%head), outer-1
2004 lstr=len_trim(fwd(ng)%name)
2005 fwd(ng)%base=fwd(ng)%name(1:lstr-3)
2006 END DO
2007
2008
2009
2010
2011 DO ng=1,ngrids
2012 IF (frcrec(ng).gt.3) THEN
2013 frequentimpulse(ng)=.true.
2014 END IF
2015 END DO
2016
2017
2018
2019 DO ng=1,ngrids
2020 itl(ng)%Rindex=rec1
2021 CALL close_file (ng, itlm, obs(ng), obs(ng)%name)
2022 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
2023
2025 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
2026 END DO
2027
2028
2029
2030
2031 DO ng=1,ngrids
2032 DO tile=first_tile(ng),last_tile(ng),+1
2033 CALL initialize_forces (ng, tile, itlm)
2034# ifdef ADJUST_BOUNDARY
2035 CALL initialize_boundary (ng, tile, itlm)
2036# endif
2037 END DO
2038 END DO
2039
2040
2041
2042
2043
2044 DO ng=1,ngrids
2045 IF (master) THEN
2046 WRITE (stdout,20) 'TL', ng, ntstart(ng), ntend(ng)
2047 END IF
2048 END DO
2049
2050# ifdef SOLVE3D
2052# else
2054# endif
2055 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
2056
2057 DO ng=1,ngrids
2058 wrtnlmod(ng)=.false.
2059 wrttlmod(ng)=.false.
2060 END DO
2061
2062
2063
2064 DO ng=1,ngrids
2065# ifdef RPCG
2067# else
2069# endif
2070 END DO
2071
2072
2073
2074 sourcefile=myfile
2075 DO ng=1,ngrids
2076 SELECT CASE (dav(ng)%IOtype)
2077 CASE (io_nf90)
2078 CALL netcdf_put_fvar (ng, itlm, dav(ng)%name, &
2079 & 'ObsImpact_IC', ad_obsval, &
2080# ifdef IMPACT_INNER
2081 & (/1,1/), (/mobs,ninner/), &
2082# else
2083 & (/1/), (/mobs/), &
2084# endif
2085 & ncid = dav(ng)%ncid)
2086 IF (founderror(exit_flag, noerror, &
2087 & __line__, myfile)) RETURN
2088
2089 CALL netcdf_sync (ng, inlm, dav(ng)%name, dav(ng)%ncid)
2090 IF (founderror(exit_flag, noerror, &
2091 & __line__, myfile)) RETURN
2092
2093# if defined PIO_LIB && defined DISTRIBUTE
2094 CASE (io_pio)
2095 CALL pio_netcdf_put_fvar (ng, itlm, dav(ng)%name, &
2096 & 'ObsImpact_IC', ad_obsval, &
2097# ifdef IMPACT_INNER
2098 & (/1,1/), (/mobs,ninner/), &
2099# else
2100 & (/1/), (/mobs/), &
2101# endif
2102 & piofile = dav(ng)%pioFile)
2103 IF (founderror(exit_flag, noerror, &
2104 & __line__, myfile)) RETURN
2105
2106 CALL pio_netcdf_sync (ng, inlm, dav(ng)%name, &
2107 & dav(ng)%pioFile)
2108 IF (founderror(exit_flag, noerror, &
2109 & __line__, myfile)) RETURN
2110# endif
2111 END SELECT
2112 END DO
2113
2114# if defined ADJUST_WSTRESS || defined ADJUST_STFLUX
2115
2116
2117
2118
2119
2120
2121
2122 DO ng=1,ngrids
2123 wrtnlmod(ng)=.false.
2124 wrttlmod(ng)=.true.
2125 lwrttlm(ng)=.false.
2126 END DO
2127
2128
2129
2130
2131
2132
2133 DO ng=1,ngrids
2134 DO tile=first_tile(ng),last_tile(ng),+1
2135 CALL initialize_forces (ng, tile, itlm)
2136# ifdef ADJUST_BOUNDARY
2137 CALL initialize_boundary (ng, tile, itlm)
2138# endif
2139 END DO
2140 END DO
2141
2142
2143
2144 DO ng=1,ngrids
2145 WRITE (fwd(ng)%name,10) trim(his(ng)%head), outer-1
2146 lstr=len_trim(fwd(ng)%name)
2147 fwd(ng)%base=fwd(ng)%name(1:lstr-3)
2148 END DO
2149
2150
2151
2152
2153 DO ng=1,ngrids
2154 IF (frcrec(ng).gt.3) THEN
2155 frequentimpulse(ng)=.true.
2156 END IF
2157 END DO
2158
2159
2160
2161 DO ng=1,ngrids
2162 itl(ng)%Rindex=rec1
2163 CALL close_file (ng, itlm, obs(ng), obs(ng)%name)
2164 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
2165
2167 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
2168 END DO
2169
2170
2171
2172
2173 DO ng=1,ngrids
2174 DO tile=first_tile(ng),last_tile(ng),+1
2175 CALL initialize_ocean (ng, tile, itlm)
2176# ifdef ADJUST_BOUNDARY
2177 CALL initialize_boundary (ng, tile, itlm)
2178# endif
2179 END DO
2180 END DO
2181
2182
2183
2184
2185
2186 DO ng=1,ngrids
2187 IF (master) THEN
2188 WRITE (stdout,20) 'TL', ng, ntstart(ng), ntend(ng)
2189 END IF
2190 END DO
2191
2192# ifdef SOLVE3D
2194# else
2196# endif
2197 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
2198
2199 DO ng=1,ngrids
2200 wrtnlmod(ng)=.false.
2201 wrttlmod(ng)=.false.
2202 END DO
2203
2204
2205
2206 DO ng=1,ngrids
2207# ifdef RPCG
2209# else
2211# endif
2212 END DO
2213
2214
2215
2216 sourcefile=myfile
2217 DO ng=1,ngrids
2218 SELECT CASE (dav(ng)%IOtype)
2219 CASE (io_nf90)
2220 CALL netcdf_put_fvar (ng, itlm, dav(ng)%name, &
2221 & 'ObsImpact_FC', ad_obsval, &
2222# ifdef IMPACT_INNER
2223 & (/1,1/), (/mobs,ninner/), &
2224# else
2225 & (/1/), (/mobs/), &
2226# endif
2227 & ncid = dav(ng)%ncid)
2228 IF (founderror(exit_flag, noerror, &
2229 & __line__, myfile)) RETURN
2230
2231 CALL netcdf_sync (ng, inlm, dav(ng)%name, dav(ng)%ncid)
2232 IF (founderror(exit_flag, noerror, &
2233 & __line__, myfile)) RETURN
2234
2235# if defined PIO_LIB && defined DISTRIBUTE
2236 CASE (io_pio)
2237 CALL pio_netcdf_put_fvar (ng, itlm, dav(ng)%name, &
2238 & 'ObsImpact_FC', ad_obsval, &
2239# ifdef IMPACT_INNER
2240 & (/1,1/), (/mobs,ninner/), &
2241# else
2242 & (/1/), (/mobs/), &
2243# endif
2244 & piofile = dav(ng)%pioFile)
2245 IF (founderror(exit_flag, noerror, &
2246 & __line__, myfile)) RETURN
2247
2248 CALL pio_netcdf_sync (ng, inlm, dav(ng)%name, &
2249 & dav(ng)%pioFile)
2250 IF (founderror(exit_flag, noerror, &
2251 & __line__, myfile)) RETURN
2252# endif
2253 END SELECT
2254 END DO
2255# endif
2256
2257# if defined ADJUST_BOUNDARY
2258
2259
2260
2261
2262
2263
2264
2265 DO ng=1,ngrids
2266 wrtnlmod(ng)=.false.
2267 wrttlmod(ng)=.true.
2268 lwrttlm(ng)=.false.
2269 END DO
2270
2271
2272
2273
2274
2275
2276 DO ng=1,ngrids
2277 DO tile=first_tile(ng),last_tile(ng),+1
2278 CALL initialize_forces (ng, tile, itlm)
2279# ifdef ADJUST_BOUNDARY
2280 CALL initialize_boundary (ng, tile, itlm)
2281# endif
2282 END DO
2283 END DO
2284
2285
2286
2287 DO ng=1,ngrids
2288 WRITE (fwd(ng)%name,10) trim(his(ng)%head), outer-1
2289 lstr=len_trim(fwd(ng)%name)
2290 fwd(ng)%base=fwd(ng)%name(1:lstr-3)
2291 END DO
2292
2293
2294
2295
2296 DO ng=1,ngrids
2297 IF (frcrec(ng).gt.3) THEN
2298 frequentimpulse(ng)=.true.
2299 END IF
2300 END DO
2301
2302
2303
2304 DO ng=1,ngrids
2305 itl(ng)%Rindex=rec1
2306 CALL close_file (ng, itlm, obs(ng), obs(ng)%name)
2307 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
2308
2310 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
2311 END DO
2312
2313
2314
2315
2316 DO ng=1,ngrids
2317 DO tile=first_tile(ng),last_tile(ng),+1
2318 CALL initialize_ocean (ng, tile, itlm)
2319 CALL initialize_forces (ng, tile, itlm)
2320 END DO
2321 END DO
2322
2323
2324
2325
2326
2327 DO ng=1,ngrids
2328 IF (master) THEN
2329 WRITE (stdout,20) 'TL', ng, ntstart(ng), ntend(ng)
2330 END IF
2331 END DO
2332
2333# ifdef SOLVE3D
2335# else
2337# endif
2338 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
2339
2340 DO ng=1,ngrids
2341 wrtnlmod(ng)=.false.
2342 wrttlmod(ng)=.false.
2343 END DO
2344
2345
2346
2347 DO ng=1,ngrids
2348# ifdef RPCG
2350# else
2352# endif
2353 END DO
2354
2355
2356
2357 sourcefile=myfile
2358 DO ng=1,ngrids
2359 SELECT CASE (dav(ng)%IOtype)
2360 CASE (io_nf90)
2361 CALL netcdf_put_fvar (ng, itlm, dav(ng)%name, &
2362 & 'ObsImpact_BC', ad_obsval, &
2363# ifdef IMPACT_INNER
2364 & (/1,1/), (/mobs,ninner/), &
2365# else
2366 & (/1/), (/mobs/), &
2367# endif
2368 & ncid = dav(ng)%ncid)
2369 IF (founderror(exit_flag, noerror, &
2370 & __line__, myfile)) RETURN
2371
2372 CALL netcdf_sync (ng, inlm, dav(ng)%name, dav(ng)%ncid)
2373 IF (founderror(exit_flag, noerror,
2374 & __line__, myfile)) RETURN
2375
2376# if defined PIO_LIB && defined DISTRIBUTE
2377 CASE (io_pio)
2378 CALL pio_netcdf_put_fvar (ng, itlm, dav(ng)%name, &
2379 & 'ObsImpact_BC', ad_obsval, &
2380# ifdef IMPACT_INNER
2381 & (/1,1/), (/mobs,ninner/), &
2382# else
2383 & (/1/), (/mobs/), &
2384# endif
2385 & piofile = dav(ng)%pioFile)
2386 IF (founderror(exit_flag, noerror, &
2387 & __line__, myfile)) RETURN
2388
2389 CALL pio_netcdf_sync (ng, inlm, dav(ng)%name, &
2390 & dav(ng)%pioFile)
2391 IF (founderror(exit_flag, noerror,
2392 & __line__, myfile)) RETURN
2393# endif
2394 END SELECT
2395 END DO
2396# endif
2397#endif /* OBS_IMPACT_SPLIT */
2398
2399
2400
2401 sourcefile=myfile
2402 DO ng=1,ngrids
2403 CALL close_file (ng, inlm, fwd(ng), fwd(ng)%name)
2404 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
2405
2406 IF (his(ng)%IOtype.eq.io_nf90) THEN
2407 his(ng)%ncid=-1
2408#if defined PIO_LIB && defined DISTRIBUTE
2409 ELSE IF (his(ng)%IOtype.eq.io_pio) THEN
2410 his(ng)%pioFile%fh=-1
2411#endif
2412 END IF
2413 END DO
2414
2415 END DO ad_outer_loop
2416
2417 10 FORMAT (a,'_outer',i0,'.nc')
2418 20 FORMAT (/,1x,a,1x,'ROMS: started time-stepping:', &
2419 & ' (Grid: ',i2.2,' TimeSteps: ',i8.8,' - ',i8.8,')',/)
2420 30 FORMAT (' (',i3.3,',',i3.3,'): ',a,' data penalty, Jdata = ', &
2421 & 1p,e17.10,0p,t68,a)
2422 40 FORMAT (/,' Converting Convolved Adjoint Trajectory to', &
2423 & ' Impulses: Outer = ',i3.3,' Inner = ',i3.3,/)
2424 50 FORMAT (/,'ROMS: Started adjoint Sensitivity calculation', &
2425 & ' ...',/)
2426 60 FORMAT (/,'ROMS: ',a,1x,a,', Outer = ',i3.3, &
2427 & ' Inner = ',i3.3,/)
2428 70 FORMAT (/,1x,a,1x,'ROMS: adjoint forcing time range: ', &
2429 & f12.4,' - ',f12.4 ,/)
2430 80 FORMAT (a,'_',a,'.nc')
2431 90 FORMAT (a,'.nc')
2432
2433 RETURN
subroutine rep_matrix(ng, model, outloop, ninnloop)
subroutine tl_initial(ng)
subroutine tl_main3d(runinterval)