Check output timing for each variable.
And if current time is timing of open/close of files, they are done in this subroutine.
454 use dc_date,
only:
operator(==),
operator(>),
operator(<), &
456 & evalsec
457 implicit none
458 real(DP), intent(in):: time
459
460 integer, intent(out):: stime_index
461
462 integer:: tstep
463 integer:: stat, i, startnum, endnum
464 character(STRING):: cause_c
465 character(*), parameter:: subname = "HstVarsOutputCheck"
466 real(DP), parameter:: time_eps = epsilon(1.0_dp)
467 continue
470 cause_c = ""
471
472
473
474
475 timestepsearch: do
476 do i = saved_tstep, checked_tstepnum
477 if ( abs(saved_time(i) - time) <= &
478 & time_eps * max(1.0_dp, abs(time), abs(saved_time(i))) ) then
479 tstep = i
480 exit timestepsearch
481 end if
482 end do
483 do i = 1, saved_tstep - 1
484 if ( abs(saved_time(i) - time) <= &
485 & time_eps * max(1.0_dp, abs(time), abs(saved_time(i))) ) then
486 tstep = i
487 exit timestepsearch
488 end if
489 end do
490
491 tstep = 0
492 exit timestepsearch
493 end do timestepsearch
494
495 saved_tstep = tstep
496
497 if ( saved_tstep /= 0 .and. checked_tstep_varnum == numvars ) then
498
499
500
501 stime_index = saved_tstep
502 call dbgmessage(
'saved_tstep=<%d> is already checked.', &
503 & i =(/ saved_tstep /) )
504 goto 999
505 end if
506
507
508
509
510 if ( saved_tstep /= 0 ) then
511 startnum = checked_tstep_varnum + 1
512 endnum = numvars
513
514 stime_index = saved_tstep
515 else
516 startnum = 1
517 endnum = numvars
518
519 if ( save_tstepnum < 2 ) then
520 checked_tstepnum = 1
521 saved_time(checked_tstepnum) = time
522
523 saved_tstep = checked_tstepnum
524 stime_index = saved_tstep
525
526 elseif ( .not. checked_tstepnum < save_tstepnum ) then
527 create_timing_vars(:,1:checked_tstepnum-1) = create_timing_vars(:,2:checked_tstepnum)
528 close_timing_vars(:,1:checked_tstepnum-1) = close_timing_vars(:,2:checked_tstepnum)
529 renew_timing_vars(:,1:checked_tstepnum-1) = renew_timing_vars(:,2:checked_tstepnum)
530 output_timing_vars(:,1:checked_tstepnum-1) = output_timing_vars(:,2:checked_tstepnum)
531 output_timing_avr_vars(:,1:checked_tstepnum-1) = output_timing_avr_vars(:,2:checked_tstepnum)
532
533 saved_time(1:checked_tstepnum-1) = saved_time(2:checked_tstepnum)
534 saved_time(checked_tstepnum) = time
535
536 saved_tstep = checked_tstepnum
537 stime_index = saved_tstep
538
539 else
540 checked_tstepnum = checked_tstepnum + 1
541 saved_time(checked_tstepnum) = time
542
543 saved_tstep = checked_tstepnum
544 stime_index = saved_tstep
545 end if
546 end if
547
548 call dbgmessage(
'numvar=<%d:%d> in saved_tstep=<%d> will be checked from now.', &
549 & i =(/ startnum, endnum, saved_tstep /) )
550
551
552
553
554
555
556
557
558
559
560 create_timing_vars(startnum:endnum, checked_tstepnum:checked_tstepnum) = .false.
561 close_timing_vars(startnum:endnum, checked_tstepnum:checked_tstepnum) = .false.
562 renew_timing_vars(startnum:endnum, checked_tstepnum:checked_tstepnum) = .false.
563 output_timing_vars(startnum:endnum, checked_tstepnum:checked_tstepnum) = .false.
564 output_timing_avr_vars(startnum:endnum, checked_tstepnum:checked_tstepnum) = .false.
565
566 do i = startnum, endnum
567
568 if ( .not. output_valid_vars(i) ) cycle
569
570 if ( origin_time_vars(i) > time ) cycle
571
572 if ( origin_time_vars(i) <= time &
573 & .and. ( terminus_time_vars(i) < zero_time &
574 & .or. terminus_time_vars(i) >= time ) &
575 & .and. .not. histaddvar_vars(i) ) then
576
577 create_timing_vars(i,checked_tstepnum) = .true.
578
579 if ( newfile_inttime_vars(i) > zero_time ) then
580 newfile_createtime_vars(i) = time
581 end if
582
583 output_timing_vars(i,checked_tstepnum) = .true.
584 output_timing_avr_vars(i,checked_tstepnum) = tavr_vars(i)
585 cycle
586 end if
587
588 if ( terminus_time_vars(i) > zero_time .and. terminus_time_vars(i) < time ) then
589 close_timing_vars(i,checked_tstepnum) = .true.
590 output_timing_vars(i,checked_tstepnum) = .false.
591 output_timing_avr_vars(i,checked_tstepnum) = .false.
592 cycle
593 end if
594
595
596
597
598
599
600
601 if ( newfile_inttime_vars(i) > zero_time ) then
602 if ( time - newfile_createtime_vars(i) >= newfile_inttime_vars(i) ) then
603 renew_timing_vars(i,checked_tstepnum) = .true.
604
605 output_timing_vars(i,checked_tstepnum) = .true.
606 output_timing_avr_vars(i,checked_tstepnum) = tavr_vars(i)
607
608 cycle
609 end if
610 end if
611
612 if ( time - prev_outtime_vars(i) >= interval_time_vars(i) ) then
613 output_timing_vars(i,checked_tstepnum) = .true.
614 output_timing_avr_vars(i,checked_tstepnum) = tavr_vars(i)
615 cycle
616 end if
617
618 output_timing_vars(i,checked_tstepnum) = .false.
619 output_timing_avr_vars(i,checked_tstepnum) = tavr_vars(i)
620
621 end do
622
623 checked_tstep_varnum = numvars
624
625999 continue
626 call storeerror(stat, subname, cause_c = cause_c)
subroutine dcdifftimeputline(diff, unit, indent)
subroutine historyclose(history, quiet, err)
Derived types and parameters for date and time.
Date and time manipulation module.
subroutine, public storeerror(number, where, err, cause_c, cause_i)
integer, parameter, public dc_noerr
Error storage variables
subroutine, public dbgmessage(fmt, i, r, d, l, n, c1, c2, c3, ca)
subroutine, public beginsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca, version)
subroutine, public endsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca)