historycopyvariable.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine historycopyvariable1 (file, varname, history, overwrite)
 

Function/Subroutine Documentation

◆ historycopyvariable1()

subroutine historycopyvariable1 ( character(len = *), intent(in)  file,
character(len = *), intent(in)  varname,
type(gt_history), intent(inout), optional, target  history,
logical, intent(in), optional  overwrite 
)

Definition at line 11 of file historycopyvariable.f90.

References dc_trace::beginsub(), dc_trace::dbgmessage(), gtool_history_internal::default, dc_types::dp, dc_trace::endsub(), dc_url::gt_atmark, dc_present::present_and_false(), dc_types::string, and dc_types::token.

11  !
12  !== 変数定義 (別ファイルの変数コピー)
13  !
14  ! gtool4 データ内の変数の定義を行います。 他の gtool4 データの
15  ! ファイル名とその中の変数名を指定することで、 自動的のその変数の
16  ! 構造や属性をコピーして変数定義します。このサブルーチンを
17  ! 用いる前に、 HistoryCreate による初期設定が必要です。
18  !
19  ! 構造や属性を手動で設定する場合には HistoryAddVariable
20  ! を用いて下さい。
21  !
25  use gtdata_types, only: gt_variable
26  use dc_present, only: present_and_false
27  use dc_url, only: urlmerge, gt_atmark, urlresolve
28  use dc_date, only: dcdifftimecreate
29  use dc_date_types, only: dc_difftime
30  use dc_types, only: string, token, dp
31  use dc_trace, only: beginsub, endsub, dbgmessage
32  implicit none
33  character(len = *), intent(in):: file
34  ! コピーしようとする変数が格納された
35  ! netCDF ファイル名
36  !
37  character(len = *), intent(in):: varname
38  ! コピー元となる変数の名前
39  !
40  ! 定義される変数名もこれと
41  ! 同じになります。
42  ! 最大文字数は dc_types#TOKEN 。
43  !
44  ! 依存する次元が存在しない
45  ! 場合は自動的にその次元に関する
46  ! 変数情報も元のファイルから
47  ! コピーします。
48  ! この場合に「同じ次元」と見
49  ! なされるのは、(1) 無制限次
50  ! 元 (自動的に「時間」と認識
51  ! される)、
52  ! (2) サイズと単位が同じ次元、
53  ! です。
54  !
55  type(gt_history), intent(inout), optional, target:: history
56  ! 出力ファイルの設定に関する情報を
57  ! 格納した構造体
58  !
59  ! ここに指定するものは、
60  ! HistoryCreate によって初期設定
61  ! されていなければなりません。
62  !
63  logical, intent(in), optional:: overwrite
64  ! 上書きの可否の設定
65  !
66  ! この引数に .false. を渡すと、
67  ! 既存のファイルを上書きしません。
68  ! デフォルトは上書きします。
69  !
70 
71  type(gt_history), pointer:: hst =>null()
72  type(gt_variable), pointer:: vwork(:) =>null(), dimvars(:) =>null()
73  type(gt_variable):: copyfrom
74  character(STRING):: fullname, url, copyurl
75  integer, pointer:: count_work(:) =>null()
76  integer, pointer:: var_avr_count_work(:) =>null()
77  integer:: var_avr_length
78  logical, pointer:: var_avr_firstput_work(:) =>null()
79  real(DP), pointer:: var_avr_coefsum_work(:) =>null()
80  real(DP), pointer:: var_avr_baseint_work(:) =>null()
81  real(DP), pointer:: var_avr_prevtime_work(:) =>null()
82 !!$ type(DC_DIFFTIME), pointer:: var_avr_baseint_work(:) =>null()
83 !!$ type(DC_DIFFTIME), pointer:: var_avr_prevtime_work(:) =>null()
84  type(gt_history_avrdata), pointer:: var_avr_data_work(:) =>null()
85  integer:: nvars, numdims, i
86  logical:: growable, overwrite_required
87  character(*), parameter:: subname = "HistoryCopyVariable1"
88  continue
89  call beginsub(subname, 'file=%c varname=%c', &
90  & c1=trim(file), c2=trim(varname))
91  !----- 操作対象決定 -----
92  if (present(history)) then
93  hst => history
94  else
95  hst => default
96  endif
97 
98  !----- 変数表拡張 -----
99  if (associated(hst % vars)) then
100  nvars = size(hst % vars(:))
101  vwork => hst % vars
102  count_work => hst % count
103  nullify(hst % vars, hst % count)
104  allocate(hst % vars(nvars + 1), hst % count(nvars + 1))
105  hst % vars(1:nvars) = vwork(1:nvars)
106  hst % count(1:nvars) = count_work(1:nvars)
107  deallocate(vwork, count_work)
108  count_work => hst % growable_indices
109  nullify(hst % growable_indices)
110  allocate(hst % growable_indices(nvars + 1))
111  hst % growable_indices(1:nvars) = count_work(1:nvars)
112  deallocate(count_work)
113 
114  !
115  ! 平均値出力のための変数表コピー
116  ! Copy table of variables for average value output
117  !
118  var_avr_count_work => hst % var_avr_count
119  nullify( hst % var_avr_count )
120  allocate( hst % var_avr_count(nvars + 1) )
121  hst % var_avr_count(1:nvars) = var_avr_count_work(1:nvars)
122  deallocate( var_avr_count_work )
123 
124  var_avr_data_work => hst % var_avr_data
125  nullify(hst % var_avr_data)
126  allocate(hst % var_avr_data(nvars + 1))
127  do i = 1, nvars
128  hst % var_avr_data(i) % length = var_avr_data_work(i) % length
129  allocate(hst % var_avr_data(i) % &
130  & a_dataavr(var_avr_data_work(i) % length))
131  hst % var_avr_data(i) % a_DataAvr = var_avr_data_work(i) % a_DataAvr
132  end do
133  deallocate( var_avr_data_work )
134 
135  var_avr_firstput_work => hst % var_avr_firstput
136  nullify( hst % var_avr_firstput )
137  allocate( hst % var_avr_firstput(nvars + 1) )
138  hst % var_avr_firstput(1:nvars) = var_avr_firstput_work(1:nvars)
139  deallocate( var_avr_firstput_work )
140 
141  var_avr_coefsum_work => hst % var_avr_coefsum
142  nullify( hst % var_avr_coefsum )
143  allocate( hst % var_avr_coefsum(nvars + 1) )
144  hst % var_avr_coefsum(1:nvars) = var_avr_coefsum_work(1:nvars)
145  deallocate( var_avr_coefsum_work )
146 
147  var_avr_baseint_work => hst % var_avr_baseint
148  nullify( hst % var_avr_baseint )
149  allocate( hst % var_avr_baseint(nvars + 1) )
150  hst % var_avr_baseint(1:nvars) = var_avr_baseint_work(1:nvars)
151  deallocate( var_avr_baseint_work )
152 
153  var_avr_prevtime_work => hst % var_avr_prevtime
154  nullify( hst % var_avr_prevtime )
155  allocate( hst % var_avr_prevtime(nvars + 1) )
156  hst % var_avr_prevtime(1:nvars) = var_avr_prevtime_work(1:nvars)
157  deallocate( var_avr_prevtime_work )
158  else
159  ! トリッキーだが、ここで count だけ 2 要素確保するのは、
160  ! HistorySetTime による巻き戻しに備えるため。
161  allocate(hst % vars(1), hst % count(2), hst % growable_indices(1))
162  hst % count(2) = 0
163  allocate(hst % var_avr_count(1), hst % var_avr_data(1))
164  allocate(hst % var_avr_firstput(1), hst % var_avr_coefsum(1))
165  allocate(hst % var_avr_baseint(1), hst % var_avr_prevtime(1))
166  endif
167  nvars = size(hst % vars(:))
168  hst % growable_indices(nvars) = 0
169  hst % count(nvars) = 0
170  hst % var_avr_count(nvars) = -1
171  hst % var_avr_firstput = .true.
172  hst % var_avr_coefsum(nvars) = 0.0_dp
173  hst % var_avr_baseint(nvars) = 0.0_dp
174 !!$ call DCDiffTimeCreate( &
175 !!$ & hst % var_avr_baseint(nvars), & ! (out)
176 !!$ & sec = 0.0_DP ) ! (in)
177  hst % var_avr_prevtime(nvars) = hst % var_avr_baseint(nvars)
178 
179  !----- コピー元ファイルの変数 ID 取得 -----
180  copyurl = urlmerge(file, varname)
181  call open(copyfrom, copyurl)
182 
183  !----- 変数コピー -----
184  call inquire(hst % dimvars(1), url=url)
185  fullname = urlresolve((gt_atmark // trim(varname)), trim(url))
186  overwrite_required = .true.
187  if (present_and_false(overwrite)) overwrite_required = .false.
188  call create(hst % vars(nvars), trim(fullname), copyfrom, &
189  & copyvalue=.false., overwrite=overwrite_required)
190 
191  !----- 無制限次元の添字を探査 -----
192  call inquire(hst % vars(nvars), alldims=numdims)
193  allocate(dimvars(numdims))
194  ! 各次元毎に情報を取得し, growable == .TRUE. のもの (つまりは時間)
195  ! の添字番号を取得する
196  do, i = 1, numdims
197  call open(var=dimvars(i), source_var=hst % vars(nvars), &
198  & dimord=i, count_compact=.true.)
199  ! 各次元変数の growable を調べる
200  call inquire(var=dimvars(i), growable=growable)
201  if (growable) then
202  hst % growable_indices(nvars) = i
203  endif
204  enddo
205 
206  !----- 拡張可能次元があったらそれをサイズ 1 に拡張しておく -----
207  if (hst % growable_indices(nvars) /= 0) then
208  call slice(hst % vars(nvars), hst % growable_indices(nvars), &
209  & start=1, count=1, stride=1)
210  endif
211 
212  deallocate(dimvars)
213 
214  call inquire( hst % vars(nvars), size = var_avr_length )
215  allocate( hst % var_avr_data(nvars) % a_DataAvr(var_avr_length) )
216  hst % var_avr_data(nvars) % length = var_avr_length
217  hst % var_avr_data(nvars) % a_DataAvr = 0.0_dp
218 
219  call close(copyfrom)
220  call endsub(subname)
type(gt_history), target, save, public default
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
Definition: dc_types.f90:109
character, parameter, public gt_atmark
Definition: dc_url.f90:79
logical function, public present_and_false(arg)
Definition: dc_present.f90:99
integer, parameter, public dp
倍精度実数型変数
Definition: dc_types.f90:83
subroutine, public dbgmessage(fmt, i, r, d, L, n, c1, c2, c3, ca)
Definition: dc_trace.f90:509
subroutine, public beginsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca, version)
Definition: dc_trace.f90:351
種別型パラメタを提供します。
Definition: dc_types.f90:49
subroutine, public endsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca)
Definition: dc_trace.f90:446
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
Definition: dc_types.f90:118
Here is the call graph for this function: