388
389
391
392
393
394 logical, intent(in) :: backward
395
396 integer, intent(in) :: ng, model
397
398
399
400 logical, dimension(NV) :: got_var(NV)
401
402 integer :: Ifirst, i, nvd, recdim, status
403 integer :: Vsize(4)
404
405# ifdef WEAK_CONSTRAINT
406 real(r8), parameter :: IniVal = 0.0_r8
407# endif
408 real(r8) :: tend
409
410 character (len=*), parameter :: MyFile = &
411 & __FILE__//"obs_initial_nf90"
412
413 sourcefile=myfile
414
415
416
417
418
419
420 query : IF (obs(ng)%ncid.eq.-1) THEN
421
422
423
425 & obs(ng)%pioFile)
426 IF (founderror(exit_flag, noerror, __line__, myfile)) THEN
427 WRITE (stdout,10) trim(obs(ng)%name)
428 RETURN
429 END IF
430
431
432
434 & obs(ng)%pioFile)
435 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
436
437
438
439 DO i=1,nv
440 got_var(i)=.false.
441 END DO
442
443
444
445
446 DO i=1,n_var
447 IF (trim(var_name(i)).eq.trim(vname(1,idoday))) THEN
448 got_var(idoday)=.true.
449 obs(ng)%pioVar(idoday)%vd=
var_desc(i)
450 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idnobs))) THEN
451 got_var(idnobs)=.true.
452 obs(ng)%pioVar(idnobs)%vd=
var_desc(i)
453 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idotyp))) THEN
454 got_var(idotyp)=.true.
455 obs(ng)%pioVar(idotyp)%vd=
var_desc(i)
456 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idobst))) THEN
457 got_var(idobst)=.true.
458 obs(ng)%pioVar(idobst)%vd=
var_desc(i)
459# ifdef SOLVE3D
460 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idobsd))) THEN
461 got_var(idobsd)=.true.
462 obs(ng)%pioVar(idobsd)%vd=
var_desc(i)
463# endif
464 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idobsx))) THEN
465 got_var(idobsx)=.true.
466 obs(ng)%pioVar(idobsx)%vd=
var_desc(i)
467 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idobsy))) THEN
468 got_var(idobsy)=.true.
469 obs(ng)%pioVar(idobsy)%vd=
var_desc(i)
470# ifdef SOLVE3D
471 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idobsz))) THEN
472 got_var(idobsz)=.true.
473 obs(ng)%pioVar(idobsz)%vd=
var_desc(i)
474# endif
475 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idoerr))) THEN
476 got_var(idoerr)=.true.
477 obs(ng)%pioVar(idoerr)%vd=
var_desc(i)
478 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idoval))) THEN
479 got_var(idoval)=.true.
480 obs(ng)%pioVar(idoval)%vd=
var_desc(i)
481 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idomet))) THEN
482 got_var(idomet)=.true.
483 haveobsmeta(ng)=.true.
484 obs(ng)%pioVar(idomet)%vd=
var_desc(i)
485 END IF
486 END DO
487
488
489
490 IF (.not.got_var(idoday)) THEN
491 IF (master) WRITE (stdout,20) trim(vname(1,idoday)), &
492 & trim(obs(ng)%name)
493 exit_flag=2
494 RETURN
495 END IF
496 IF (.not.got_var(idnobs)) THEN
497 IF (master) WRITE (stdout,20) trim(vname(1,idnobs)), &
498 & trim(obs(ng)%name)
499 exit_flag=2
500 RETURN
501 END IF
502 IF (.not.got_var(idotyp)) THEN
503 IF (master) WRITE (stdout,20) trim(vname(1,idotyp)), &
504 & trim(obs(ng)%name)
505 exit_flag=2
506 RETURN
507 END IF
508 IF (.not.got_var(idobst)) THEN
509 IF (master) WRITE (stdout,20) trim(vname(1,idobst)), &
510 & trim(obs(ng)%name)
511 exit_flag=2
512 RETURN
513 END IF
514# ifdef SOLVE3D
515 IF (.not.got_var(idobsd)) THEN
516 IF (master) WRITE (stdout,20) trim(vname(1,idobsd)), &
517 & trim(obs(ng)%name)
518 exit_flag=2
519 RETURN
520 END IF
521# endif
522 IF (.not.got_var(idobsx)) THEN
523 IF (master) WRITE (stdout,20) trim(vname(1,idobsx)), &
524 & trim(obs(ng)%name)
525 exit_flag=2
526 RETURN
527 END IF
528 IF (.not.got_var(idobsy)) THEN
529 IF (master) WRITE (stdout,20) trim(vname(1,idobsy)), &
530 & trim(obs(ng)%name)
531 exit_flag=2
532 RETURN
533 END IF
534# ifdef SOLVE3D
535 IF (.not.got_var(idobsz)) THEN
536 IF (master) WRITE (stdout,20) trim(vname(1,idobsz)), &
537 & trim(obs(ng)%name)
538 exit_flag=2
539 RETURN
540 END IF
541# endif
542 IF (.not.got_var(idoerr)) THEN
543 IF (master) WRITE (stdout,20) trim(vname(1,idoerr)), &
544 & trim(obs(ng)%name)
545 exit_flag=2
546 RETURN
547 END IF
548 IF (.not.got_var(idoval)) THEN
549 IF (master) WRITE (stdout,20) trim(vname(1,idoval)), &
550 & trim(obs(ng)%name)
551 exit_flag=2
552 RETURN
553 END IF
554 END IF query
555
556
557
558
559
560
561
562
563 IF (backward) THEN
564 ifirst=0
565# ifdef GENERIC_DSTART
566 tend=(time(ng)-ntimes(ng)*dt(ng))*sec2day
567# else
568 tend=(time(ng)-(ntstart(ng)-1)*dt(ng))*sec2day
569# endif
570 DO i=1,nsurvey(ng)
571 IF ((tend.le.fourdvar(ng)%SurveyTime(i)).and. &
572 & (fourdvar(ng)%SurveyTime(i).le.tdays(ng))) THEN
573 ifirst=max(ifirst,i)
574 END IF
575 END DO
576# ifndef SP4DVAR
577 IF (ifirst.eq.0) THEN
578 IF (master) WRITE (stdout,30) tend, tdays(ng)
579 exit_flag=2
580 RETURN
581 END IF
582# endif
583 ELSE
584 ifirst=nsurvey(ng)
585 tend=(time(ng)+ntimes(ng)*dt(ng))*sec2day
586 DO i=1,nsurvey(ng)
587 IF ((tdays(ng).le.fourdvar(ng)%SurveyTime(i)).and. &
588 & (fourdvar(ng)%SurveyTime(i).le.tend)) THEN
589 ifirst=min(ifirst,i)
590 END IF
591 END DO
592# ifndef SP4DVAR
593 IF (ifirst.eq.0) THEN
594 IF (master) WRITE (stdout,30) tdays(ng), tend
595 exit_flag=2
596 RETURN
597 END IF
598# endif
599 END IF
600 obstime(ng)=fourdvar(ng)%SurveyTime(ifirst)*day2sec
601
602
603
604
605
606 IF (backward) THEN
607 obssurvey(ng)=ifirst+1
608 ELSE
609 obssurvey(ng)=ifirst-1
610 END IF
611
612
613
614
615 processobs(ng)=.false.
616
617# ifdef I4DVAR
618
619
620
621
622
623 IF (.not.backward) THEN
624 DO i=0,nobsvar(ng)
625 fourdvar(ng)%ObsCost(i)=0.0_r8
626 END DO
627 END IF
628# endif
629
630
631
632 IF (backward) THEN
633 nstrobs(ng)=0
634 nendobs(ng)=0
635 DO i=1,ifirst
636 nstrobs(ng)=nstrobs(ng)+fourdvar(ng)%NobsSurvey(i)
637 END DO
638 nstrobs(ng)=nstrobs(ng)+1
639 ELSE
640 IF (ifirst.eq.1) THEN
641 nstrobs(ng)=0
642 nendobs(ng)=0
643 ELSE
644 nstrobs(ng)=0
645 nendobs(ng)=0
646 DO i=1,ifirst-1
647 nendobs(ng)=nendobs(ng)+fourdvar(ng)%NobsSurvey(i)
648 END DO
649 END IF
650 END IF
651
652
653
654
655 fourdvar(ng)%ObsCount(0)=0
656 fourdvar(ng)%ObsReject(0)=0
657
658# ifdef WEAK_CONSTRAINT
659
660
661
662 DO i=1,mobs
663 nlmodval(i)=inival
664 obsvetting(i)=inival
665# ifndef SP4DVAR
666 tlmodval(i)=inival
667# endif
668# if defined SP4DVAR && defined DISJOINTED && \
669 defined concurrent_kernel
670 tlmodval(i)=inival
671# endif
672 END DO
673# if defined SP4DVAR && defined DISJOINTED && \
674
675 IF (model.ne.iadm) THEN
676 DO i=1,mobs
677 tlmodval(i)=inival
678 END DO
679 END IF
680# endif
681# endif
682
683 10 FORMAT (/,' OBS_INITIAL_PIO - unable to open input NetCDF', &
684 & ' file: ',a)
685 20 FORMAT (/,' OBS_INITIAL_PIO - unable to find model variable:', &
686 & 1x,a,/,20x,'in input NetCDF file: ',a)
687 30 FORMAT (/,' OBS_INITIAL_PIO - No are observations available', &
688 & ' for time window (days): ',/,12x,f12.4,' - ',f12.4,/)
689
690 RETURN
type(var_desc_t), dimension(:), pointer var_desc
subroutine, public pio_netcdf_inq_var(ng, model, ncname, piofile, myvarname, searchvar, piovar, nvardim, nvaratt)
subroutine, public pio_netcdf_open(ng, model, ncname, omode, piofile)