Class | gt_mem |
In: |
gt_mem.f90
|
いわゆるメモリ変数をサポートします (いまのところ1次元だけ)
Derived_Types | [] | attr_chain, MEM_VARIABLE_ENTRY, MEM_VARIABLE |
Subroutine : | |
var : | type(MEM_VARIABLE), intent(out) |
url : | character(*), intent(in) |
length : | integer, intent(in) |
xtype : | character(*), intent(in), optional |
long_name : | character(*), intent(in), optional |
overwrite : | logical, intent(in), optional |
err : | logical, intent(out), optional |
Alias for MemCreateD
Derived Type : | |
name : | character(TOKEN) |
xtype : | character(TOKEN) |
dbuf(:) : | real(DP), pointer |
attr : | type(attr_chain), pointer |
current : | type(attr_chain), pointer |
Subroutine : | |
var : | type(MEM_VARIABLE), intent(in) |
name : | character(len = *), intent(in) |
err : | logical, intent(out), optional |
subroutine MemAttrDel(var, name, err) use dc_error, only: StoreError use netcdf_f77, only: NF_ENOTATT, nf_noerr type(MEM_VARIABLE), intent(in):: var character(len = *), intent(in):: name logical, intent(out), optional:: err type(mem_variable_entry), pointer:: ent type(attr_chain), pointer:: p, prev integer:: stat stat = memtab_lookup(var, ent) if (stat /= nf_noerr) goto 999 nullify(prev) p => ent%attr do if (.not. associated(p)) exit if (p%name == name) then if (associated(p%cbuf)) deallocate(p%cbuf) prev%next => p%next deallocate(p) call StoreError(nf_noerr, "MemAttrDel", err) return endif prev => p p => p%next enddo stat = nf_enotatt 999 continue call StoreError(stat, "MemAttrDel", err, cause_c=name) end subroutine MemAttrDel
Subroutine : | |
var : | type(mem_variable), intent(in) |
name : | character(len = *), intent(in) |
value : | character(len = *), intent(out) |
err : | logical, intent(out), optional |
subroutine MemAttrGet(var, name, value, err) use dc_error, only: StoreError use netcdf_f77, only: nf_enotatt, nf_noerr type(mem_variable), intent(in):: var character(len = *), intent(in):: name character(len = *), intent(out):: value logical, intent(out), optional:: err type(mem_variable_entry), pointer:: ent type(attr_chain), pointer:: p integer:: i, stat stat = memtab_lookup(var, ent) if (stat == nf_noerr) then if (associated(ent%current)) then p => ent%current if (p%name == name) goto 100 endif p => ent%attr do if (.not. associated(p)) exit if (p%name == name) goto 100 p => p%next enddo stat = nf_enotatt endif call StoreError(stat, "MemAttrGet", err, cause_c=name) return 100 continue if (associated(p%cbuf)) then do, i = 1, len(value) value(i:i) = p%cbuf(i) enddo else value = "" endif end subroutine MemAttrGet
Function : | |
result : | logical |
var : | type(MEM_VARIABLE), intent(in) |
name : | character(len = *), intent(in) |
default : | logical, intent(in), optional |
logical function MemAttrTrue(var, name, default) result(result) use dc_string, only: str_to_logical use netcdf_f77, only: nf_noerr type(MEM_VARIABLE), intent(in):: var character(len = *), intent(in):: name logical, intent(in), optional:: default type(mem_variable_entry), pointer:: ent type(attr_chain), pointer:: p character(10):: s integer:: stat, i stat = memtab_lookup(var, ent) if (stat /= nf_noerr) goto 999 p => ent%attr do if (.not. associated(p)) exit if (p%name == name) then if (associated(p%cbuf)) then s = "" do, i = 1, min(len(s), size(p%cbuf)) s(i:i) = p%cbuf(i) enddo result = str_to_logical(s) else exit endif return endif p => p%next enddo 999 continue result = .false. if (present(default)) result = default return end function MemAttrTrue
Derived Type : | |
next : | type(attr_chain), pointer |
name : | character(TOKEN) |
cbuf(:) : | character, pointer |
Subroutine : | |
var : | type(MEM_VARIABLE), intent(in) |
name : | character(len = *), intent(out) |
err : | logical, intent(out), optional |
Alias for MemAttrNext
Function : | |
result : | logical |
var : | type(MEM_VARIABLE), intent(in) |
name : | character(len = *), intent(in) |
default : | logical, intent(in), optional |
Alias for MemAttrTrue
Subroutine : | |
var : | type(MEM_VARIABLE), intent(in) |
name : | character(len = *), intent(in) |
err : | logical, intent(out), optional |
Alias for MemAttrDel
Subroutine : | |
var : | type(mem_variable), intent(in) |
name : | character(len = *), intent(in) |
value : | character(len = *), intent(out) |
err : | logical, intent(out), optional |
Alias for MemAttrGet
Subroutine : | |
var : | type(MEM_VARIABLE), intent(in) |
name : | character(len = *), intent(out) |
err : | logical, intent(out), optional |
subroutine memAttrNext(var, name, err) use netcdf_f77, only: nf_noerr type(MEM_VARIABLE), intent(in):: var character(len = *), intent(out):: name logical, intent(out), optional:: err type(mem_variable_entry), pointer:: ent if (memtab_lookup(var, ent) /= nf_noerr) goto 999 if (.not. associated(ent%current)) then ent%current => ent%attr else ent%current => ent%current%next endif if (.not. associated(ent%current)) goto 999 name = ent%current%name if (present(err)) err = .false. return ! 999 continue if (present(err)) err = .true. end subroutine memAttrNext
Subroutine : | |
var : | type(MEM_VARIABLE), intent(in) |
subroutine memAttrRewind(var) use netcdf_f77, only: nf_noerr type(MEM_VARIABLE), intent(in):: var type(mem_variable_entry), pointer:: ent if (memtab_lookup(var, ent) /= nf_noerr) return nullify(ent%current) end subroutine memAttrRewind
Subroutine : | |
var : | type(MEM_VARIABLE), intent(in) |
attrname : | character(*), intent(in) |
attrval : | character(*), intent(in) |
subroutine memattradd(var, attrname, attrval) use netcdf_f77, only: nf_noerr, nf_enotatt type(MEM_VARIABLE), intent(in):: var character(*), intent(in):: attrname character(*), intent(in):: attrval type(mem_variable_entry), pointer:: ent type(attr_chain), pointer:: p integer:: i, stat stat = memtab_lookup(var, ent) if (stat == nf_noerr) then if (associated(ent%current)) then if (ent%current%name == attrname) then p => ent%current goto 100 endif endif p => ent%attr do if (.not. associated(p)) exit if (p%name == attrname) goto 100 p => p%next enddo stat = nf_enotatt endif allocate(p) nullify(p%next) goto 120 100 continue if (associated(p%cbuf)) then deallocate(p%cbuf) endif 120 continue allocate(p%cbuf(len(attrval))) do, i = 1, len(attrval) p%cbuf(i) = attrval(i:i) enddo return end subroutine memattradd
Subroutine : | |
var : | type(mem_variable), intent(in) |
subroutine memclose(var) type(mem_variable), intent(in):: var type(mem_variable_entry), pointer:: ent if (memtab_lookup(var, ent) /= 0) return deallocate(ent%dbuf) if (associated(ent%attr)) deallocate(ent%attr) if (associated(ent%current)) deallocate(ent%current) ent%name = "" end subroutine memclose
Subroutine : | |
var : | type(MEM_VARIABLE), intent(out) |
url : | character(*), intent(in) |
length : | integer, intent(in) |
xtype : | character(*), intent(in), optional |
long_name : | character(*), intent(in), optional |
overwrite : | logical, intent(in), optional |
err : | logical, intent(out), optional |
subroutine memcreated(var, url, length, xtype, long_name, overwrite, err) type(MEM_VARIABLE), intent(out):: var character(*), intent(in):: url integer, intent(in):: length character(*), intent(in), optional:: xtype, long_name logical, intent(in), optional:: overwrite logical, intent(out), optional:: err type(mem_variable_entry), pointer:: ent integer:: stat continue stat = memtab_add(var, url) if (stat /= 0) then if (present(err)) err = .true. return endif ent => memtab(var%id) if (present(xtype)) then ent%xtype = xtype else ent%xtype = "real" endif allocate(ent%dbuf(length)) nullify(ent%attr, ent%current) if (present(long_name)) call memattradd(var, "long_name", long_name) if (present(err)) err = .false. end subroutine memcreated
Subroutine : | |
var : | type(MEM_VARIABLE), intent(in) |
attrname : | character(*), intent(in) |
attrval : | character(*), intent(in) |
Alias for memattradd
Function : | |
stat : | integer |
var : | type(mem_variable), intent(out) |
name : | character(len = *), intent(in) |
integer function memtab_add(var, name) result(stat) use dc_error, only: gt_enomem type(mem_variable), intent(out):: var character(len = *), intent(in):: name type(mem_variable_entry), allocatable:: tmptab(:) integer:: i, n if (.not. allocated(memtab)) then allocate(memtab(16), stat=stat) if (stat /= 0) then stat = gt_enomem return endif do, i = 1, size(memtab) memtab(i)%name = "" memtab(i)%xtype = "" nullify(memtab(i)%dbuf) nullify(memtab(i)%attr, memtab(i)%current) enddo endif do, i = 1, size(memtab) if (memtab(i)%name == "") then stat = 0 var = mem_variable(i) memtab(i)%name = name return endif end do n = size(memtab) allocate(tmptab(n), stat=stat) if (stat /= 0) then stat = gt_enomem return endif tmptab(:) = memtab(:) deallocate(memtab) allocate(memtab(n * 2), stat=stat) if (stat /= 0) then stat = gt_enomem return endif memtab(1:n) = tmptab(1:n) deallocate(tmptab) do, i = n + 1, n * 2 memtab(i)%name = "" nullify(memtab(i)%dbuf) nullify(memtab(i)%attr, memtab(i)%current) enddo i = n + 1 var = mem_variable(i) memtab(i)%name = name end function memtab_add
Function : | |
stat : | integer |
var : | type(mem_variable), intent(in) |
ent : | type(mem_variable_entry), pointer |
integer function memtab_lookup(var, ent) result(stat) use netcdf_f77, only: nf_enotvar, nf_noerr type(mem_variable), intent(in):: var type(mem_variable_entry), pointer:: ent if (.not. allocated(memtab)) goto 999 if (var%id <= 0 .or. var%id > size(memtab)) goto 999 if (memtab(var%id)%name == "") goto 999 ent => memtab(var%id) stat = 0 999 continue nullify(ent) stat = nf_enotvar end function memtab_lookup