C $Header: /u/gcmpack/MITgcm/pkg/bulk_force/bulkf_readparms.F,v 1.8 2017/08/09 15:23:39 mlosch Exp $
C $Name: $
#include "BULK_FORCE_OPTIONS.h"
SUBROUTINE BULKF_READPARMS( myThid )
C *==========================================================*
C | SUBROUTINE BULKF_READPARMS |
C | o Routine to initialize BULKF variables and constants. |
C *==========================================================*
C | Initialize BULKF parameters, read in data.blk |
C *==========================================================*
IMPLICIT NONE
C === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "BULKF_PARAMS.h"
#include "BULKF.h"
#ifdef CONSERV_BULKF
#include "BULKF_CONSERV.h"
#endif
C === Routine arguments ===
INTEGER myThid
#ifdef ALLOW_BULK_FORCE
C === Local variables ===
C msgBuf :: Informational/error message buffer
C iUnit :: Work variable for IO unit number
CHARACTER*(MAX_LEN_MBUF) msgBuf
INTEGER iUnit
C-- Bulk Formula parameter
NAMELIST //BULKF_CONST
& rhoA, rhoFW,
& cpAir, Lvap, Lfresh,
& Tf0kel, Rgas, xkar, stefan,
& zref, zwd, zth,
& cDrag_1, cDrag_2, cDrag_3,
& cStantonS, cStantonU, cDalton,
& umin, humid_fac, saltQsFac, gamma_blk,
& atm_emissivity, ocean_emissivity,
& snow_emissivity, ice_emissivity,
#ifdef ALLOW_FORMULA_AIM
& FWIND0, CHS, VGUST, DTHETA, dTstab, FSTAB,
#endif
& ocean_albedo
NAMELIST //BULKF_PARM01
& useFluxFormula_AIM, blk_nIter, calcWindStress,
& blk_taveFreq,
& AirTempFile, AirHumidityFile, RainFile,
& SolarFile, LongwaveFile, UWindFile,
& VWindFile, RunoffFile, WSpeedFile, QnetFile,
& EmPFile, CloudFile, airPotTempFile
#ifdef CONSERV_BULKF
c- conserving qnet, empmr
NAMELIST //BULKF_PARM02
& qnet_off, empmr_off, conservcycle
#endif
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
IF ( .NOT.useBulkForce ) THEN
C- pkg BULK_FORCE is not used
_BEGIN_MASTER(myThid)
C- Track pkg activation status:
C print a (weak) warning if data.blk is found
CALL PACKAGES_UNUSED_MSG(
I 'useBulkForce', 'BULKF_READPARMS', 'blk' )
_END_MASTER(myThid)
RETURN
ENDIF
_BEGIN_MASTER(myThid)
CALL OPEN_COPY_DATA_FILE(
I 'data.blk', 'BULKF_READPARMS',
O iUnit,
I myThid )
C-- Default values
C- Physical constant :
c slp0 = atm_Po / 100. ! reference sea-level atmospheric pressure [mb]
rhoA = 1.3 _d 0
rhoFW = rhoConstFresh
cpAir = atm_Cp
c cpwv = 1.81 _d 3
Lvap = 2.5 _d 6
Lfresh = 3.34 _d 5
c Lvap_ice = 2.83 _d 6
Tf0kel = celsius2K
Rgas = atm_Rd
c Rvap = 461. _d 0
xkar = 0.4 _d 0
stefan = 5.67 _d -8
zref = 10.0 _d 0
zwd = zref
zth = zref
cDrag_1 = 2.70 _d -3
cDrag_2 = 0.142 _d -3
cDrag_3 = 0.0764 _d -3
cStantonS = 18.0 _d -3
cStantonU = 32.7 _d -3
cDalton = 34.6 _d -3
umin = 1.0 _d 0
humid_fac = 0.606 _d 0
saltQsFac = 0.980 _d 0
gamma_blk = 0.010 _d 0
atm_emissivity = .90 _d 0
ocean_emissivity= .985 _d 0
snow_emissivity = .98 _d 0
ice_emissivity = .98 _d 0
ocean_albedo = .10 _d 0
#ifdef ALLOW_FORMULA_AIM
FWIND0 = 0.6 _d 0
CHS = 0.8 _d -3
VGUST = 5. _d 0
DTHETA = 3. _d 0
dTstab = 1. _d 0
FSTAB = 0.67 _d 0
#endif
C- bulk-forcing parameters:
useFluxFormula_AIM = .FALSE.
blk_nIter = 5
calcWindStress = zonalWindFile .EQ. ' '
& .AND. meridWindFile .EQ. ' '
blk_taveFreq = taveFreq
C- Input data files names :
AirTempFile=' '
AirHumidityFile=' '
RainFile=' '
SolarFile=' '
LongwaveFile=' '
UWindFile=' '
VWindFile=' '
WspeedFile=' '
RunoffFile=' '
QnetFile=' '
EmPFile=' '
CloudFile=' '
SnowFile=' '
airPotTempFile=' '
C-- Read parameters from open data file
WRITE(msgBuf,'(A)')' BULKF_READPARMS: starts to read BULKF_CONST'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid)
READ(UNIT=iUnit,NML=BULKF_CONST)
WRITE(msgBuf,'(A)') ' BULKF_READPARMS: read BULKF_CONST : OK'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid)
WRITE(msgBuf,'(A)')' BULKF_READPARMS: starts to read BULKF_PARM01'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid)
READ(UNIT=iUnit,NML=BULKF_PARM01)
WRITE(msgBuf,'(A)') ' BULKF_READPARMS: read BULKF_PARM01 : OK'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid)
#ifdef CONSERV_BULKF
c -- default
qnet_off=0.d0
empmr_off=0.d0
WRITE(msgBuf,'(A)')' BULKF_READPARMS: starts reading BULKF_PARM02'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid)
READ(UNIT=iUnit,NML=BULKF_PARM02)
WRITE(msgBuf,'(A)') ' BULKF_READPARMS: read BULKF_PARM02 : OK'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid)
#endif /* CONSERV_BULKF */
C-- Close the open data file
#ifdef SINGLE_DISK_IO
CLOSE(iUnit)
#else
CLOSE(iUnit,STATUS='DELETE')
#endif /* SINGLE_DISK_IO */
C- check that CPP option is "defined" when running-flag parameter is on:
#ifndef ALLOW_FORMULA_AIM
IF ( useFluxFormula_AIM ) THEN
WRITE(msgBuf,'(2A)') ' BULKF_READPARMS: ',
& 'useFluxFormula_AIM is TRUE and #undef ALLOW_FORMULA_AIM'
CALL PRINT_ERROR( msgBuf , myThid)
WRITE(msgBuf,'(2A)') ' BULKF_READPARMS: => recompile with',
& ' #define ALLOW_FORMULA_AIM in BULK_FORCE_OPTIONS.h'
CALL PRINT_ERROR( msgBuf , myThid)
STOP 'ABNORMAL END: S/R CONFIG_CHECK'
ENDIF
#endif
C- Define other constants (from previous ones):
c Qcoef = 6.11 _d 0 * 0.622 _d 0 / p0
c Sha = Rgas / .286 _d 0
useQnetch = QnetFile .NE. ' '
useEmPch = EmPFile .NE. ' '
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
iUnit = standardMessageUnit
c iUnit=88
c OPEN(iUnit,file='bulkf_check_params',status='unknown')
c WRITE(iUnit,*) 'BlkF: slp0 =',slp0
WRITE(iUnit,*) 'BlkF: rhoA =',rhoA
WRITE(iUnit,*) 'BlkF: rhoFW =',rhoFW
WRITE(iUnit,*) 'BlkF: cpAir =',cpAir
c WRITE(iUnit,*) 'BlkF: cpwv =',cpwv
WRITE(iUnit,*) 'BlkF: Lvap =',Lvap
WRITE(iUnit,*) 'BlkF: Lfresh =',Lfresh
c WRITE(iUnit,*) 'BlkF: Lvap_ice =',Lvap_ice
c WRITE(iUnit,*) 'BlkF: Sha =',Sha
WRITE(iUnit,*) 'BlkF: Tf0kel =',Tf0kel
WRITE(iUnit,*) 'BlkF: Rgas =',Rgas
c WRITE(iUnit,*) 'BlkF: Rvap =',Rvap
WRITE(iUnit,*) 'BlkF: xkar =',xkar
WRITE(iUnit,*) 'BlkF: stefan =',stefan
WRITE(iUnit,*) 'BlkF: zref =',zref
WRITE(iUnit,*) 'BlkF: zwd =',zwd
WRITE(iUnit,*) 'BlkF: zth =',zth
WRITE(iUnit,*) 'BlkF: cDrag_1 =',cDrag_1
WRITE(iUnit,*) 'BlkF: cDrag_2 =',cDrag_2
WRITE(iUnit,*) 'BlkF: cDrag_3 =',cDrag_3
WRITE(iUnit,*) 'BlkF: cStantonS=',cStantonS
WRITE(iUnit,*) 'BlkF: cStantonU=',cStantonU
WRITE(iUnit,*) 'BlkF: cDalton =',cDalton
WRITE(iUnit,*) 'BlkF: umin =',umin
WRITE(iUnit,*) 'BlkF: humid_fac=',humid_fac
WRITE(iUnit,*) 'BlkF: saltQsFac=',saltQsFac
WRITE(iUnit,*) 'BlkF: gamma_blk=',gamma_blk
WRITE(iUnit,*) 'BlkF: atm_emissivity =',atm_emissivity
WRITE(iUnit,*) 'BlkF: ocean_emissivity=',ocean_emissivity
WRITE(iUnit,*) 'BlkF: snow_emissivity =',snow_emissivity
WRITE(iUnit,*) 'BlkF: ice_emissivity =',ice_emissivity
WRITE(iUnit,*) 'BlkF: ocean_albedo =',ocean_albedo
#ifdef ALLOW_FORMULA_AIM
WRITE(iUnit,*) 'BlkF: FWIND0 =', FWIND0
WRITE(iUnit,*) 'BlkF: CHS =', CHS
WRITE(iUnit,*) 'BlkF: VGUST =', VGUST
WRITE(iUnit,*) 'BlkF: DTHETA =', DTHETA
WRITE(iUnit,*) 'BlkF: dTstab =', dTstab
WRITE(iUnit,*) 'BlkF: FSTAB =', FSTAB
#endif
WRITE(iUnit,*) 'BlkF: useFluxFormula_AIM=',useFluxFormula_AIM
WRITE(iUnit,*) 'BlkF: calcWindStress =', calcWindStress
WRITE(iUnit,*) 'BlkF: useQnetch =', useQnetch
WRITE(iUnit,*) 'BlkF: useEmPch =', useEmPch
WRITE(iUnit,*) 'BlkF: blk_nIter =',blk_nIter
WRITE(iUnit,*) 'BlkF: blk_taveFreq=', blk_taveFreq
IF (iUnit.EQ.88) CLOSE(iUnit)
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
_END_MASTER(myThid)
C-- Everyone else must wait for the parameters to be loaded
_BARRIER
#endif /* ALLOW_BULK_FORCE */
RETURN
END