C $Header: /u/gcmpack/MITgcm/model/src/ini_pressure.F,v 1.7 2005/04/06 18:29:53 jmc Exp $
C $Name: $
#include "CPP_OPTIONS.h"
CBOP
C !ROUTINE: INI_PRESSURE
C !INTERFACE:
SUBROUTINE INI_PRESSURE( myThid )
C !DESCRIPTION: \bv
C *==========================================================*
C | SUBROUTINE INI_PRESSURE
C | o initialise the pressure field consistently with
C | temperature and salinity
C | - needs to be called after ini_theta, ini_salt, and
C | ini_psurf
C | - does not include surface pressure loading, because
C | that is only available until after
C | CALL packages_init_variables
C *==========================================================*
C \ev
C !USES:
IMPLICIT NONE
C == Global variables ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "EOS.h"
#include "GRID.h"
#include "DYNVARS.h"
C !INPUT/OUTPUT PARAMETERS:
C == Routine arguments ==
C myThid - Number of this instance of INI_PRESSURE
INTEGER myThid
C !LOCAL VARIABLES:
C == Local variables ==
C dPhiHydX,Y :: Gradient (X & Y directions) of Hyd. Potential
C bi,bj - Loop counters
C I,J,K
INTEGER bi, bj
INTEGER I, J, K
INTEGER iMin, iMax, jMin, jMax, npiter
_RL PhiHydF (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
_RL PhiHydC (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
_RL dPhiHydX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
_RL dPhiHydY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
_RL oldPhi (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
_RL count, rmspp, rmsppold
CHARACTER*(MAX_LEN_MBUF) msgBuf
CEOP
iMin = 1-OLx
iMax = sNx+OLx
jMin = 1-OLy
jMax = sNy+OLy
WRITE(msgBuf,'(a)')
& 'Start initial hydrostatic pressure computation'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
DO k = 1,Nr
DO j=1-OLy,sNy+OLy
DO i=1-OLx,sNx+OLx
totPhiHyd(i,j,k,bi,bj) = 0. _d 0
ENDDO
ENDDO
ENDDO
ENDDO
ENDDO
IF ( useDynP_inEos_Zc ) THEN
#ifndef ALLOW_AUTODIFF_TAMC
cph-- deal with this iterative loop for AD once it will
cph-- really be needed;
cph-- would need storing of totPhiHyd for each npiter
rmspp = 1. _d 0
rmsppold = 0. _d 0
npiter = 0
C iterate pressure p = integral of (g*rho(p)*dz)
DO npiter= 1, 15
rmsppold = rmspp
rmspp = 0. _d 0
count = 0.
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
DO j=1-OLy,sNy+OLy
DO i=1-OLx,sNx+OLx
phiHydF(i,j) = 0. _d 0
ENDDO
ENDDO
DO k = 1, Nr
C for each level save old pressure and compute new pressure
DO j=jMin,jMax
DO i=iMin,iMax
oldPhi(i,j) = totPhiHyd(i,j,k,bi,bj)
ENDDO
ENDDO
CALL CALC_PHI_HYD(
I bi, bj, iMin, iMax, jMin, jMax, k,
I theta, salt,
U phiHydF,
O phiHydC, dPhiHydX, dPhiHydY,
I startTime, nIter0, myThid)
C compute convergence criterion
DO j=jMin,jMax
DO i=iMin,iMax
rmspp = rmspp
& + (totPhiHyd(i,j,k,bi,bj)-oldPhi(i,j))**2
count = count + maskC(i,j,k,bi,bj)
ENDDO
ENDDO
C -- end k loop
ENDDO
ENDDO
ENDDO
Cml WRITE(msgBuf,'(I10.10)') npiter
Cml CALL WRITE_FLD_XYZ_RL( 'POLD.',msgBuf,pold,npiter,myThid)
Cml CALL WRITE_FLD_XYZ_RL( 'PINI.',msgBuf,pressure,npiter,myThid)
_GLOBAL_SUM_R8( rmspp, myThid )
_GLOBAL_SUM_R8( count, myThid )
IF ( count .EQ. 0. ) THEN
rmspp = 0. _d 0
ELSE
rmspp = sqrt(rmspp/count)
ENDIF
WRITE(msgBuf,'(a,i2,a,e20.13)')
& 'Iteration ', npiter, ', RMS-difference = ', rmspp
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
C -- end npiter loop
ENDDO
C print some diagnostics
IF ( rmspp .ne. 0. ) THEN
IF ( rmspp .EQ. rmsppold ) THEN
WRITE(msgBuf,'(A)')
& 'Initial hydrostatic pressure did not converge perfectly,'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
WRITE(msgBuf,'(A)')
& 'but the RMS-difference is constant, indicating that the'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
WRITE(msgBuf,'(A)')
& 'algorithm converged within machine precision.'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
ELSE
WRITE(msgBuf,'(A,I2,A)')
& 'Initial hydrostatic pressure did not converge after ',
& npiter-1, ' steps'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R INI_PRESSURE'
ENDIF
ENDIF
WRITE(msgBuf,'(A)')
& 'Initial hydrostatic pressure converged.'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
#endif /* ALLOW_AUTODIFF_TAMC */
c-- else of if useDynP_inEos_Zc
ELSE
C print a message and DO nothing
WRITE(msgBuf,'(A,A)')
& 'Pressure is predetermined for buoyancyRelation ',
& buoyancyRelation(1:11)
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
ENDIF
WRITE(msgBuf,'(A)') ' '
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , 1)
RETURN
END