gtdata_memory_internal.f90
Go to the documentation of this file.
1 != gtdata_memory 内で使用される内部向け定数, 変数, 手続き群
2 != Internal constants, variables, procedures used in "gtdata_memory"
3 !
4 ! Authors:: Yasuhiro MORIKAWA, Eizi TOYODA
5 ! Version:: $Id: gtdata_memory_internal.f90,v 1.1 2009-05-25 09:47:27 morikawa Exp $
6 ! Tag Name:: $Name: $
7 ! Copyright:: Copyright (C) GFD Dennou Club, 2001-2009. All rights reserved.
8 ! License:: See COPYRIGHT[link:../../COPYRIGHT]
9 !
11  != gtdata_memory 内で使用される内部向け定数, 変数, 手続き群
12  != Internal constants, variables, procedures used in "gtdata_memory"
13  !
14  ! <b>Note that Japanese and English are described in parallel.</b>
15  !
16 
18  implicit none
19  private
20 
22 
23  type(gd_mem_variable_entry), allocatable, save, target:: memtab(:)
24  ! メモリー変数情報テーブル.
25  ! A table of memory variables
26 
27  interface memtab_add
28  module procedure memtab_add
29  end interface
30 
31  interface memtab_lookup
32  module procedure memtab_lookup
33  end interface
34 
35 contains
36 
37  integer function memtab_add(var, name) result(stat)
39  use dc_error, only: gt_enomem
40  type(gd_mem_variable), intent(out):: var
41  character(len = *), intent(in):: name
42  type(gd_mem_variable_entry), allocatable:: tmptab(:)
43  integer:: i, n
44 
45  if (.not. allocated(memtab)) then
46  allocate(memtab(16), stat=stat)
47  if (stat /= 0) then
48  stat = gt_enomem
49  return
50  endif
51  do, i = 1, size(memtab)
52  memtab(i)%name = ""
53  memtab(i)%xtype = ""
54  nullify(memtab(i)%dbuf)
55  nullify(memtab(i)%attr, memtab(i)%current)
56  enddo
57  endif
58  do, i = 1, size(memtab)
59  if (memtab(i)%name == "") then
60  stat = 0
61  var = gd_mem_variable(i)
62  memtab(i)%name = name
63  return
64  endif
65  end do
66 
67  n = size(memtab)
68  allocate(tmptab(n), stat=stat)
69  if (stat /= 0) then
70  stat = gt_enomem
71  return
72  endif
73  tmptab(:) = memtab(:)
74  deallocate(memtab)
75  allocate(memtab(n * 2), stat=stat)
76  if (stat /= 0) then
77  stat = gt_enomem
78  return
79  endif
80  memtab(1:n) = tmptab(1:n)
81  deallocate(tmptab)
82  do, i = n + 1, n * 2
83  memtab(i)%name = ""
84  nullify(memtab(i)%dbuf)
85  nullify(memtab(i)%attr, memtab(i)%current)
86  enddo
87 
88  i = n + 1
89  var = gd_mem_variable(i)
90  memtab(i)%name = name
91  end function memtab_add
92 
93  integer function memtab_lookup(var, ent) result(stat)
95  use netcdf, only: nf90_enotvar
96  type(gd_mem_variable), intent(in):: var
97  type(gd_mem_variable_entry), pointer:: ent
98 
99  if (.not. allocated(memtab)) goto 999
100  if (var%id <= 0 .or. var%id > size(memtab)) goto 999
101  if (memtab(var%id)%name == "") goto 999
102  ent => memtab(var%id)
103  stat = 0
104 999 continue
105  nullify(ent)
106  stat = nf90_enotvar
107  end function memtab_lookup
108 
109 end module gtdata_memory_internal
integer, parameter, public gt_enomem
Definition: dc_error.f90:534
type(gd_mem_variable_entry), dimension(:), allocatable, target, save, public memtab