00001
00002
00003
00004
00005
00006
00007
00008 subroutine psmile_enddef_metadata ( ierror )
00009
00010
00011 use PSMILe, dummy_interface => PSMILE_Enddef_Metadata
00012 use psmile_io_utils,only:indexi
00013
00014 implicit none
00015 include 'prism.inc'
00016
00017 integer, Intent (Out) :: ierror
00018
00019
00020
00021
00022 integer :: ierrp(2)
00023 integer :: ii,no_of_io_fields
00024 integer :: itemp_id,ino_of_glob_grids
00025 integer :: jj,kk,iid
00026 integer :: ino_of_items
00027 integer :: ilp,il_tskid
00028 integer :: icltn
00029 integer,allocatable :: itemp(:)
00030 integer,allocatable :: itemp1(:)
00031 integer,allocatable :: ivar_ids(:)
00032 integer,allocatable :: iglobal_grid_ids(:)
00033 integer,allocatable :: indices(:)
00034 integer,allocatable :: ino_grids(:)
00035 character(len=max_name) :: cl_temp_name
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 Character(len=len_cvs_string),save :: def_meta_cvs=
00055 '$Id: psmile_enddef_metadata.F90 2687 2010-10-28 15:15:52Z coquart $'
00056
00057 ierror = 0
00058 #ifdef __PSMILE_WITH_IO
00059 #ifdef VERBOSE
00060 print*,trim(ch_id),' : psmile_enddef_metadata: start'
00061 call psmile_flushstd
00062 #endif
00063
00064
00065
00066
00067 allocate(ivar_ids(Number_of_fields_allocated),stat=ierror)
00068 allocate(iglobal_grid_ids(Number_of_fields_allocated),stat=ierror)
00069
00070 no_of_io_fields=0
00071 do ii=1,Number_of_fields_allocated
00072 if (Fields(ii)%status .eq. PSMILe_status_defined) then
00073 if (associated(Fields(ii)%io_chan_infos) ) then
00074 if(Fields(ii)%io_chan_infos(1)%status.eq.PSMILe_status_defined) then
00075
00076 no_of_io_fields=no_of_io_fields+1
00077 ivar_ids(no_of_io_fields)=ii
00078 iglobal_grid_ids(no_of_io_fields)= &
00079 Grids(Methods(Fields(ii)%method_id)%grid_id)%global_grid_id
00080 endif
00081 endif
00082 endif
00083 enddo
00084
00085
00086 #ifdef VERBOSE
00087 print*,trim(ch_id),' : psmile_enddef_metadata:0: ',no_of_io_fields,iglobal_grid_ids(1:no_of_io_fields)
00088 call psmile_flushstd
00089 #endif
00090
00091 if(no_of_io_fields.gt.0) then
00092
00093
00094
00095 allocate(indices(no_of_io_fields),stat=ierror)
00096 allocate(itemp(no_of_io_fields),stat=ierror)
00097 allocate(itemp1(Number_of_Grids_allocated),stat=ierror)
00098 allocate(ino_grids(no_of_io_fields),stat=ierror)
00099
00100 call indexi(no_of_io_fields,iglobal_grid_ids,indices)
00101
00102 itemp(1:no_of_io_fields)=iglobal_grid_ids(indices(1:no_of_io_fields))
00103 iglobal_grid_ids(1:no_of_io_fields)=itemp(1:no_of_io_fields)
00104
00105 itemp(1:no_of_io_fields)=ivar_ids(indices(1:no_of_io_fields))
00106 ivar_ids(1:no_of_io_fields)=itemp(1:no_of_io_fields)
00107
00108
00109
00110
00111 ino_of_glob_grids =1
00112 iid=iglobal_grid_ids(1)
00113 ino_grids(ino_of_glob_grids)=0
00114 do ii=1,no_of_io_fields
00115 if(iid.eq.iglobal_grid_ids(ii)) then
00116 ino_grids(ino_of_glob_grids)=ino_grids(ino_of_glob_grids)+1
00117 else
00118 iid=iglobal_grid_ids(ii)
00119 ino_of_glob_grids =ino_of_glob_grids +1
00120 ino_grids(ino_of_glob_grids)=1
00121 endif
00122 enddo
00123 #ifdef VERBOSE
00124 print*,trim(ch_id),' : psmile_enddef_metadata:1:' &
00125 ,'ino_of_glob_grids,ino_grids(1:ino_of_glob_grids)' &
00126 ,ino_of_glob_grids,ino_grids(1:ino_of_glob_grids)
00127 call psmile_flushstd
00128 #endif
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 iid=1
00139 do ii=1,ino_of_glob_grids
00140
00141 call indexi(ino_grids(ii),ivar_ids(iid),indices)
00142 itemp(1:ino_grids(ii))=ivar_ids(indices(1:ino_grids(ii))+iid-1)
00143
00144 icltn=1
00145 cl_temp_name=Fields(itemp(icltn))%local_name
00146
00147 do while(icltn.le.ino_grids(ii))
00148
00149 #ifdef VERBOSE
00150 print*,trim(ch_id),' : psmile_enddef_metadata:2:' &
00151 ,'ii,iid,itemp(1:ino_grids(ii)),trim(cl_temp_name)' &
00152 ,ii,iid,itemp(1:ino_grids(ii)),trim(cl_temp_name)
00153 call psmile_flushstd
00154 #endif
00155 ino_of_items=0
00156 do jj=icltn,ino_grids(ii)
00157
00158 if(trim(cl_temp_name).eq.trim(Fields(itemp(jj))%local_name) .and. &
00159 jj.lt.ino_grids(ii)) then
00160
00161 ino_of_items=ino_of_items+1
00162 itemp1(ino_of_items)=itemp(jj)
00163
00164 else
00165 if(trim(cl_temp_name).eq.trim(Fields(itemp(jj))%local_name)) then
00166 ino_of_items=ino_of_items+1
00167 itemp1(ino_of_items)=itemp(jj)
00168 endif
00169
00170 do kk=1,ino_of_items
00171
00172
00173
00174 do il_tskid=1,size(Fields(itemp1(kk))%io_task_lookup)
00175
00176 ilp=Fields(itemp1(kk))%io_task_lookup(il_tskid)
00177
00178
00179
00180 if(ilp .gt. 0 ) then
00181 Fields(itemp1(kk))%io_infos => &
00182 Fields(itemp1(kk))%io_chan_infos(ilp)
00183
00184 if(.not.associated(Fields(itemp1(kk))%io_infos%related_ids)) &
00185 allocate(Fields(itemp1(kk)) &
00186 %io_infos%related_ids(ino_of_items))
00187
00188
00189
00190
00191 Fields(itemp1(kk)) &
00192 %io_infos%block_id=kk
00193
00194
00195
00196 Fields(itemp1(kk)) &
00197 %io_infos%related_ids(1:ino_of_items) &
00198 =itemp1(1:ino_of_items)
00199
00200
00201
00202
00203 Fields(itemp1(kk)) &
00204 %io_infos%opened=.false.
00205
00206
00207
00208
00209
00210
00211 Fields(itemp1(kk)) &
00212 %io_infos%done=.false.
00213 #ifdef VERBOSE
00214 print*,trim(ch_id),' : psmile_enddef_metadata: <'
00215 print*,trim(ch_id),' : varid,local_name,blockid,relation'
00216 print*,trim(ch_id),' : ',itemp1(kk),trim(cl_temp_name) &
00217 ,Fields(itemp1(kk))%io_infos%block_id &
00218 ,Fields(itemp1(kk))%io_infos%related_ids(1:ino_of_items)
00219 print*,trim(ch_id),' : psmile_enddef_metadata: >'
00220
00221 call psmile_flushstd
00222
00223 #endif
00224 endif
00225 enddo
00226 enddo
00227 icltn=icltn+ino_of_items
00228 ino_of_items=0
00229 cl_temp_name=Fields(itemp(jj))%local_name
00230 endif
00231
00232
00233
00234 if(ino_of_items.eq.0) exit
00235 enddo
00236 enddo
00237 iid=ino_grids(ii)+1
00238 enddo
00239
00240 deallocate(indices,stat=ierror)
00241 deallocate(itemp,stat=ierror)
00242 deallocate(itemp1,stat=ierror)
00243 deallocate(ino_grids,stat=ierror)
00244
00245 endif
00246
00247
00248
00249 call psmile_def_domains(ierror)
00250 call psmile_open_files(ierror)
00251 call psmile_write_meta(ierror)
00252
00253
00254 deallocate(ivar_ids,stat=ierror)
00255 deallocate(iglobal_grid_ids,stat=ierror)
00256
00257 #ifdef VERBOSE
00258 print*,trim(ch_id),' : psmile_enddef_metadata: end'
00259 call psmile_flushstd
00260
00261 #endif
00262 #endif
00263
00264 end subroutine PSMILe_Enddef_Metadata