Loading...
Searching...
No Matches
historycopyvariable.f90
Go to the documentation of this file.
1!= 変数定義のコピー
2!= Copy definition of a variable
3!
4! Authors:: Yasuhiro MORIKAWA
5! Version:: $Id: historycopyvariable.f90,v 1.3 2009-10-10 08:01:51 morikawa Exp $
6! Tag Name:: $Name: $
7! Copyright:: Copyright (C) GFD Dennou Club, 2004-2009. All rights reserved.
8! License:: See COPYRIGHT[link:../../../COPYRIGHT]
9!
10 subroutine historycopyvariable1(file, varname, history, overwrite)
11 !
12 !== 変数定義 (別ファイルの変数コピー)
13 !
14 ! gtool4 データ内の変数の定義を行います。 他の gtool4 データの
15 ! ファイル名とその中の変数名を指定することで、 自動的のその変数の
16 ! 構造や属性をコピーして変数定義します。このサブルーチンを
17 ! 用いる前に、 HistoryCreate による初期設定が必要です。
18 !
19 ! 構造や属性を手動で設定する場合には HistoryAddVariable
20 ! を用いて下さい。
21 !
23 use gtool_history_internal, only: default
24 use gtdata_generic, only: create, inquire, open, slice, close
25 use gtdata_types, only: gt_variable
26 use dc_present, only: present_and_false
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)
221 end subroutine historycopyvariable1
subroutine historycopyvariable1(file, varname, history, overwrite)
Provides kind type parameter values.
Definition dc_types.f90:49
integer, parameter, public token
Character length for word, token
Definition dc_types.f90:109
integer, parameter, public dp
Double Precision Real number
Definition dc_types.f90:83
integer, parameter, public string
Character length for string
Definition dc_types.f90:118
character, parameter, public gt_atmark
Definition dc_url.f90:79
type(gt_history), target, save default