215
216
217
218
219 logical, intent(in) :: Lposterior
220
221 integer, intent(in) :: model, outLoop, innLoop
222 integer, intent(in) :: Rbck, Rini, Rec1, Rec2
223 integer, intent(in) :: Rold(Ngrids)
224 integer, intent(in) :: Rnew(Ngrids)
225
226 character (len=*), intent(in) :: driver
227
228
229
230 logical :: Lweak, add
231
232 integer :: ADrec, BckRec, Fcount, IniRec
233 integer :: i, irec, ng, tile
234# ifdef RPCG
235 integer :: LTLM1, LTLM2, Rec5, jrec, nADrec
236# endif
237 integer, dimension(Ngrids) :: Nrec
238
239 character (len=*), parameter :: MyFile = &
240 & __FILE__//", error_covariance"
241
242 sourcefile=myfile
243
244
245
246
247
248 IF (master) THEN
249 IF ((outloop.lt.0).and.(innloop.lt.0)) THEN
250 WRITE (stdout,10)
251 10 FORMAT (/,' Convolving Adjoint Trajectory...')
252 ELSE
253 WRITE (stdout,20) outloop, innloop
254 20 FORMAT (/,' Convolving Adjoint Trajectory: Outer = ',i3.3, &
255 & ' Inner = ',i3.3)
256 END IF
257 END IF
258
259
260
261 DO ng=1,ngrids
262 DO tile=first_tile(ng),last_tile(ng),+1
263 CALL initialize_ocean (ng, tile, iadm)
264 END DO
265 END DO
266
267
268
269 DO ng=1,ngrids
270 fcount=adm(ng)%Fcount
271 nrec(ng)=adm(ng)%Nrec(fcount)
272 adm(ng)%Nrec(fcount)=0
273 adm(ng)%Rindex=0
274 lwrtstate2d(ng)=.true.
275 lwrttime(ng)=.false.
276 END DO
277
278
279
280
281
282
283
284
285
286
287
288
289 DO ng=1,ngrids
290 adrec=nrec(ng)
291 frcrec(ng)=nrec(ng)
292 CALL get_state (ng, itlm, 4, adm(ng), adrec, rold(ng))
293 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
294 END DO
295
296# ifdef BALANCE_OPERATOR
297
298
299
300
301 inirec=rini
302 DO ng=1,ngrids
303 CALL get_state (ng, inlm, 2, ini(ng), inirec, inirec)
304 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
305 nrhs(ng)=rini
306 END DO
307# endif
308
309
310
311
312
313
314
315
316
317 lweak=.false.
318 add=.false.
319 DO ng=1,ngrids
320# ifdef PROFILE
321 CALL wclock_on (ng, model, 82, __line__, myfile)
322# endif
323 DO tile=first_tile(ng),last_tile(ng),+1
324 CALL load_tltoad (ng, tile, rold(ng), rold(ng), add)
325# ifdef BALANCE_OPERATOR
326 CALL ad_balance (ng, tile, rini, rold(ng))
327# endif
328 CALL ad_variability (ng, tile, rold(ng), lweak)
329 CALL ad_convolution (ng, tile, rold(ng), lweak, 2)
330 CALL initialize_ocean (ng, tile, itlm)
331 CALL initialize_forces (ng, tile, itlm)
332# ifdef ADJUST_BOUNDARY
333 CALL initialize_boundary (ng, tile, itlm)
334# endif
335 END DO
336# ifdef PROFILE
337 CALL wclock_off (ng, model, 82, __line__, myfile)
338# endif
339 END DO
340
341
342
343
344
345
346
347
348 lweak=.false.
349 add=.false.
350 DO ng=1,ngrids
351# ifdef PROFILE
352 CALL wclock_on (ng, model, 82, __line__, myfile)
353# endif
354 DO tile=first_tile(ng),last_tile(ng),+1
355 CALL load_adtotl (ng, tile, rold(ng), rold(ng), add)
356 CALL tl_convolution (ng, tile, rold(ng), lweak, 2)
357 CALL tl_variability (ng, tile, rold(ng), lweak)
358# ifdef BALANCE_OPERATOR
359 CALL tl_balance (ng, tile, rini, rold(ng))
360# endif
361 END DO
362
363# ifdef POSTERIOR_ERROR_I
364
365
366
367
368 IF (lposterior) THEN
369 DO tile=first_tile(ng),last_tile(ng),+1
370 CALL load_tltoad (ng, tile, rold(ng), rold(ng), add)
371 END DO
372 END IF
373# endif
374# ifdef PROFILE
375 CALL wclock_off (ng, model, 82, __line__, myfile)
376# endif
377 END DO
378
379# if defined ARRAY_MODES || defined R4DVAR || \
380 defined r4dvar_ana_sensitivity
381
382
383
384
385
386
387 IF ((model.eq.irpm).and. &
388 & (index(driver,'r4dvar').ne.0)) THEN
389 bckrec=rbck
390 DO ng=1,ngrids
391 CALL get_state (ng, inlm, 9, ini(ng), bckrec, rnew(ng))
392 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
393 END DO
394
395 add=.false.
396 DO ng=1,ngrids
397 DO tile=first_tile(ng),last_tile(ng),+1
398 CALL load_tltoad (ng, tile, rold(ng), rold(ng), add)
399 CALL rp_ini_adjust (ng, tile, rnew(ng), rold(ng))
400 END DO
401 END DO
402 END IF
403
404# elif defined RBL4DVAR || defined RBL4DVAR_ANA_SENSITIVITY
405# ifndef RPCG
406
407
408
409
410
411
412 IF ((model.eq.inlm).and. &
413 & (index(driver,'rbl4dvar').ne.0)) THEN
414 bckrec=rbck
415 DO ng=1,ngrids
416 CALL get_state (ng, inlm, 9, ini(ng), bckrec, rnew(ng))
417 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
418 END DO
419
420 add=.false.
421 DO ng=1,ngrids
422 DO tile=first_tile(ng),last_tile(ng),+1
423 CALL load_tltoad (ng, tile, rold(ng), rold(ng), add)
424 CALL ini_adjust (ng, tile, rold(ng), rnew(ng))
425 END DO
426 END DO
427 END IF
428# endif
429# endif
430
431
432
433
434
435
436 IF (model.eq.itlm) THEN
437 DO ng=1,ngrids
438# ifdef DISTRIBUTE
439 CALL tl_wrt_ini (ng, myrank, rold(ng), rec1)
440# else
441 CALL tl_wrt_ini (ng, -1, rold(ng), rec1)
442# endif
443 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
444 END DO
445# if defined ARRAY_MODES || defined R4DVAR || \
446 defined r4dvar_ana_sensitivity
447 ELSE IF (model.eq.irpm) THEN
448 DO ng=1,ngrids
449# ifdef DISTRIBUTE
450 CALL rp_wrt_ini (ng, myrank, rold(ng), rec2)
451# else
452 CALL rp_wrt_ini (ng, -1, rold(ng), rec2)
453# endif
454 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
455 END DO
456# elif (defined RBL4DVAR || defined RBL4DVAR_ANA_SENSITIVITY) && \
457
458 ELSE IF (model.eq.inlm) THEN
459 DO ng=1,ngrids
460# ifdef DISTRIBUTE
461 CALL wrt_ini (ng, myrank, rnew(ng))
462# else
463 CALL wrt_ini (ng, -1, rnew(ng))
464# endif
465 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
466# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS || \
467 defined adjust_boundary
468# ifdef DISTRIBUTE
469 CALL wrt_frc_ad (ng, myrank, rold(ng), ini(ng)%Rindex)
470# else
471 CALL wrt_frc_ad (ng, -1, rold(ng), ini(ng)%Rindex)
472# endif
473 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
474# endif
475 END DO
476# endif
477 END IF
478
479# ifdef RPCG
480
481
482
483
484
485
486 IF (model.eq.inlm) THEN
487 DO ng=1,ngrids
488# ifdef DISTRIBUTE
489 CALL tl_wrt_ini (ng, myrank, rold(ng), rec2)
490# else
491 CALL tl_wrt_ini (ng, -1, rold(ng), rec2)
492# endif
493 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
494 END DO
495 END IF
496# endif
497
498# ifdef POSTERIOR_ERROR_I
499
500
501
502
503
504 IF (lposterior.and.(inner.ne.0)) THEN
505 DO ng=1,ngrids
506# ifdef DISTRIBUTE
507 CALL wrt_hessian (ng, myrank, rold(ng), rold(ng))
508# else
509 CALL wrt_hessian (ng, -1, rold(ng), rold(ng))
510# endif
511 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
512 END DO
513 END IF
514# endif
515# ifdef RPCG
516
517
518
519
520
521
522 IF (laugweak) THEN
523 ltlm1=1
524 ltlm2=2
525 rec5=5
526 DO ng=1,ngrids
527 IF (nadj(ng).lt.ntimes(ng)) THEN
528 nadrec=2*(1+ntimes(ng)/nadj(ng))
529 ELSE
530 nadrec=0
531 END IF
532 DO irec=1,nadrec/2
533 jrec=rec5+nadrec/2+irec
534
535
536
537
538 CALL get_state (ng, itlm, 4, itl(ng), jrec, ltlm1)
539 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
540
541 DO tile=first_tile(ng),last_tile(ng),+1
542 CALL aug_oper (ng, tile, ltlm1, ltlm2)
543 END DO
544
545 DO tile=first_tile(ng),last_tile(ng),+1
546 CALL sum_grad (ng, tile, ltlm1, ltlm2)
547 END DO
548
549
550
551 adrec=(nrec(ng)-1)-(irec-1)
552 CALL get_state (ng, itlm, 4, adm(ng), adrec, ltlm1)
553 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
554
555 DO tile=first_tile(ng),last_tile(ng),+1
556 CALL sum_grad (ng, tile, ltlm1, ltlm2)
557 END DO
558
559
560
561
562# ifdef DISTRIBUTE
563 CALL tl_wrt_ini (ng, myrank, ltlm2, jrec)
564# else
565 CALL tl_wrt_ini (ng, -1, ltlm2, jrec)
566# endif
567 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
568
569 END DO
570 END DO
571 END IF
572# endif
573# ifdef TIME_CONV
574
575
576
577
578
579
580
581
582
583
584
585
586
587 DO ng=1,ngrids
588 IF (nrec(ng).gt.3) THEN
589# ifdef PROFILE
590 CALL wclock_on (ng, model, 82, __line__, myfile)
591# endif
592 DO irec=1,nrec(ng)-1
593
594
595
596
597
598 adrec=irec
599 CALL get_state (ng, itlm, 4, adm(ng), adrec, rold(ng))
600 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
601
602
603
604
605
606
607
608
609
610 lweak=.true.
611 add=.false.
612 DO tile=first_tile(ng),last_tile(ng),+1
613 CALL load_tltoad (ng, tile, rold(ng), rold(ng), add)
614# ifdef BALANCE_OPERATOR
615 CALL ad_balance (ng, tile, rini, rold(ng))
616# endif
617 CALL ad_variability (ng, tile, rold(ng), lweak)
618 CALL ad_convolution (ng, tile, rold(ng), lweak, 2)
619 CALL initialize_ocean (ng, tile, itlm)
620 CALL initialize_forces (ng, tile, itlm)
621# ifdef ADJUST_BOUNDARY
622 CALL initialize_boundary (ng, tile, itlm)
623# endif
624 END DO
625
626
627
628
629 kstp(ng)=rold(ng)
630# ifdef SOLVE3D
631 nstp(ng)=rold(ng)
632# endif
633# ifdef DISTRIBUTE
634 CALL ad_wrt_his (ng, myrank)
635# else
636 CALL ad_wrt_his (ng, -1)
637# endif
638 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
639 END DO
640 lwrtstate2d(ng)=.false.
641 lwrttime(ng)=.true.
642# ifdef PROFILE
643 CALL wclock_off (ng, model, 82, __line__, myfile)
644# endif
645 END IF
646 END DO
647
648
649
650
651 DO ng=1,ngrids
652 tlf(ng)%Rindex=0
653 DO tile=first_tile(ng),last_tile(ng),+1
654 CALL time_corr (ng, tile, iadm, adm(ng)%IOtype, adm(ng)%name)
655 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
656 END DO
657 END DO
658
659 DO ng=1,ngrids
660 IF (nrec(ng).gt.3) THEN
661# ifdef PROFILE
662 CALL wclock_on (ng, model, 82, __line__, myfile)
663# endif
664 adm(ng)%Rindex=0
665 lwrtstate2d(ng)=.true.
666 DO irec=nrec(ng)-1,1,-1
667
668
669
670
671
672
673
674 adrec=irec
675 CALL get_state (ng, 6, 6, tlf(ng), adrec, rold(ng))
676 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
677
678 lweak=.true.
679 add=.false.
680 DO tile=first_tile(ng),last_tile(ng),+1
681 CALL tl_convolution (ng, tile, rold(ng), lweak, 2)
682 CALL tl_variability (ng, tile, rold(ng), lweak)
683# ifdef BALANCE_OPERATOR
684 CALL tl_balance (ng, tile, rini, rold(ng))
685# endif
686 CALL load_tltoad (ng, tile, rold(ng), rold(ng), add)
687 END DO
688
689
690
691
692 kstp(ng)=rold(ng)
693# ifdef SOLVE3D
694 nstp(ng)=rold(ng)
695# endif
696# ifdef DISTRIBUTE
697 CALL ad_wrt_his (ng, myrank)
698# else
699 CALL ad_wrt_his (ng, -1)
700# endif
701 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
702 END DO
703 lwrtstate2d(ng)=.false.
704 lwrttime(ng)=.true.
705# ifdef PROFILE
706 CALL wclock_off (ng, model, 82, __line__, myfile)
707# endif
708 END IF
709 END DO
710
711# else
712
713
714
715
716
717
718
719
720 DO ng=1,ngrids
721 IF (nrec(ng).gt.3) THEN
722# ifdef PROFILE
723 CALL wclock_on (ng, model, 82, __line__, myfile)
724# endif
725 DO irec=1,nrec(ng)-1
726
727
728
729
730
731 adrec=irec
732 CALL get_state (ng, itlm, 4, adm(ng), adrec, rold(ng))
733 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
734
735
736
737
738
739
740
741
742
743 lweak=.true.
744 add=.false.
745 DO tile=first_tile(ng),last_tile(ng),+1
746 CALL load_tltoad (ng, tile, rold(ng), rold(ng), add)
747# ifdef BALANCE_OPERATOR
748 CALL ad_balance (ng, tile, rini, rold(ng))
749# endif
750 CALL ad_variability (ng, tile, rold(ng), lweak)
751 CALL ad_convolution (ng, tile, rold(ng), lweak, 2)
752 CALL initialize_ocean (ng, tile, itlm)
753 CALL initialize_forces (ng, tile, itlm)
754# ifdef ADJUST_BOUNDARY
755 CALL initialize_boundary (ng, tile, itlm)
756# endif
757 END DO
758
759
760
761
762
763
764
765
766
767 lweak=.true.
768 add=.false.
769 DO tile=first_tile(ng),last_tile(ng),+1
770 CALL load_adtotl (ng, tile, rold(ng), rold(ng), add)
771 CALL tl_convolution (ng, tile, rold(ng), lweak, 2)
772 CALL tl_variability (ng, tile, rold(ng), lweak)
773# ifdef BALANCE_OPERATOR
774 CALL tl_balance (ng, tile, rini, rold(ng))
775# endif
776 CALL load_tltoad (ng, tile, rold(ng), rold(ng), add)
777 END DO
778
779
780
781 kstp(ng)=rold(ng)
782# ifdef SOLVE3D
783 nstp(ng)=rold(ng)
784# endif
785# ifdef DISTRIBUTE
786 CALL ad_wrt_his (ng, myrank)
787# else
788 CALL ad_wrt_his (ng, -1)
789# endif
790 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
791 END DO
792 lwrtstate2d(ng)=.false.
793 lwrttime(ng)=.true.
794# ifdef PROFILE
795 CALL wclock_off (ng, model, 82, __line__, myfile)
796# endif
797 END IF
798 END DO
799# endif
800
801 RETURN