29 public :: file_external_input_update
31 interface file_external_input_update
35 end interface file_external_input_update
38 subroutine get_dims1d( &
44 integer,
intent(out) :: dim1_size
45 integer,
intent(out) :: dim1_max
46 integer,
intent(out) :: dim1_S
47 character(len=*),
intent(in) :: varname
48 character(len=*),
intent(in) :: axistype
49 end subroutine get_dims1d
51 subroutine get_dims2d( &
61 integer,
intent(out) :: dim1_size
62 integer,
intent(out) :: dim1_max
63 integer,
intent(out) :: dim1_S
64 integer,
intent(out) :: dim2_size
65 integer,
intent(out) :: dim2_max
66 integer,
intent(out) :: dim2_S
67 logical,
intent(out) :: transpose
68 character(len=*),
intent(in) :: varname
69 character(len=*),
intent(in) :: axistype
70 end subroutine get_dims2d
72 subroutine get_dims3d( &
85 integer,
intent(out) :: dim1_size
86 integer,
intent(out) :: dim1_max
87 integer,
intent(out) :: dim1_S
88 integer,
intent(out) :: dim2_size
89 integer,
intent(out) :: dim2_max
90 integer,
intent(out) :: dim2_S
91 integer,
intent(out) :: dim3_size
92 integer,
intent(out) :: dim3_max
93 integer,
intent(out) :: dim3_S
94 logical,
intent(out) :: transpose
95 character(len=*),
intent(in) :: varname
96 character(len=*),
intent(in) :: axistype
97 end subroutine get_dims3d
99 subroutine read1d( fid, varname, dim_type, &
103 integer,
intent(in) :: fid
104 character(len=*),
intent(in) :: varname
105 character(len=*),
intent(in) :: dim_type
106 real(RP),
intent(out) :: var(:)
107 integer,
intent(in),
optional :: step
108 end subroutine read1d
110 subroutine read2d( fid, varname, dim_type, &
114 integer,
intent(in) :: fid
115 character(len=*),
intent(in) :: varname
116 character(len=*),
intent(in) :: dim_type
117 real(RP),
intent(out) :: var(:,:)
118 integer,
intent(in),
optional :: step
119 end subroutine read2d
121 subroutine read3d( fid, varname, dim_type, &
125 integer,
intent(in) :: fid
126 character(len=*),
intent(in) :: varname
127 character(len=*),
intent(in) :: dim_type
128 real(RP),
intent(out) :: var(:,:,:)
129 integer,
intent(in),
optional :: step
130 end subroutine read3d
155 private :: file_external_input_time_advance
161 integer,
private,
parameter :: i_prev = 1
162 integer,
private,
parameter :: i_next = 2
164 integer,
private,
parameter :: i_periodic_year = 1
165 integer,
private,
parameter :: i_periodic_month = 2
166 integer,
private,
parameter :: i_periodic_day = 3
168 integer,
private,
parameter :: file_external_input_item_limit = 1000
169 integer,
private,
parameter :: file_external_input_step_limit = 10000
170 integer,
private,
parameter :: file_external_input_dim_limit = 3
171 integer,
private,
parameter :: file_external_input_att_limit = 10
173 type,
private :: itemcontainer
174 character(len=H_SHORT) :: varname
176 integer :: file_current
177 character(len=H_LONG),
allocatable :: basename(:)
180 integer :: dim_size(file_external_input_dim_limit)
181 integer :: dim_start(file_external_input_dim_limit)
182 integer :: var_start(file_external_input_dim_limit)
183 integer :: step_limit
185 real(
dp),
allocatable :: time(:)
186 logical :: fixed_step
187 integer :: flag_periodic
189 integer :: data_step_prev
190 integer :: data_step_next
191 integer :: data_step_offset
192 real(
rp),
allocatable ::
value(:,:,:,:)
193 character(len=H_SHORT) :: axistype
196 logical :: allow_missing
197 end type itemcontainer
199 integer,
private :: file_external_input_item_count = 0
200 type(itemcontainer),
private :: file_external_input_item(file_external_input_item_limit)
215 character(len=H_LONG) :: basename
216 logical :: basename_add_num
217 integer :: number_of_files
218 character(len=H_SHORT) :: varname
219 character(len=H_SHORT) :: axistype
220 integer :: step_limit
221 integer :: step_fixed
222 logical :: enable_periodic_year
223 logical :: enable_periodic_month
224 logical :: enable_periodic_day
227 logical :: check_coordinates
229 logical :: allow_missing
231 namelist / external_item / &
239 enable_periodic_year, &
240 enable_periodic_month, &
241 enable_periodic_day, &
253 log_info(
"FILE_EXTERNAL_INPUT_setup",*)
'Setup'
257 do count = 1, file_external_input_item_limit
259 step_limit = file_external_input_step_limit
261 basename_add_num = .false.
266 enable_periodic_year = .false.
267 enable_periodic_month = .false.
268 enable_periodic_day = .false.
271 check_coordinates = .false.
273 allow_missing = .false.
279 elseif( ierr > 0 )
then
280 log_error(
"FILE_EXTERNAL_INPUT_setup",*)
'Not appropriate names in namelist EXTERNAL_ITEM. Check!', count
283 log_nml(external_item)
290 enable_periodic_year, &
291 enable_periodic_month, &
292 enable_periodic_day, &
296 check_coordinates = check_coordinates, &
298 allow_missing = allow_missing, &
299 step_limit = step_limit )
313 enable_periodic_year, &
314 enable_periodic_month, &
315 enable_periodic_day, &
329 file_get_all_datainfo, &
348 file_cartesc_check_coordinates
351 character(len=*),
intent(in) :: basename
352 logical,
intent(in) :: basename_add_num
353 integer,
intent(in) :: number_of_files
354 character(len=*),
intent(in) :: varname
355 character(len=*),
intent(in) :: axistype
356 integer,
intent(in) :: step_fixed
357 logical,
intent(in) :: enable_periodic_year
358 logical,
intent(in) :: enable_periodic_month
359 logical,
intent(in) :: enable_periodic_day
360 real(
rp),
intent(in) :: offset
361 real(
rp),
intent(in) :: defval
363 logical,
intent(in),
optional :: check_coordinates
364 logical,
intent(in),
optional :: aggregate
365 logical,
intent(in),
optional :: allow_missing
366 integer,
intent(in),
optional :: step_limit
367 logical,
intent(out),
optional :: exist
370 character(len=H_MID) :: description
371 character(len=H_SHORT) :: unit
372 character(len=H_MID) :: standard_name
375 character(len=H_SHORT) :: dim_name (file_external_input_dim_limit)
376 integer :: dim_size (file_external_input_dim_limit)
377 integer :: var_size (file_external_input_dim_limit)
379 character(len=H_SHORT) :: att_name (file_external_input_att_limit)
380 integer :: att_type (file_external_input_att_limit)
381 integer :: att_len (file_external_input_att_limit)
382 real(
dp) :: time_start(file_external_input_step_limit)
383 real(
dp) :: time_end (file_external_input_step_limit)
384 character(len=H_MID) :: time_units
385 character(len=H_SHORT) :: calendar
387 integer :: datadate(6)
388 real(
dp) :: datasubsec
391 integer :: offset_year
393 integer :: dim1_size, dim1_max, dim1_s
394 integer :: dim2_size, dim2_max, dim2_s
395 integer :: dim3_size, dim3_max, dim3_s
397 integer :: step_limit_
398 logical :: aggregate_
399 logical :: allow_missing_
401 character(len=H_LONG) :: filename
407 if (
present(step_limit) )
then
408 if ( step_limit > 0 )
then
409 step_limit_ = step_limit
411 step_limit_ = file_external_input_step_limit
414 step_limit_ = file_external_input_step_limit
417 if (
present(aggregate) )
then
418 aggregate_ = aggregate
423 if (
present(allow_missing) )
then
424 allow_missing_ = allow_missing
426 allow_missing_ = .false.
429 do nid = 1, file_external_input_item_count
430 if ( file_external_input_item(nid)%varname == varname )
then
431 log_error(
"FILE_EXTERNAL_INPUT_regist",*)
'Data is already registered! basename,varname = ', trim(basename),
', ', trim(varname)
436 file_external_input_item_count = file_external_input_item_count + 1
438 if ( file_external_input_item_count > file_external_input_item_limit )
then
439 log_error(
"FILE_EXTERNAL_INPUT_regist",*)
'Number of EXT data exceedes the limit', file_external_input_item_count, file_external_input_item_limit
443 if ( number_of_files > 1 .or. basename_add_num )
then
444 filename = trim(basename) //
'_00000'
451 aggregate=aggregate_, &
455 call file_get_all_datainfo( fid, varname, &
457 description, unit, standard_name, &
459 dim_rank, dim_name(:), dim_size(:), &
460 natts, att_name(:), att_type(:), att_len(:), &
461 time_start(1:step_limit_), time_end(1:step_limit_), &
462 time_units, calendar )
464 if ( step_nmax > 0 )
then
465 if (
present(exist) )
then
469 if (
present(exist) )
then
473 log_error(
"FILE_EXTERNAL_INPUT_regist",*)
'Data not found! filename,varname = ', trim(filename),
', ', trim(varname)
483 nid = file_external_input_item_count
485 file_external_input_item(nid)%nfile = number_of_files
486 file_external_input_item(nid)%file_current = 1
487 file_external_input_item(nid)%data_step_offset = 0
489 allocate( file_external_input_item(nid)%basename(number_of_files) )
490 if ( number_of_files > 1 .or. basename_add_num )
then
491 do n = 1, number_of_files
492 write(filename,
'(A,A,I5.5)') trim(basename),
'_', n - 1
493 file_external_input_item(nid)%basename(n) = filename
496 file_external_input_item(nid)%basename(1) = basename
500 file_external_input_item(nid)%fid = fid
501 file_external_input_item(nid)%varname = varname
502 file_external_input_item(nid)%axistype = axistype
503 file_external_input_item(nid)%ndim = dim_rank
504 file_external_input_item(nid)%step_num = step_nmax
505 file_external_input_item(nid)%step_limit = step_limit_
506 file_external_input_item(nid)%allow_missing = allow_missing_
507 file_external_input_item(nid)%aggregate = aggregate_
510 select case ( dim_rank )
516 if ( aggregate_ )
then
517 dim_size(1) = dim1_max
518 var_size(1) = dim1_size
519 file_external_input_item(nid)%var_start(1) = dim1_s
521 if ( dim1_max /= dim_size(1) )
then
522 log_error(
"FILE_EXTERNAL_INPUT_regist",*)
'data length does not match! ', trim(axistype),
' item:', trim(varname)
523 log_error_cont(*)
'dim 1 (data,requested) : ', dim_size(1), dim1_max
526 var_size(1) = dim1_max
527 file_external_input_item(nid)%var_start(1) = 1
530 file_external_input_item(nid)%transpose = .false.
531 file_external_input_item(nid)%dim_start(1) = dim1_s
536 dim2_size, dim2_max, dim2_s, &
537 file_external_input_item(nid)%transpose, &
540 if ( aggregate_ )
then
541 dim_size(1) = dim1_max
542 var_size(1) = dim1_size
543 dim_size(2) = dim2_max
544 var_size(2) = dim2_size
545 file_external_input_item(nid)%var_start(1) = dim1_s
546 file_external_input_item(nid)%var_start(1) = dim2_s
548 if ( dim1_max /= dim_size(1) &
549 .OR. dim2_max /= dim_size(2) )
then
550 log_error(
"FILE_EXTERNAL_INPUT_regist",*)
'data length does not match! ', trim(axistype),
' item:', trim(varname)
551 log_error_cont(*)
'dim 1 (data,requested) : ', dim_size(1), dim1_max
552 log_error_cont(*)
'dim 2 (data,requested) : ', dim_size(2), dim2_max
555 var_size(1) = dim1_max
556 var_size(2) = dim2_max
557 file_external_input_item(nid)%var_start(1) = 1
558 file_external_input_item(nid)%var_start(1) = 1
561 file_external_input_item(nid)%dim_start(1) = dim1_s
562 file_external_input_item(nid)%dim_start(2) = dim2_s
567 dim2_size, dim2_max, dim2_s, &
568 dim3_size, dim3_max, dim3_s, &
569 file_external_input_item(nid)%transpose, &
572 if ( aggregate_ )
then
573 dim_size(1) = dim1_max
574 var_size(1) = dim1_size
575 dim_size(2) = dim2_max
576 var_size(2) = dim2_size
577 dim_size(3) = dim3_max
578 var_size(3) = dim3_size
579 file_external_input_item(nid)%var_start(1) = dim1_s
580 file_external_input_item(nid)%var_start(2) = dim2_s
581 file_external_input_item(nid)%var_start(3) = dim3_s
583 if ( dim1_max /= dim_size(1) &
584 .OR. dim2_max /= dim_size(2) &
585 .OR. dim3_max /= dim_size(3) )
then
586 log_error(
"FILE_EXTERNAL_INPUT_regist",*)
'data length does not match! ', trim(axistype),
' item:', trim(varname)
587 log_error_cont(*)
'dim 1 (data,requested) : ', dim_size(1), dim1_max
588 log_error_cont(*)
'dim 2 (data,requested) : ', dim_size(2), dim2_max
589 log_error_cont(*)
'dim 3 (data,requested) : ', dim_size(3), dim3_max
592 var_size(1) = dim1_max
593 var_size(2) = dim2_max
594 var_size(3) = dim3_max
595 file_external_input_item(nid)%var_start(1) = 1
596 file_external_input_item(nid)%var_start(2) = 1
597 file_external_input_item(nid)%var_start(3) = 1
600 file_external_input_item(nid)%dim_start(1) = dim1_s
601 file_external_input_item(nid)%dim_start(2) = dim2_s
602 file_external_input_item(nid)%dim_start(3) = dim3_s
605 log_error(
"FILE_EXTERNAL_INPUT_regist",*)
'Unexpected dim rank: ', dim_rank
609 file_external_input_item(nid)%dim_size(:) = dim_size(:)
612 if ( enable_periodic_day )
then
613 file_external_input_item(nid)%flag_periodic = i_periodic_day
614 elseif( enable_periodic_month )
then
615 file_external_input_item(nid)%flag_periodic = i_periodic_month
616 elseif( enable_periodic_year )
then
617 file_external_input_item(nid)%flag_periodic = i_periodic_year
619 file_external_input_item(nid)%flag_periodic = 0
622 allocate( file_external_input_item(nid)%value(var_size(1),var_size(2),var_size(3),2) )
625 file_external_input_item(nid)%value(:,:,:,:) = defval
626 file_external_input_item(nid)%offset = offset
628 allocate( file_external_input_item(nid)%time(step_limit_) )
629 file_external_input_item(nid)%time(:) = 0.0_dp
631 do n = 1, file_external_input_item(nid)%step_num
635 if ( file_external_input_item(nid)%step_num == 1 )
then
637 file_external_input_item(nid)%fixed_step = .true.
638 file_external_input_item(nid)%data_step_prev = 1
639 file_external_input_item(nid)%data_step_next = 1
641 else if ( step_fixed > 0 )
then
643 file_external_input_item(nid)%fixed_step = .true.
644 file_external_input_item(nid)%data_step_prev = step_fixed
645 file_external_input_item(nid)%data_step_next = step_fixed
649 file_external_input_item(nid)%fixed_step = .false.
652 file_external_input_item(nid)%data_step_next = 1
653 do n = 1, file_external_input_item(nid)%step_num
654 if ( file_external_input_item(nid)%time(n) >
time_nowdaysec )
exit
655 file_external_input_item(nid)%data_step_next = n + 1
658 file_external_input_item(nid)%data_step_prev = file_external_input_item(nid)%data_step_next - 1
660 if ( file_external_input_item(nid)%flag_periodic > 0 )
then
662 if ( file_external_input_item(nid)%data_step_next == 1 )
then
665 file_external_input_item(nid)%data_step_prev = file_external_input_item(nid)%step_num
667 elseif( file_external_input_item(nid)%data_step_next == file_external_input_item(nid)%step_num+1 )
then
670 file_external_input_item(nid)%data_step_next = 1
673 do n = 1, file_external_input_item(nid)%step_num
675 datasec = file_external_input_item(nid)%time(n)
685 if ( file_external_input_item(nid)%flag_periodic == i_periodic_day )
then
687 elseif( file_external_input_item(nid)%flag_periodic == i_periodic_month )
then
689 elseif( file_external_input_item(nid)%flag_periodic == i_periodic_year )
then
702 log_info(
"FILE_EXTERNAL_INPUT_regist",*)
'data time is updated.'
707 if ( file_external_input_item(nid)%data_step_next == 1 &
708 .OR. file_external_input_item(nid)%data_step_next == file_external_input_item(nid)%step_num+1 )
then
709 log_error(
"FILE_EXTERNAL_INPUT_regist",*)
'Current time is out of period of external data! ', trim(varname)
718 log_info(
"FILE_EXTERNAL_INPUT_regist",
'(1x,A,A15)')
'Initial read of external data : ', trim(varname)
720 select case ( dim_rank )
724 log_info(
"FILE_EXTERNAL_INPUT_regist",
'(1x,A,A,A,I4,A)') &
725 'Read 1D var : ', trim(file_external_input_item(nid)%varname), &
726 ' (step= ', file_external_input_item(nid)%data_step_prev,
')'
728 if ( file_external_input_item(nid)%aggregate )
then
730 file_external_input_item(nid)%varname, &
731 file_external_input_item(nid)%axistype, &
732 file_external_input_item(nid)%value(:,1,1,i_prev), &
733 step=file_external_input_item(nid)%data_step_prev )
735 call file_read( file_external_input_item(nid)%fid, &
736 file_external_input_item(nid)%varname, &
737 file_external_input_item(nid)%value(:,1,1,i_prev), &
738 step=file_external_input_item(nid)%data_step_prev )
742 log_info(
"FILE_EXTERNAL_INPUT_regist",
'(1x,A,A,A,I4,A)') &
743 'Read 1D var : ', trim(file_external_input_item(nid)%varname), &
744 ' (step= ', file_external_input_item(nid)%data_step_next,
')'
746 if ( file_external_input_item(nid)%aggregate )
then
748 file_external_input_item(nid)%varname, &
749 file_external_input_item(nid)%axistype, &
750 file_external_input_item(nid)%value(:,1,1,i_next), &
751 step=file_external_input_item(nid)%data_step_next )
753 call file_read( file_external_input_item(nid)%fid, &
754 file_external_input_item(nid)%varname, &
755 file_external_input_item(nid)%value(:,1,1,i_next), &
756 step=file_external_input_item(nid)%data_step_next )
762 log_info(
"FILE_EXTERNAL_INPUT_regist",
'(1x,A,A,A,I4,A)') &
763 'Read 2D var : ', trim(file_external_input_item(nid)%varname), &
764 ' (step= ', file_external_input_item(nid)%data_step_prev,
')'
766 if ( file_external_input_item(nid)%aggregate )
then
768 file_external_input_item(nid)%varname, &
769 file_external_input_item(nid)%axistype, &
770 file_external_input_item(nid)%value(:,:,1,i_prev), &
771 step=file_external_input_item(nid)%data_step_prev )
773 call file_read( file_external_input_item(nid)%fid, &
774 file_external_input_item(nid)%varname, &
775 file_external_input_item(nid)%value(:,:,1,i_prev), &
776 step=file_external_input_item(nid)%data_step_prev )
779 log_info(
"FILE_EXTERNAL_INPUT_regist",
'(1x,A,A,A,I4,A)') &
780 'Read 2D var : ', trim(file_external_input_item(nid)%varname), &
781 ' (step= ', file_external_input_item(nid)%data_step_next,
')'
783 if ( file_external_input_item(nid)%aggregate )
then
785 file_external_input_item(nid)%varname, &
786 file_external_input_item(nid)%axistype, &
787 file_external_input_item(nid)%value(:,:,1,i_next), &
788 step=file_external_input_item(nid)%data_step_next )
790 call file_read( file_external_input_item(nid)%fid, &
791 file_external_input_item(nid)%varname, &
792 file_external_input_item(nid)%value(:,:,1,i_next), &
793 step=file_external_input_item(nid)%data_step_next )
799 log_info(
"FILE_EXTERNAL_INPUT_regist",
'(1x,A,A,A,I4,A)') &
800 'Read 3D var : ', trim(file_external_input_item(nid)%varname), &
801 ' (step= ', file_external_input_item(nid)%data_step_prev,
')'
803 if ( file_external_input_item(nid)%aggregate )
then
805 file_external_input_item(nid)%varname, &
806 file_external_input_item(nid)%axistype, &
807 file_external_input_item(nid)%value(:,:,:,i_prev), &
808 step=file_external_input_item(nid)%data_step_prev )
810 call file_read( file_external_input_item(nid)%fid, &
811 file_external_input_item(nid)%varname, &
812 file_external_input_item(nid)%value(:,:,:,i_prev), &
813 step=file_external_input_item(nid)%data_step_prev )
817 log_info(
"FILE_EXTERNAL_INPUT_regist",
'(1x,A,A,A,I4,A)') &
818 'Read 3D var : ', trim(file_external_input_item(nid)%varname), &
819 ' (step= ', file_external_input_item(nid)%data_step_next,
')'
821 if ( file_external_input_item(nid)%aggregate )
then
823 file_external_input_item(nid)%varname, &
824 file_external_input_item(nid)%axistype, &
825 file_external_input_item(nid)%value(:,:,:,i_next), &
826 step=file_external_input_item(nid)%data_step_next )
828 call file_read( file_external_input_item(nid)%fid, &
829 file_external_input_item(nid)%varname, &
830 file_external_input_item(nid)%value(:,:,:,i_next), &
831 step=file_external_input_item(nid)%data_step_next )
835 log_error(
"FILE_EXTERNAL_INPUT_regist",*)
'Unexpected dim rank: ', dim_rank
839 if (
present(check_coordinates) )
then
840 if ( check_coordinates )
then
841 call file_cartesc_check_coordinates( fid, &
842 atmos = file_external_input_item(nid)%ndim==3, &
843 transpose = file_external_input_item(nid)%transpose )
863 character(len=*),
intent(in) :: varname
864 real(DP),
intent(in) :: time_current
865 real(RP),
intent(out) :: var(:)
866 logical,
intent(out) :: error
870 logical :: do_readfile
880 do n = 1, file_external_input_item_count
881 if( varname == file_external_input_item(n)%varname ) nid = n
885 log_info(
"FILE_EXTERNAL_INPUT_update_1D",*)
'Variable was not registered: ', trim(varname)
890 if ( file_external_input_item(nid)%ndim /= 1 )
then
891 log_info(
"FILE_EXTERNAL_INPUT_update_1D",*)
'Data is not 1D var: ', trim(file_external_input_item(nid)%varname)
896 call file_external_input_time_advance( nid, &
901 if ( do_readfile )
then
902 step_next = file_external_input_item(nid)%data_step_next - file_external_input_item(nid)%data_step_offset
904 log_info(
"FILE_EXTERNAL_INPUT_update_1D",
'(1x,A,A,A,I4,A,I4,A)') &
905 'Read 1D var : ', trim(file_external_input_item(nid)%varname), &
906 ' (step= ', file_external_input_item(nid)%data_step_next,
', file step=', step_next,
')'
909 file_external_input_item(nid)%value(:,:,:,i_prev) = file_external_input_item(nid)%value(:,:,:,i_next)
912 if ( file_external_input_item(nid)%aggregate )
then
914 file_external_input_item(nid)%varname, &
915 file_external_input_item(nid)%axistype, &
916 file_external_input_item(nid)%value(:,1,1,i_next), &
917 step=file_external_input_item(nid)%data_step_next )
919 call file_read( file_external_input_item(nid)%fid, &
920 file_external_input_item(nid)%varname, &
921 file_external_input_item(nid)%value(:,1,1,i_next), &
929 do n1 = 1, file_external_input_item(nid)%dim_size(1)
930 nn1 = n1 + file_external_input_item(nid)%dim_start(1) - 1
932 if ( abs( file_external_input_item(nid)%value(n1,1,1,i_prev) - undef ) > abs( undef * 0.1_rp ) &
933 .and. abs( file_external_input_item(nid)%value(n1,1,1,i_next) - undef ) > abs( undef * 0.1_rp ) )
then
934 var(nn1) = ( 1.0_rp-weight ) * file_external_input_item(nid)%value(n1,1,1,i_prev) &
935 + ( weight ) * file_external_input_item(nid)%value(n1,1,1,i_next)
937 if ( file_external_input_item(nid)%allow_missing )
then
940 log_info(
"FILE_EXTERNAL_INPUT_update_1D",*)
'missing value is found in ', &
941 trim(file_external_input_item(nid)%varname),
' at (',n1,
')'
963 character(len=*),
intent(in) :: varname
964 real(DP),
intent(in) :: time_current
965 real(RP),
intent(out) :: var(:,:)
966 logical,
intent(out) :: error
970 logical :: do_readfile
980 do n = 1, file_external_input_item_count
981 if( varname == file_external_input_item(n)%varname ) nid = n
985 log_info(
"FILE_EXTERNAL_INPUT_update_2D",*)
'Variable was not registered: ', trim(varname)
990 if ( file_external_input_item(nid)%ndim /= 2 )
then
991 log_info(
"FILE_EXTERNAL_INPUT_update_2D",*)
'Data is not 2D var: ', trim(file_external_input_item(nid)%varname)
996 call file_external_input_time_advance( nid, &
1001 if ( do_readfile )
then
1003 step_next = file_external_input_item(nid)%data_step_next - file_external_input_item(nid)%data_step_offset
1005 log_info(
"FILE_EXTERNAL_INPUT_update_2D",
'(1x,A,A,A,I4,A,I4,A)') &
1006 'Read 2D var : ', trim(file_external_input_item(nid)%varname), &
1007 ' (step= ', file_external_input_item(nid)%data_step_next,
', file step=', step_next,
')'
1010 file_external_input_item(nid)%value(:,:,:,i_prev) = file_external_input_item(nid)%value(:,:,:,i_next)
1013 if ( file_external_input_item(nid)%aggregate )
then
1015 file_external_input_item(nid)%varname, &
1016 file_external_input_item(nid)%axistype, &
1017 file_external_input_item(nid)%value(:,:,1,i_next), &
1018 step=file_external_input_item(nid)%data_step_next )
1020 call file_read( file_external_input_item(nid)%fid, &
1021 file_external_input_item(nid)%varname, &
1022 file_external_input_item(nid)%value(:,:,1,i_next), &
1029 if ( file_external_input_item(nid)%transpose )
then
1031 do n1 = 1, file_external_input_item(nid)%dim_size(1)
1032 nn1 = n1 + file_external_input_item(nid)%dim_start(1) - 1
1034 do n2 = 1, file_external_input_item(nid)%dim_size(2)
1035 nn2 = n2 + file_external_input_item(nid)%dim_start(2) - 1
1037 if ( abs( file_external_input_item(nid)%value(n1,n2,1,i_prev) - undef ) > abs( undef * 0.1_rp ) &
1038 .and. abs( file_external_input_item(nid)%value(n1,n2,1,i_next) - undef ) > abs( undef * 0.1_rp ) )
then
1039 var(nn2,nn1) = ( 1.0_rp-weight ) * file_external_input_item(nid)%value(n1,n2,1,i_prev) &
1040 + ( weight ) * file_external_input_item(nid)%value(n1,n2,1,i_next)
1042 if ( file_external_input_item(nid)%allow_missing )
then
1043 var(nn2,nn1) = undef
1045 log_info(
"FILE_EXTERNAL_INPUT_update_2D",*)
'missing value is found in ', &
1046 trim(file_external_input_item(nid)%varname),
' at (',n1,
',',n2,
')'
1055 do n2 = 1, file_external_input_item(nid)%dim_size(2)
1056 nn2 = n2 + file_external_input_item(nid)%dim_start(2) - 1
1058 do n1 = 1, file_external_input_item(nid)%dim_size(1)
1059 nn1 = n1 + file_external_input_item(nid)%dim_start(1) - 1
1061 if ( abs( file_external_input_item(nid)%value(n1,n2,1,i_prev) - undef ) > abs( undef * 0.1_rp ) &
1062 .and. abs( file_external_input_item(nid)%value(n1,n2,1,i_next) - undef ) > abs( undef * 0.1_rp ) )
then
1063 var(nn1,nn2) = ( 1.0_rp-weight ) * file_external_input_item(nid)%value(n1,n2,1,i_prev) &
1064 + ( weight ) * file_external_input_item(nid)%value(n1,n2,1,i_next)
1066 if ( file_external_input_item(nid)%allow_missing )
then
1067 var(nn1,nn2) = undef
1069 log_info(
"FILE_EXTERNAL_INPUT_update_2D",*)
'missing value is found in ', &
1070 trim(file_external_input_item(nid)%varname),
' at (',n1,
',',n2,
')'
1094 character(len=*),
intent(in) :: varname
1095 real(DP),
intent(in) :: time_current
1096 real(RP),
intent(out) :: var(:,:,:)
1097 logical,
intent(out) :: error
1101 logical :: do_readfile
1102 integer :: step_next
1105 integer :: n1, n2, n3
1106 integer :: nn1, nn2, nn3
1111 do n = 1, file_external_input_item_count
1112 if( varname == file_external_input_item(n)%varname ) nid = n
1115 if ( nid == 0 )
then
1116 log_info(
"FILE_EXTERNAL_INPUT_update_3D",*)
'Variable was not registered: ', trim(varname)
1121 if ( file_external_input_item(nid)%ndim /= 3 )
then
1122 log_info(
"FILE_EXTERNAL_INPUT_update_3D",*)
'Data is not 3D var: ', trim(file_external_input_item(nid)%varname)
1127 call file_external_input_time_advance( nid, &
1132 if ( do_readfile )
then
1134 step_next = file_external_input_item(nid)%data_step_next - file_external_input_item(nid)%data_step_offset
1136 log_info(
"FILE_EXTERNAL_INPUT_update_3D",
'(1x,A,A,A,I4,A,I4,A)') &
1137 'Read 3D var : ', trim(file_external_input_item(nid)%varname), &
1138 ' (step= ', file_external_input_item(nid)%data_step_next,
', file step=', step_next,
')'
1141 file_external_input_item(nid)%value(:,:,:,i_prev) = file_external_input_item(nid)%value(:,:,:,i_next)
1144 if ( file_external_input_item(nid)%aggregate )
then
1146 file_external_input_item(nid)%varname, &
1147 file_external_input_item(nid)%axistype, &
1148 file_external_input_item(nid)%value(:,:,:,i_next), &
1149 step=file_external_input_item(nid)%data_step_next )
1151 call file_read( file_external_input_item(nid)%fid, &
1152 file_external_input_item(nid)%varname, &
1153 file_external_input_item(nid)%value(:,:,:,i_next), &
1160 if ( file_external_input_item(nid)%transpose )
then
1162 do n2 = 1, file_external_input_item(nid)%dim_size(2)
1163 nn2 = n2 + file_external_input_item(nid)%dim_start(2) - 1
1165 do n1 = 1, file_external_input_item(nid)%dim_size(1)
1166 nn1 = n1 + file_external_input_item(nid)%dim_start(1) - 1
1168 do n3 = 1, file_external_input_item(nid)%dim_size(3)
1169 nn3 = n3 + file_external_input_item(nid)%dim_start(3) - 1
1171 if ( abs( file_external_input_item(nid)%value(n1,n2,n3,i_prev) - undef ) > abs( undef * 0.1_rp ) &
1172 .and. abs( file_external_input_item(nid)%value(n1,n2,n3,i_next) - undef ) > abs( undef * 0.1_rp ) )
then
1173 var(nn3,nn1,nn2) = ( 1.0_rp-weight ) * file_external_input_item(nid)%value(n1,n2,n3,i_prev) &
1174 + ( weight ) * file_external_input_item(nid)%value(n1,n2,n3,i_next)
1176 if ( file_external_input_item(nid)%allow_missing )
then
1177 var(nn3,nn1,nn2) = undef
1179 log_info(
"FILE_EXTERNAL_INPUT_update_3D",*)
'missing value is found in ', &
1180 trim(file_external_input_item(nid)%varname),
' at (',n1,
',',n2,
',',n3,
')'
1190 do n3 = 1, file_external_input_item(nid)%dim_size(3)
1191 nn3 = n3 + file_external_input_item(nid)%dim_start(3) - 1
1193 do n2 = 1, file_external_input_item(nid)%dim_size(2)
1194 nn2 = n2 + file_external_input_item(nid)%dim_start(2) - 1
1196 do n1 = 1, file_external_input_item(nid)%dim_size(1)
1197 nn1 = n1 + file_external_input_item(nid)%dim_start(1) - 1
1199 if ( abs( file_external_input_item(nid)%value(n1,n2,n3,i_prev) - undef ) > abs( undef * 0.1_rp ) &
1200 .and. abs( file_external_input_item(nid)%value(n1,n2,n3,i_next) - undef ) > abs( undef * 0.1_rp ) )
then
1201 var(nn1,nn2,nn3) = ( 1.0_rp-weight ) * file_external_input_item(nid)%value(n1,n2,n3,i_prev) &
1202 + ( weight ) * file_external_input_item(nid)%value(n1,n2,n3,i_next)
1204 if ( file_external_input_item(nid)%allow_missing )
then
1205 var(nn1,nn2,nn3) = undef
1207 log_info(
"FILE_EXTERNAL_INPUT_update_3D",*)
'missing value is found in ', &
1208 trim(file_external_input_item(nid)%varname),
' at (',n1,
',',n2,
',',n3,
')'
1223 subroutine file_external_input_time_advance( &
1232 file_get_all_datainfo
1250 integer,
intent(in) :: nid
1251 real(DP),
intent(in) :: time_current
1252 real(RP),
intent(out) :: weight
1253 logical,
intent(out) :: do_readfile
1255 integer :: step_nmax
1256 character(len=H_MID) :: description
1257 character(len=H_SHORT) :: unit
1258 character(len=H_MID) :: standard_name
1261 character(len=H_SHORT) :: dim_name (FILE_EXTERNAL_INPUT_dim_limit)
1262 integer :: dim_size (FILE_EXTERNAL_INPUT_dim_limit)
1264 character(len=H_SHORT) :: att_name (FILE_EXTERNAL_INPUT_att_limit)
1265 integer :: att_type (FILE_EXTERNAL_INPUT_att_limit)
1266 integer :: att_len (FILE_EXTERNAL_INPUT_att_limit)
1267 real(DP) :: time_start(FILE_EXTERNAL_INPUT_step_limit)
1268 real(DP) :: time_end (FILE_EXTERNAL_INPUT_step_limit)
1269 character(len=H_MID) :: time_units
1270 character(len=H_SHORT) :: calendar
1272 integer :: datadate(6)
1273 real(DP) :: datasubsec
1276 integer :: offset_year
1278 real(DP) :: time_prev, time_next
1279 integer :: step_prev, step_next
1285 do_readfile = .false.
1287 if ( file_external_input_item(nid)%fixed_step )
then
1291 if ( time_current > file_external_input_item(nid)%time( file_external_input_item(nid)%data_step_next ) )
then
1293 do_readfile = .true.
1295 log_info(
"FILE_EXTERNAL_INPUT_time_advance",
'(1x,A,A15)')
'Update external input : ', trim(file_external_input_item(nid)%varname)
1298 file_external_input_item(nid)%data_step_prev = file_external_input_item(nid)%data_step_prev + 1
1299 file_external_input_item(nid)%data_step_next = file_external_input_item(nid)%data_step_next + 1
1301 if ( file_external_input_item(nid)%flag_periodic > 0 )
then
1303 if ( file_external_input_item(nid)%data_step_next == file_external_input_item(nid)%step_num+1 )
then
1306 file_external_input_item(nid)%data_step_next = 1
1309 do t = 1, file_external_input_item(nid)%step_num
1311 datasec = file_external_input_item(nid)%time(t)
1321 if ( file_external_input_item(nid)%flag_periodic == i_periodic_day )
then
1323 elseif( file_external_input_item(nid)%flag_periodic == i_periodic_month )
then
1325 elseif( file_external_input_item(nid)%flag_periodic == i_periodic_year )
then
1341 if ( file_external_input_item(nid)%data_step_next == file_external_input_item(nid)%step_num+1 )
then
1343 if ( file_external_input_item(nid)%file_current < file_external_input_item(nid)%nfile )
then
1345 file_external_input_item(nid)%file_current = file_external_input_item(nid)%file_current + 1
1347 call file_open( file_external_input_item(nid)%basename(file_external_input_item(nid)%file_current), &
1352 call file_get_all_datainfo( fid, file_external_input_item(nid)%varname, &
1354 description, unit, standard_name, &
1356 dim_rank, dim_name(:), dim_size(:), &
1357 natts, att_name(:), att_type(:), att_len(:), &
1358 time_start(1:file_external_input_item(nid)%step_limit), &
1359 time_end(1:file_external_input_item(nid)%step_limit), &
1360 time_units, calendar )
1362 if ( step_nmax == 0 )
then
1363 log_error(
"FILE_EXTERNAL_INPUT_time_advance",*)
'Data not found! basename = ', trim(file_external_input_item(nid)%basename(file_external_input_item(nid)%file_current)), &
1364 ', varname = ', trim(file_external_input_item(nid)%varname)
1369 if ( file_external_input_item(nid)%dim_size(n) /= dim_size(n) )
then
1370 log_error(
"FILE_EXTERNAL_INPUT_time_advance",*)
'The size of dimension', n,
' is inconsistent! '
1371 log_error_cont(*)
'size (previous,current) = ', file_external_input_item(nid)%dim_size(n), dim_size(n)
1372 log_error_cont(*)
'basename = ', trim(file_external_input_item(nid)%basename(file_external_input_item(nid)%file_current)), &
1373 ', varname = ', trim(file_external_input_item(nid)%varname)
1379 nn = file_external_input_item(nid)%step_num + n
1383 if ( file_external_input_item(nid)%time(file_external_input_item(nid)%data_step_prev) > file_external_input_item(nid)%time(file_external_input_item(nid)%data_step_next) )
then
1384 log_error(
"FILE_EXTERNAL_INPUT_time_advance",*)
'Time in new file is earlier than last time of previous file! stop'
1385 log_error_cont(*)
'Time (previous,current) = ', file_external_input_item(nid)%time(file_external_input_item(nid)%data_step_prev), &
1386 file_external_input_item(nid)%time(file_external_input_item(nid)%data_step_next)
1387 log_error_cont(*)
'Data not found! basename = ', trim(file_external_input_item(nid)%basename(file_external_input_item(nid)%file_current)), &
1388 ', varname = ', trim(file_external_input_item(nid)%varname)
1392 file_external_input_item(nid)%fid = fid
1393 file_external_input_item(nid)%data_step_offset = file_external_input_item(nid)%step_num
1394 file_external_input_item(nid)%step_num = file_external_input_item(nid)%step_num + step_nmax
1397 log_error(
"FILE_EXTERNAL_INPUT_time_advance",*)
'Current time is out of period of external data! '
1410 if ( file_external_input_item(nid)%fixed_step )
then
1414 elseif( file_external_input_item(nid)%data_step_next == 1 )
then
1416 step_prev = file_external_input_item(nid)%data_step_prev
1417 step_next = file_external_input_item(nid)%data_step_next
1420 datasec = file_external_input_item(nid)%time( step_prev )
1430 if ( file_external_input_item(nid)%flag_periodic == i_periodic_day )
then
1432 elseif( file_external_input_item(nid)%flag_periodic == i_periodic_month )
then
1434 elseif( file_external_input_item(nid)%flag_periodic == i_periodic_year )
then
1445 time_next = file_external_input_item(nid)%time( step_next )
1447 weight = ( time_current - time_prev ) &
1448 / ( time_next - time_prev )
1452 step_prev = file_external_input_item(nid)%data_step_prev
1453 step_next = file_external_input_item(nid)%data_step_next
1455 time_prev = file_external_input_item(nid)%time( step_prev )
1456 time_next = file_external_input_item(nid)%time( step_next )
1458 weight = ( time_current - time_prev ) &
1459 / ( time_next - time_prev )
1464 end subroutine file_external_input_time_advance