C $Header: /u/gcmpack/MITgcm/pkg/atm_ocn_coupler/cpl_check_cplconfig.F,v 1.2 2015/11/12 00:49:04 jmc Exp $
C $Name: $
#include "CPP_OPTIONS.h"
CBOP 0
C !ROUTINE: CPL_CHECK_CPLCONFIG
C !INTERFACE:
SUBROUTINE CPL_CHECK_CPLCONFIG(
I msgUnit,
U errFlag, errMsg )
C !DESCRIPTION:
C *==========================================================*
C | SUBROUTINE CPL_CHECK_CPLCONFIG
C | o Routine to check Coupler config
C *==========================================================*
C | This routine also set the number of coupler time-step
C | to run
C *==========================================================*
C !USES:
IMPLICIT NONE
C == Global variables ==
#include "ATMSIZE.h"
#include "OCNSIZE.h"
#include "ATMVARS.h"
#include "OCNVARS.h"
#include "CPL_PARAMS.h"
#include "CPL_MAP2GRIDS.h"
C !INPUT/OUTPUT PARAMETERS:
C msgUnit :: log-file I/O unit
C errFlag :: logical flag to report an error
C errMsg :: error message to print to clog file
INTEGER msgUnit
LOGICAL errFlag
CHARACTER*(*) errMsg
C !LOCAL VARIABLES:
INTEGER i, j, n
INTEGER ijo, ija
LOGICAL tmpVar(Nx_atm,Ny_atm)
CEOP
C-- Report previously found errors
IF ( cplErrorCount.NE.0 ) THEN
errFlag = .TRUE.
WRITE(msgUnit,'(2A,I4,A)')
& ' *** ERROR *** CPL_CHECK_CPLCONFIG: ',
& ' cplErrorCount=', cplErrorCount, ' (from previous error)'
ENDIF
C-- Define length of the run (number of coupler time-step)
WRITE(msgUnit,'(2A,I9)') ' CPL_CHECK_CPLCONFIG: ',
& 'Nb of time-steps to run (ATM) =', nSteps_atm
WRITE(msgUnit,'(2A,I9)') ' CPL_CHECK_CPLCONFIG: ',
& 'Nb of time-steps to run (OCN) =', nSteps_ocn
IF ( nSteps_atm .EQ. nSteps_ocn ) THEN
nCouplingSteps = nSteps_ocn
WRITE(msgUnit,'(2A,I9)') ' CPL_CHECK_CPLCONFIG: ',
& 'Nb of time-steps to run (CPL) =', nCouplingSteps
ELSE
errFlag = .TRUE.
nCouplingSteps = 0
WRITE(msgUnit,'(2A)') ' *** ERROR *** CPL_CHECK_CPLCONFIG: ',
& ' wrong Nb of time-steps to run'
ENDIF
C-- Check for consistent RunOff mapping regarding Land/Sea mask:
DO j=1,Ny_atm
DO i=1,Nx_atm
tmpVar(i,j) = landMask_atm(i,j) .EQ. 1. _d 0
ENDDO
ENDDO
DO n=1,nROmap
C a) check that RunOff drain a land point
ija = ijROatm(n) - 1
i = 1 + MOD(ija,Nx_atm)
j = 1 + ija/Nx_atm
IF ( landMask_atm(i,j).EQ.0. ) THEN
errFlag = .TRUE.
WRITE(msgUnit,'(A,2I8,A)')
& ' *** ERROR *** RunOff Mapp: i,j=', i, j, ' not Land point'
ENDIF
tmpVar(i,j) = .FALSE.
C b) and supply an ocean point
ijo = ijROocn(n) - 1
i = 1 + MOD(ijo,Nx_ocn)
j = 1 + ijo/Nx_ocn
IF ( OcMxlD_ocn(i,j).EQ.0. ) THEN
errFlag = .TRUE.
WRITE(msgUnit,'(A,2I8,A)')
& ' *** ERROR *** RunOff Mapp: i,j=', i, j, ' not Oce point'
ENDIF
ENDDO
C c) check that all land-points are drained,
C note: would need to know ATM grid-cell area to check that
C RunOff Mapping conserve water.
IF ( cplErrorCount.EQ.0 ) THEN
DO j=1,Ny_atm
DO i=1,Nx_atm
IF ( tmpVar(i,j) ) THEN
WRITE(msgUnit,'(A,2I8,A)')
& ' ** WARNING ** Land point: i,j=', i, j, ' not drained'
ENDIF
ENDDO
ENDDO
ENDIF
IF ( errFlag ) THEN
errMsg = 'CPL_CHECK_CPLCONFIG: inconsistent CPL/ATM/OCN config'
ELSE
WRITE(msgUnit,'(2A)') ' CPL_CHECK_CPLCONFIG: ','done'
ENDIF
RETURN
END