copyright (C) 2001 MSC-RPN COMM %%%MC2%%%
***s/r diagcfl - Computes maximum courant numbers (CN)
*
subroutine diagcfl (stepno) 1,1
implicit none
*
integer stepno
*
*OBJECT
* computes and prints position and value of:
* - maximum horizontal CN
* - maximum vertical CN
* - maximum 3D CN
* formal parameters:
* - u,v - horizontal wind
* - w - vertical wind
*
*METHOD
*
*EXTERNALS
*
*AUTHOR Michel Desgagne May 1993
*
*HISTORY
*
**
#include "yomdyn.cdk"
#include "yomdyn1.cdk"
#include "dynmem.cdk"
#include "topo.cdk"
#include "partopo.cdk"
#include "nbcpu.cdk"
include 'mpif.h'
*
integer i,j,k,imax,jmax,kmax,tag,iproc,offi,offj,err
integer MPI_status(MPI_status_size)
real cfl,mcfl,wk,tr(4,3)
real w0(minx:maxx,miny:maxy,1:gnk)
real*8 pt5
parameter(pt5=0.5d0)
pointer (pawk, wk(*))
data tag /310/
*--------------------------------------------------------------------
*
call sw2w3
(w0,uu0,vv0,ww0,sbxy,gg1,gg2,g0wr,dhdt,
$ minx,maxx,miny,maxy,gnk)
*
offi = gc_ld(1,myproc) - 1
offj = gc_ld(3,myproc) - 1
*
if (numproc.gt.1) then
if (myproc.eq.0) call hpalloc (pawk, 12*(numproc-1), err, 1)
endif
*
* ** Horizontal
mcfl = -1.0
do 1 k=1,gnk-1
do 1 j=1,ldnj-north
do 1 i=1,ldni-east
cfl= sqrt( ((uu0(i ,j,k)*sby(i ,j)*odxu(1)
$ +uu0(i+1,j,k)*sby(i+1,j)*odxu(1) )*.5)**2 +
$ ((vv0(i,j ,k)*sbx(i,j )*odyv(j)
$ +vv0(i,j+1,k)*sbx(i,j+1)*odyv(j+1))*.5)**2 )
if (cfl .gt. mcfl) then
mcfl= cfl
imax = i
jmax = j
kmax = k
endif
1 continue
tr(1,1) = mcfl * grdt
tr(2,1) = float(imax+offi)
tr(3,1) = float(jmax+offj)
tr(4,1) = float(kmax)
*
* ** Vertical
mcfl = -1.0
do 2 k=1,gnk-1
do 2 j=1,ldnj-north
do 2 i=1,ldni-east
cfl= abs(w0(i,j,k))
if (cfl .gt. mcfl) then
mcfl= cfl
imax = i
jmax = j
kmax = k
endif
2 continue
tr(1,2) = mcfl * grdt
tr(2,2) = float(imax+offi)
tr(3,2) = float(jmax+offj)
tr(4,2) = float(kmax)
*
* ** 3D
mcfl = -1.0
do 3 k=1,gnk-1
do 3 j=1,ldnj-north
do 3 i=1,ldni-east
cfl= sqrt( ((uu0(i ,j,k)*sby(i ,j)*odxu(1)
$ +uu0(i+1,j,k)*sby(i+1,j)*odxu(1) )*.5)**2 +
$ ((vv0(i,j ,k)*sbx(i,j )*odyv(j)
$ +vv0(i,j+1,k)*sbx(i,j+1)*odyv(j+1))*.5)**2 +
$ w0(i,j,k)**2. )
if (cfl .gt. mcfl) then
mcfl= cfl
imax = i
jmax = j
kmax = k
endif
3 continue
i = imax
j = jmax
k = kmax
tr(1,3) = mcfl * grdt
tr(2,3) = float(imax+offi)
tr(3,3) = float(jmax+offj)
tr(4,3) = float(kmax)
*
if (myproc.eq.0) then
print*
do iproc = 2, numproc
call MPI_recv(wk((iproc-2)*12+1),12,MPI_REAL,iproc-1,tag,
$ MPI_COMM_WORLD, MPI_status, err)
end do
mcfl = tr(1,1)
imax = nint(tr(2,1))
jmax = nint(tr(3,1))
kmax = nint(tr(4,1))
do iproc = 2, numproc
if (wk((iproc-2)*12+1).gt.mcfl) then
mcfl = wk((iproc-2)*12+1)
imax = nint(wk((iproc-2)*12+2))
jmax = nint(wk((iproc-2)*12+3))
kmax = nint(wk((iproc-2)*12+4))
endif
end do
write (6,101) stepno,'x,y',imax,jmax,kmax,mcfl
mcfl = tr(1,2)
imax = nint(tr(2,2))
jmax = nint(tr(3,2))
kmax = nint(tr(4,2))
do iproc = 2, numproc
if (wk((iproc-2)*12+5).gt.mcfl) then
mcfl = wk((iproc-2)*12+5)
imax = nint(wk((iproc-2)*12+6))
jmax = nint(wk((iproc-2)*12+7))
kmax = nint(wk((iproc-2)*12+8))
endif
end do
write (6,101) stepno,'z',imax,jmax,kmax,mcfl
mcfl = tr(1,3)
imax = nint(tr(2,3))
jmax = nint(tr(3,3))
kmax = nint(tr(4,3))
do iproc = 2, numproc
if (wk((iproc-2)*12+9).gt.mcfl) then
mcfl = wk((iproc-2)*12+9 )
imax = nint(wk((iproc-2)*12+10))
jmax = nint(wk((iproc-2)*12+11))
kmax = nint(wk((iproc-2)*12+12))
endif
end do
write (6,101) stepno,'3D',imax,jmax,kmax,mcfl
else
call MPI_send(tr, 12, MPI_REAL, 0, tag, MPI_COMM_WORLD, err)
endif
*
if (numproc.gt.1) then
if (myproc.eq.0) call hpdeallc (pawk ,err, 1)
endif
*
101 format (i5,' MAX COURANT NUMBER: ',
$ a3,': [(',i5,',',i5,',',i5,') ',f12.7,']')
*
*----------------------------------------------------------------
return
end