1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
C Copyright (c) 2003-2010 University of Florida
C
C This program is free software; you can redistribute it and/or modify
C it under the terms of the GNU General Public License as published by
C the Free Software Foundation; either version 2 of the License, or
C (at your option) any later version.
C This program is distributed in the hope that it will be useful,
C but WITHOUT ANY WARRANTY; without even the implied warranty of
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
C GNU General Public License for more details.
C The GNU General Public License is included in this distribution
C in the file COPYRIGHT.
subroutine smooth4(array_table, narray_table,
* index_table,
* nindex_table, segment_table, nsegment_table,
* block_map_table, nblock_map_table,
* scalar_table, nscalar_table,
* address_table, op)
c--------------------------------------------------------------------------
c Each element of the array source(i,j,k,l) is divided by the
c corresponding element of the array target(i,j,k,l).
c Dividing is not performed when i = k or j = l or if the absolute
c value of the target element is below 1.0d-8
c
c Format of command is :
c
c execute apply_den4_nodiag source target
c
c There is no resriction on the type of array of source or target.
c
c--------------------------------------------------------------------------
implicit none
include 'interpreter.h'
include 'int_gen_parms.h'
include 'mpif.h'
include 'trace.h'
include 'parallel_info.h'
#ifdef ALTIX
include 'sheap.h'
#endif
integer narray_table, nindex_table, nsegment_table,
* nblock_map_table
integer op(loptable_entry)
integer array_table(larray_table_entry, narray_table)
integer index_table(lindex_table_entry, nindex_table)
integer segment_table(lsegment_table_entry, nsegment_table)
integer block_map_table(lblock_map_entry, nblock_map_table)
integer nscalar_table
double precision scalar_table(nscalar_table)
integer*8 address_table(narray_table)
integer*8 indblk, get_block_index
integer block, blkndx, seg
integer find_current_block
integer i, j, ii, source, company, comm, ierr
integer source_type
integer isource, nindex_source, stack
integer n(mx_array_index),ind(mx_array_index)
integer sval1(mx_array_index),sval2(mx_array_index)
integer tval1(mx_array_index),tval2(mx_array_index)
integer msg(len_sip_server_message)
integer status(MPI_STATUS_SIZE)
double precision x(1)
#ifdef ALTIX
pointer (dptr, x)
#else
common x
#endif
#ifdef ALTIX
dptr = dshptr
#endif
c--------------------------------------------------------------------------
c Locate the data for both arrays.
c--------------------------------------------------------------------------
source = op(c_result_array)
c---------------------------------------------------------------------------
c Look up source's address.
c---------------------------------------------------------------------------
block = find_current_block(source, array_table(1,source),
* index_table, nindex_table,
* segment_table, nsegment_table,
* block_map_table, blkndx)
stack = array_table(c_array_stack,source)
isource = get_block_index(source, block, stack, blkndx, x, .true.)
c--------------------------------------------------------------------------
c Check the dimensions of both arrays both arrays.
c--------------------------------------------------------------------------
source_type = array_table(c_array_type, source)
nindex_source = array_table(c_nindex, source)
if (nindex_source .ne. 4) then
print *,'Arrays in apply_den4 must have 4 indices'
call abort_job()
endif
c-------------------------------------------------------------------------
c Get segment ranges of the array source.
c-------------------------------------------------------------------------
do i = 1, nindex_source
ind(i) = array_table(c_index_array1+i-1,source)
n(i) = index_table(c_index_size, ind(i)) ! pick up length of index
seg = index_table(c_current_seg,ind(i))
call get_index_segment(ind(i), seg, segment_table,
* nsegment_table, index_table,
* nindex_table, sval1(i), sval2(i))
enddo
call dosmooth4(x(isource),
* sval1(1),sval2(1),sval1(2),sval2(2),
* sval1(3),sval2(3),sval1(4),sval2(4))
return
end
subroutine dosmooth4(x,
* i1,i2,j1,j2,k1,k2,l1,l2)
implicit none
include 'interpreter.h'
integer i1,i2,j1,j2,k1,k2,l1,l2
double precision x(i1:i2,j1:j2,k1:k2,l1:l2)
integer i,j,k,l,ix
double precision sval
write(6,*) ' ZAKRES '
do i = i1, i2
do j = j1, j2
do k = k1, k2
do l = l1, l2
c
sval= x(i,j,k,l)
sval=sval*1.0d+5
ix=sval
sval=ix
sval=sval*1.0d-5
x(i,j,k,l) = sval
c
enddo
enddo
enddo
enddo
c
return
end
|