652 character(*),
intent(in):: varname
655 real(DP),
intent(in):: time
658 character(TOKEN):: interval_unit
661 real(DP):: origin_value
664 character(TOKEN):: origin_unit
668 real(DP):: origin_sec
669 integer:: newfile_intvalue
670 real(DP):: newfile_intvalued
673 character(TOKEN):: newfile_intunit
677 character(STRING):: file, file_base, file_suffix, file_newfile_time, file_rank
680 integer:: stat,
i, j, k, vnum, numdims_slice, dim_size, cnt
681 character(STRING):: name,
units, longname, cause_c, wgt_name
682 character(TOKEN):: xtype
687 real(DP):: wgt_sum, wgt_sum_s
688 logical:: slice_valid
689 integer:: slice_start(1:
numdims-1)
692 integer:: slice_end(1:
numdims-1)
695 integer:: slice_stride(1:
numdims-1)
699 character(*),
parameter:: subname =
"HstFileCreate" 701 call beginsub(subname,
'varname=%c', c1 = trim(varname) )
711 & varinfo = gthst_vars(
i), &
713 if ( trim(varname) == trim(name) ) vnum =
i 716 if ( vnum == 0 )
then 733 & gthstnml = gthstnml, &
736 & interval_unit = interval_unit )
741 &
units = trim(interval_unit) //
' ' // &
742 & trim(time_unit_suffix) )
748 & gthstnml = gthstnml, &
750 & slice_start = slice_start, &
751 & slice_end = slice_end, &
752 & slice_stride = slice_stride )
759 if ( all( slice_start == (/ ( 1,
i = 1,
numdims -1 ) /) ) &
760 & .and. all( slice_end < (/ ( 1,
i = 1,
numdims -1 ) /) ) &
761 & .and. all( slice_stride == (/ ( 1,
i = 1,
numdims -1 ) /) ) )
then 763 allocate( gthst_axes_slices(1:
numdims) )
767 data_axes_slices => data_axes
768 data_weights_slices => data_weights
769 slice_valid = .false.
772 allocate( gthst_axes_slices(1:
numdims) )
773 allocate( data_axes_slices(1:
numdims) )
774 allocate( data_weights_slices(1:
numdims) )
781 if ( slice_start(
i) < 1 )
then 783 cause_c =
cprintf(
'slice_start=%d', &
784 &
i = (/ slice_start(
i) /) )
788 if ( slice_stride(
i) < 1 )
then 790 cause_c =
cprintf(
'slice_stride=%d', &
791 &
i = (/ slice_stride(
i) /) )
798 if ( ( slice_start(
i) == 1 ) &
799 & .and. ( slice_end(
i) < 1 ) &
800 & .and. ( slice_stride(
i) == 1 ) )
then 803 & axis_dest = gthst_axes_slices(
i) , &
806 data_axes_slices(
i) = data_axes(
i)
818 & longname = longname, &
823 if ( slice_end(
i) < 1 ) slice_end(
i) = dim_size
824 if ( slice_end(
i) > dim_size )
then 826 &
'slice options to (%c) are undesirable ' // &
827 &
'(@slice_end=%d). @slice_end is corrected forcibly to (%d) ', &
829 &
i = (/ slice_end(
i), dim_size /) )
831 slice_end(
i) = dim_size
835 if ( slice_start(
i) > slice_end(
i) )
then 837 cause_c =
cprintf(
'slice_start=%d, slice_end=%d', &
838 &
i = (/ slice_start(
i), slice_end(
i) /) )
842 numdims_slice =
int( ( slice_end(
i) - slice_start(
i) + 1 ) / slice_stride(
i) )
845 if ( numdims_slice < 1 )
then 847 &
'slice options to (%c) are invalid. ' // &
848 &
'(@slice_start=%d @slice_end=%d @slice_stride=%d)', &
850 &
i = (/ slice_start(
i), slice_end(
i), slice_stride(
i) /) )
852 cause_c =
cprintf(
'slice_start=%d, slice_end=%d, slice_stride=%d', &
853 &
i = (/ slice_start(
i), slice_end(
i), slice_stride(
i) /) )
858 & axis = gthst_axes_slices(
i), &
860 &
size = numdims_slice, &
861 & longname = longname, &
869 allocate( data_axes_slices(
i) % a_axis( numdims_slice ) )
871 do j = slice_start(
i), slice_end(
i), slice_stride(
i)
872 data_axes_slices(
i) % a_axis( cnt ) = data_axes(
i) % a_axis( j )
881 & varinfo = gthst_weights(j), &
884 if ( trim(name) // wgtsuf == trim(wgt_name) )
then 889 wgt_sum = sum( data_weights(j) % a_axis )
891 allocate( data_weights_slices(j) % a_axis( numdims_slice ) )
893 do k = slice_start(
i), slice_end(
i), slice_stride(
i)
894 data_weights_slices(j) % a_axis( cnt ) = data_weights(j) % a_axis( k )
898 wgt_sum_s = sum( data_weights_slices(j) % a_axis )
899 data_weights_slices(j) % a_axis = data_weights_slices(j) % a_axis * ( wgt_sum / wgt_sum_s )
911 if ( .not.
associated( data_weights_slices(
i) % a_axis ) )
then 912 allocate( data_weights_slices(
i) % a_axis(
size(data_weights(
i) % a_axis ) ) )
913 data_weights_slices(
i) % a_axis = data_weights(
i) % a_axis
920 gthst_axes_slices(
numdims) = gthst_axes_time
929 & gthstnml = gthstnml, &
932 & origin_value = origin_value, &
933 & origin_unit = origin_unit, &
934 & interval_unit = interval_unit, &
935 & newfile_intvalue = newfile_intvalue, &
936 & newfile_intunit = newfile_intunit )
943 &
real( origin_value, DP ), origin_unit,
'sec', cal_save )
951 if ( newfile_intvalue < 1 )
then 954 & origin_sec,
'sec', interval_unit, cal_save )
968 if ( len_trim( file ) - index(file,
'.nc', .true.) == 2 )
then 969 file_base = file(1:len_trim( file ) - 3)
975 if ( trim(rank_save) ==
'' )
then 978 file_rank =
'_rank' // trim( adjustl(rank_save) )
980 if ( newfile_intvalue > 0 )
then 981 newfile_intvalued = &
984 file_newfile_time = &
985 &
cprintf(
'_time%08d',
i = (/
int( newfile_intvalued ) /) )
988 file_newfile_time =
'' 991 file = trim(file_base) // trim(file_rank) // trim(file_newfile_time) // trim(file_suffix)
997 & history = gthist, &
998 & file = file, title = title_save, &
999 & source = source_save, institution = institution_save, &
1000 & axes = gthst_axes_slices(1:
numdims), &
1001 & origind = origin_value, &
1002 & conventions = conventions_save, &
1003 & gt_version = gt_version_save, &
1004 & flag_mpi_split = save_mpi_split, &
1005 & flag_mpi_gather = save_mpi_gather )
1012 & axis = gthst_axes_slices(
i), &
1015 & history = gthist, &
1017 & array = data_axes_slices(
i) % a_axis )
1023 if ( save_mpi_gather )
then 1026 & axis = gthst_axes_slices(
i), &
1031 &
'data of axis (%c) in whole area is lack. ' // &
1032 &
'Specify the data by "HistoryAutoPutAxisMPI" explicitly.', &
1039 & history = gthist, &
1048 if ( slice_valid )
then 1049 deallocate( gthst_axes_slices )
1050 deallocate( data_axes_slices )
1052 deallocate( gthst_axes_slices )
1053 nullify( data_axes_slices )
1061 & history = gthist, &
1062 & varinfo = gthst_weights(
i) )
1064 & varinfo = gthst_weights(
i), &
1067 & history = gthist, &
1069 & array = data_weights_slices(
i) % a_axis )
1072 if ( slice_valid )
then 1073 deallocate( data_weights_slices )
1075 nullify( data_weights_slices )
1086 & varinfo = gthst_vars(vnum), &
1087 & history = gthist )
1090 call storeerror(stat, subname, cause_c = cause_c)
integer, parameter, public hst_empinoaxisdata
subroutine, public storeerror(number, where, err, cause_c, cause_i)
type(gt_history_axis_data), dimension(1:nf90_max_dims), target, save, public data_axes_whole
integer, parameter, public dc_noerr
integer, parameter, public hst_ebadvarname
character(string) function, public joinchar(carray, expr)
integer, parameter, public hst_ebadslice
type(gt_history_axis), dimension(1:nf90_max_dims), target, save, public gthst_axes
subroutine, public beginsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca, version)
integer, save, public numdims
subroutine, public endsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca)