/usr/share/code_saturne/user/ushist.f90 is in code-saturne-data 3.2.1-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 | !-------------------------------------------------------------------------------
! Code_Saturne version 3.2.1
! --------------------------
! This file is part of Code_Saturne, a general-purpose CFD tool.
!
! Copyright (C) 1998-2013 EDF S.A.
!
! This program is free software; you can redistribute it and/or modify it under
! the terms of the GNU General Public License as published by the Free Software
! Foundation; either version 2 of the License, or (at your option) any later
! version.
!
! This program is distributed in the hope that it will be useful, but WITHOUT
! ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
! FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
! details.
!
! You should have received a copy of the GNU General Public License along with
! this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
! Street, Fifth Floor, Boston, MA 02110-1301, USA.
!-------------------------------------------------------------------------------
subroutine ushist &
!================
( nvar , nscal , &
dt , rtpa , rtp , propce )
!===============================================================================
! Purpose:
! -------
! User subroutine.
! Non-standard monitoring point definition.
!-------------------------------------------------------------------------------
! Arguments
!__________________.____._____.________________________________________________.
! name !type!mode ! role !
!__________________!____!_____!________________________________________________!
! nvar ! i ! <-- ! total number of variables !
! nscal ! i ! <-- ! total number of scalars !
! dt(ncelet) ! ra ! <-- ! time step (per cell) !
! rtp, rtpa ! ra ! <-- ! calculated variables at cell centers !
! (ncelet, *) ! ! ! (at current and previous time steps) !
! propce(ncelet, *)! ra ! <-- ! physical properties at cell centers !
!__________________!____!_____!________________________________________________!
! Type: i (integer), r (real), s (string), a (array), l (logical),
! and composite types (ex: ra real array)
! mode: <-- input, --> output, <-> modifies data, --- work array
!===============================================================================
!===============================================================================
! Module files
!===============================================================================
use paramx
use pointe
use numvar
use optcal
use cstphy
use entsor
use parall
use period
use mesh
!===============================================================================
implicit none
! Arguments
integer nvar , nscal
double precision dt(ncelet), rtp(ncelet,*), rtpa(ncelet,*)
double precision propce(ncelet,*)
! Local variables
integer ii, kk, node, ndrang, nvarpp, numcel, lng
double precision xx, yy, zz, xyztmp(3)
! Monitoring points number (lower than a maximum of 100)
integer ncapmx
parameter (ncapmx=100)
integer icapt(ncapmx)
save icapt
integer ircapt(ncapmx)
save ircapt
! Number of monitoring points
integer ncapts
save ncapts
! Current pass number
integer ipass
data ipass /0/
save ipass
! Temporary array
double precision vacapt(ncapmx)
!===============================================================================
!===============================================================================
! 1. Initialization
!===============================================================================
! Memory management
! Current pass number in this subroutine
ipass = ipass + 1
!===============================================================================
! 2. Search for the monitoring points
!===============================================================================
! The numbers stored in the 'ircapt' array give the processor rank on which
! is the probes. The user should not have to care as soon as she/he is
! using the 'findpt' subroutine to find the monitoring points.
! At the first pass:
! Search for the cell number the centre of which is the closest of the
! coordinates (xx, yy, zz).
! In case of parallelism, the cell number 'icapt(ii)' is local to the
! processor of rank 'ircapt(ii)' (from 0 to the number of processor - 1).
! 'ncapts' gives the total number of monitoring points.
if (ipass.eq.1) then
ii = 0
xx = 0.20d0
yy = 0.15d0
zz = 0.01d0
call findpt &
!==========
( ncelet , ncel , xyzcen , &
xx , yy , zz , node , ndrang)
ii = ii + 1
icapt(ii) = node
ircapt(ii) = ndrang
xx = 0.70d0
yy = 0.15d0
zz = 0.01d0
call findpt &
!==========
( ncelet , ncel , xyzcen , &
xx , yy , zz , node , ndrang)
ii = ii + 1
icapt(ii) = node
ircapt(ii) = ndrang
xx = 0.20d0
yy = 0.75d0
zz = 0.01d0
call findpt &
!==========
( ncelet , ncel , xyzcen , &
xx , yy , zz , node , ndrang)
ii = ii + 1
icapt(ii) = node
ircapt(ii) = ndrang
xx = 0.70d0
yy = 0.75d0
zz = 0.01d0
call findpt &
!==========
( ncelet , ncel , xyzcen , &
xx , yy , zz , node , ndrang)
ii = ii + 1
icapt(ii) = node
ircapt(ii) = ndrang
ncapts = ii
if(ii.gt.ncapmx) then
write(nfecra,*) ' ushist: ncapmx should at least be', ii
call csexit(1)
!==========
endif
endif
!===============================================================================
! 3. Open files: example for a variable per file
!===============================================================================
! Number of variables = number of files
nvarpp = nvar
! At the first pass: open files and write a header
if (ipass.eq.1) then
! Test the maximum number of user files
if (nvarpp.gt.nushmx) then
write(nfecra,*) &
' ushist: no more than ', nushmx,' monitoring files are allowed'
call csexit(1)
!==========
endif
do ii = 1, nvarpp
! Open the files with the availabe Fortran 'file units'
if (irangp.le.0) then
open(file=ficush(ii), unit=impush(ii))
endif
! Print the (global) cell number and the center coordinates
do kk = 1, ncapts
! Cell number (in a parallel run: local to the current processor)
numcel = icapt(kk)
if (irangp.lt.0 .or. irangp.eq.ircapt(kk)) then
! Cell coordinates (in a parallel run: only one processor gives values)
xyztmp(1) = xyzcen(1,numcel)
xyztmp(2) = xyzcen(2,numcel)
xyztmp(3) = xyzcen(3,numcel)
else
! Fake values on the other processors
xyztmp(1) = 0.d0
xyztmp(2) = 0.d0
xyztmp(3) = 0.d0
endif
! In case of parallelism, the processor on which the cell was found
! sends its global number and coordinates to the others.
if (irangp.ge.0) then
lng = 3
call parbcr(ircapt(kk), lng, xyztmp)
!==========
endif
! Write information
! (only rank 0 works in a parallel run: only one file is needed)
if (irangp.le.0) then
write(impush(ii),1000) &
'#', ' Coord ', xyztmp(1), xyztmp(2), xyztmp(3)
endif
enddo
enddo
endif
1000 format(a,a9,3e14.5)
!===============================================================================
! 4. Write values: example for a variable per file
!===============================================================================
! Write the time step number,
! the physical time value
! the variable at each monitoring points
! In a serial run: the value is merely 'rtp(icapt(kk),ii)'
! In a parallel run: the value may come from a different processor, to be
! determined in 'vacapt(kk)' with the 'parhis' subroutine)
do ii = 1 , nvarpp
do kk = 1, ncapts
if (irangp.lt.0) then
vacapt(kk) = rtp(icapt(kk),ii)
else
call parhis(icapt(kk), ircapt(kk), rtp(1,ii), vacapt(kk))
!==========
endif
enddo
if (irangp.le.0) then
write(impush(ii),1010) ntcabs, ttcabs, (vacapt(kk),kk=1,ncapts)
endif
enddo
! WARNING: The format must be modified in case of more than 9 monitoring points
1010 format(i10,10e17.9)
!===============================================================================
! 4. Close files
!===============================================================================
if (ntcabs.eq.ntmabs .and. irangp.le.0) then
do ii = 1, nvarpp
close(impush(ii))
enddo
endif
!----
! End
!----
return
end subroutine ushist
|