!-------------------------------------- LICENCE BEGIN ------------------------------------ !Environment Canada - Atmospheric Science and Technology License/Disclaimer, ! version 3; Last Modified: May 7, 2008. !This is free but copyrighted software; you can use/redistribute/modify it under the terms !of the Environment Canada - Atmospheric Science and Technology License/Disclaimer !version 3 or (at your option) any later version that should be found at: !http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html ! !This software 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 above mentioned License/Disclaimer for more details. !You should have received a copy of the License/Disclaimer along with this software; !if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), !CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca !-------------------------------------- LICENCE END -------------------------------------- *** S/P CHECK_SWITCHESinteger function check_options (prout) 2 #include "impnone.cdk"
! logical prout ! !Author ! B. Bilodeau (Feb 2007) ! !Revisions ! ! 001 J. Milbrandt (Oct 2007) - added options for experimental and full ! versions of M-Y scheme; changed STCOND ! keys to 'my_sm', 'my_exp1', and 'my_full' ! 002 B. Dugas (Dec 2008) - Add Bechtold-Kain-Fritsch schemes ! (Bechtold) ! 003 J. Milbrandt (Apr 2009) - Replaced 'my_exp1' with 'my_dm' ! 004 J. Toviessi (July 2009) - radslope will not run with newrad ! and oldrad ! 005 J. Milbrandt (Aug 2009) - Replaced 'my_full' with 'my_tm' ! !Object ! * conversion of character type options to upper case ! * check the validity of the chosen options ! * definition of integer equivalents to character type options ! * check the consistency of some options ! !Arguments ! - Input - ! prout logical switch to print on stdout ! ! - Output - ! !MODULES ! #include "phy_master_ctrl.cdk"
#include "options.cdk"
integer i, k, maxsloflux character dumc*16 ! integer noptions_c character*16 options_character(1) ! equivalence (OPTIONS_CHARACTER, OPTIONS_CHARACTER_FIRST(1)) ! ! check_options = -1 ! ! ---------------------------------------------------- ! AUTOMATIC CONVERSION TO UPPER CASE ! ---------------------------------------------------- ! calculate the number of options of character type noptions_c=(loc(OPTIONS_CHARACTER_LAST ) - loc(OPTIONS_CHARACTER_FIRST( 0)) - 1) / + (loc(OPTIONS_CHARACTER_FIRST(0)) - loc(OPTIONS_CHARACTER_FIRST(-1))) ! do i=1,noptions_c call low2up(options_character(i),dumc) options_character(i) = dumc end do ! ! ---------------------------------------------------- ! IF NO PHYSICS PACKAGE IS REQUESTED, THEN DO NOT ! CHECK THE VALIDITY OF THE PHYSICS OPTIONS ! ---------------------------------------------------- ! IF (PHY_PCK_VERSION.EQ.'NIL') GOTO 666 ! ! ---------------------------------------------------- ! CHECK THE CONSISTENCY OF RADIATION OPTIONS ! ---------------------------------------------------- ! IF ((RADIA.EQ.'NEWRAD'.OR.RADIA.EQ.'CCCMARAD') 1 .AND.KNTRAD.LE.0) THEN if (prout) WRITE(6,1800) 'KNTRAD',KNTRAD GOTO 777 ENDIF ! ! ---------------------------------------------------- ! CHECK THE CONSISTENCY OF SOME OPTIONS ! ---------------------------------------------------- ! IF ( (CONVEC.EQ.'MANABE'.OR.CONVEC.EQ.'SEC') .AND. + (STCOND.NE.'NIL') ) THEN ! if (prout) WRITE(6,1200) GOTO 777 ! ELSE IF ( (CONVEC.EQ.'NEWKUO'.AND.STCOND.NE.'NEWSUND') ) THEN ! if (prout) WRITE(6,1300) GOTO 777 ! ELSE IF ( STCOND.EQ.'CONSUN'.AND. + (CONVEC.NE.'KUOSTD'.AND.CONVEC.NE.'KUOSYM'.AND. + CONVEC.NE.'KUOSUN'.AND.CONVEC.NE.'RAS' .AND. + CONVEC.NE.'FCP' .AND.CONVEC.NE.'KFC' .AND. + CONVEC.NE.'FCPKUO'.AND.CONVEC.NE.'BECHTOLD'.AND. + CONVEC.NE.'NIL') ) THEN ! if (prout) WRITE(6,1400) GOTO 777 ! ELSE IF ( (CONVEC.EQ.'FCPKUO' .OR. CONVEC.EQ.'KUOSYM'.OR. + CONVEC.EQ.'KUOSTD' .OR. CONVEC.EQ.'KUOSUN') + .AND. STCOND.NE.'CONSUN') THEN ! if (prout) WRITE(6,1500) GOTO 777 ! ENDIF ! IF (FLUVERT.EQ.'MOISTKE' .AND. + (CONVEC.NE.'KFC'.AND.CONVEC.NE.'KFCKUO2'.AND. + CONVEC.NE.'FCP'.AND.CONVEC.NE.'NIL')) THEN if (prout) WRITE(6,1700) CONVEC,FLUVERT GOTO 777 ENDIF ! IF (FLUVERT.EQ.'MOISTKE' .AND. + .NOT.( STCOND.EQ.'NIL' + .OR. STCOND.EQ.'CONSUN' + .OR. STCOND.EQ.'EXC' + .OR. STCOND.EQ.'EXCRIG' + .OR. STCOND.EQ.'MY_SM' + .OR. STCOND.EQ.'MY_DM' + .OR. STCOND.EQ.'MY_TM' ) ) THEN if (prout) WRITE(6,1700) STCOND,FLUVERT GOTO 777 ENDIF ! IF (OFFLINE) THEN FLUVERT = 'SURFACE' AGREGAT = .TRUE. BKGALB = .FALSE. ICEMELT = .TRUE. ENDIF ! IF (COUPLING .and. IMPFLX) THEN if (prout) WRITE(6,1700) 'COUPLING', 'IMPFLX' GOTO 777 ENDIF ! IF (COUPLING .and. SCHMURB.NE.'NIL') THEN if (prout) WRITE(6,1700) 'COUPLING', 'TEB' GOTO 777 ENDIF ! MAXSLOFLUX = 20 IF (NSLOFLUX.GT.MAXSLOFLUX) THEN if (prout) WRITE(6,1600) MAXSLOFLUX GOTO 777 ENDIF ! IF (FLUVERT.EQ.'NIL'.OR.FLUVERT.EQ.'SURFACE') THEN ! MISE A ZERO DES COEFFICIENTS DE DIFFUSION DO K=1,LEVMAX EPONGE(K) = 0.0 END DO ENDIF ! ! IF ((CLIMAT .OR. STRATOS) .AND. RADFIX) THEN ! LES MODES CLIMAT ET STRATOS ! DOIVENT UTILISER RADFIX=FAUX RADFIX = .FALSE. if (prout) WRITE(6,2000) ENDIF ! ! IF (FOMIC) THEN ! IF(RADIA.NE.'NEWRAD') THEN if (prout) WRITE(6,2100) GOTO 777 ENDIF ! IF(RADFIX) THEN if (prout) WRITE(6,2200) GOTO 777 ENDIF ! ENDIF ! IF ( PCPTYPE.EQ.'BOURGE')THEN IF (STCOND.EQ.'EXC' .OR. $ STCOND.EQ.'EXCRIG' .OR. $ STCOND.EQ.'MY_SM' .OR. $ STCOND.EQ.'MY_DM' .OR. $ STCOND.EQ.'MY_TM' ) THEN if (prout) WRITE(6,2300) GOTO 777 ENDIF ENDIF ! IF ( PCPTYPE.EQ.'BOURGE3D')THEN IF (STCOND.NE.'CONSUN' .OR. $ CONVEC.NE.'KFC' ) THEN if (prout) WRITE(6,2400) GOTO 777 ENDIF ENDIF ! ! ---------------------------------------------------- ! CHECK THE VALIDITY OF THE CHOSEN OPTIONS ! AND ! DEFINE INTEGER EQUIVALENTS TO CHARACTER TYPE OPTIONS ! ---------------------------------------------------- ! ! IF (CONVEC.EQ.'NIL') THEN ICONVEC = 0 ELSE IF (CONVEC.EQ.'SEC') THEN ICONVEC = 1 ELSE IF (CONVEC.EQ.'MANABE') THEN ICONVEC = 2 ELSE IF (CONVEC.EQ.'OLDKUO') THEN ICONVEC = 3 ELSE IF (CONVEC.EQ.'FCP') THEN ICONVEC = 5 ELSE IF (CONVEC.EQ.'KFC') THEN ICONVEC = 6 ELSE IF (CONVEC.EQ.'KUOSTD') THEN ICONVEC = 7 ELSE IF (CONVEC.EQ.'KUOSYM') THEN ICONVEC = 8 ELSE IF (CONVEC.EQ.'KUOSUN') THEN ICONVEC = 9 ELSE IF (CONVEC.EQ.'RAS') THEN ICONVEC =10 ELSE IF (CONVEC.EQ.'FCPKUO') THEN ICONVEC =11 ELSE IF (CONVEC.EQ.'KFCKUO2') THEN ICONVEC =12 ELSE IF (CONVEC.EQ.'BECHTOLD') THEN ICONVEC =13 ELSE if (prout) then WRITE(6,1000) 'CONVEC','NIL,SEC,MANABE,OLDKUO,FCP,KFC, ' WRITE(6,1010) 'KUOSTD,KUOSYM,KUOSUN,RAS, ' WRITE(6,1010) 'FCPKUO2,FCPKUO,KFCKUO2,BECHTOLD ' WRITE(6,1020) endif goto 777 ENDIF IF (FLUVERT.EQ.'NIL') THEN IFLUVERT = 0 ELSE IF (FLUVERT.EQ.'SURFACE') THEN IFLUVERT = -1 ELSE IF (FLUVERT.EQ.'PHYSIMP') THEN IFLUVERT = 1 ELSE IF (FLUVERT.EQ.'CLEF') THEN IFLUVERT = 2 ELSE IF (FLUVERT.EQ.'MOISTKE') THEN IFLUVERT = 3 ELSE if (prout) WRITE(6,1100) 'FLUVERT','MOISTKE,CLEF,PHYSIMP,NIL' goto 777 ENDIF IF (GWDRAG.EQ.'NIL') THEN IGWDRAG = 0 ELSE IF (GWDRAG.EQ.'GWD86') THEN IGWDRAG = 1 ELSE IF (GWDRAG.EQ.'GWD95') THEN IGWDRAG = 2 ELSE if (prout) WRITE(6,1100) 'GWDRAG','NIL, GWD86, GWD95' goto 777 ENDIF IF (KFCPCP.EQ.'ORI') THEN IKFCPCP = 0 ELSE IF (KFCPCP.EQ.'CONSPCPN') THEN IKFCPCP = 1 ELSE if (prout) WRITE(6,1100) 'KFCPCP',' ORI, CONSPCPN' goto 777 ENDIF IF (LONGMEL.EQ.'BLAC62') THEN ILONGMEL= 0 ELSE IF (LONGMEL.EQ.'BOUJO') THEN ILONGMEL= 1 ELSE if (prout) WRITE(6,1100) 'LONGMEL','BLAC62, BOUJO ' goto 777 ENDIF IF (RADIA.EQ.'NIL') THEN IRADIA = 0 ELSE IF (RADIA.EQ.'OLDRAD') THEN IRADIA = 1 ELSE IF (RADIA.EQ.'NEWRAD') THEN IRADIA = 2 ELSE IF (RADIA.EQ.'CCCMARAD') THEN IRADIA = 3 ELSE if (prout) WRITE(6,1100) 'RADIA','NIL,OLDRAD,NEWRAD,CCCMARAD' goto 777 ENDIF IF (SHLCVT(1).EQ.'NIL') THEN ISHLCVT(1) = 0 ELSE IF (SHLCVT(1).EQ.'GELEYN') THEN ISHLCVT(1) = 1 ELSE IF (SHLCVT(1).EQ.'CONRES') THEN ISHLCVT(1) = 2 ELSE IF (SHLCVT(1).EQ.'SHALOW') THEN ISHLCVT(1) = 3 ELSE IF (SHLCVT(1).EQ.'SHALODQC') THEN ISHLCVT(1) = 4 ELSE if (prout) $ WRITE(6,1100) 'SHLCVT(1)','NIL,GELEYN,CONRES,SHALOW,SHALODQC' goto 777 ENDIF * IF (SHLCVT(2).EQ.'NIL') THEN ISHLCVT(2) = 0 ELSE IF (SHLCVT(2).EQ.'KTRSNT') THEN ISHLCVT(2) = 1 ELSE IF (SHLCVT(2).EQ.'KTRSNT_MG') THEN ISHLCVT(2) = 2 ELSE IF (SHLCVT(2).EQ.'BECHTOLD') THEN ISHLCVT(3) = 3 ELSE if (prout) WRITE(6,1100) 'SHLCVT(2)','NIL, KTRSNT, KTRSNT_MG,BECHTOLD' goto 777 ENDIF IF (STCOND.EQ.'NIL') THEN ISTCOND = 0 ELSE IF (STCOND.EQ.'CONDS') THEN ISTCOND = 1 ELSE IF (STCOND.EQ.'NEWSUND') THEN ISTCOND = 3 ELSE IF (STCOND.EQ.'CONSUN') THEN ISTCOND = 4 ELSE IF (STCOND.EQ.'EXC') THEN !Tremblay (mixed-phase) ISTCOND = 5 ELSE IF (STCOND.EQ.'EXCRIG') THEN !Kong-Yau ISTCOND = 9 ELSE IF (STCOND.EQ.'MY_SM') THEN !Milbrandt-Yau, single-moment (optimized) ISTCOND = 10 ! ELSE IF (STCOND.EQ.'MY_EXP1') THEN !Milbrandt-Yau - FUTURE VERSION, NOT YET AVAILABLE ! ISTCOND = 11 ELSE IF (STCOND.EQ.'MY_DM') THEN !Milbrandt-Yau, double-moment ISTCOND = 12 ! ELSE IF (STCOND.EQ.'MY_EXP2') THEN !Milbrandt-Yau - FUTURE VERSION, NOT YET AVAILABLE ! ISTCOND = 13 ELSE IF (STCOND.EQ.'MY_TM') THEN !Milbrandt-Yau, triple-moment (optional multi-moment) ISTCOND = 14 ELSE if (prout) WRITE(6,1100) 'STCOND', + 'NIL,CONDS,NEWSUND,CONSUN,EXC,EXCRIG,MY_SM,MY_DM,MY_TM)' goto 777 ENDIF IF (SCHMSOL.EQ.'NIL') THEN ISCHMSOL = 0 ELSE IF (SCHMSOL.EQ.'FCREST') THEN ISCHMSOL = 1 ELSE IF (SCHMSOL.EQ.'CLASS') THEN ISCHMSOL = 2 ELSE IF (SCHMSOL.EQ.'ISBA') THEN ISCHMSOL = 3 ELSE if (prout) WRITE(6,1100) 'SCHMSOL', + 'NIL, FCREST, CLASS, ISBA' goto 777 ENDIF IF (SCHMURB.EQ.'NIL') THEN ISCHMURB = 0 ELSE IF (SCHMURB.EQ.'TEB') THEN ISCHMURB = 1 ELSE if (prout) WRITE(6,1100) 'SCHMURB','NIL, TEB' goto 777 ENDIF IF (PCPTYPE.EQ.'NIL') THEN IPCPTYPE = 0 ELSE IF (PCPTYPE.EQ.'BOURGE') THEN IPCPTYPE = 1 ELSE IF (PCPTYPE.EQ.'BOURGE3D') THEN IPCPTYPE = 2 ELSE if (prout) WRITE(6,1100) 'PCPTYPE','NIL,BOURGE,BOURGE3D' goto 777 ENDIF ! ! ---------------------------------------------------- ! IF ((RADSLOPE).AND.(RADIA.NE.'CCCMARAD')) THEN IF (PROUT) WRITE(6,1705) 'RADSLOPE',RADSLOPE, + 'RADIA ',RADIA GOTO 777 ENDIF ! DEFINE SOME RADIATION OPTIONS ! ---------------------------------------------------- ! ! the following comdeck is shared with SAVE_OPTIONS ! #include "cldopt_mode.cdk"
! ! ---------------------------------------------------- ! DEFINE THE ERROR CODE ! ---------------------------------------------------- ! 666 continue ! check_options = 1 ! 777 continue ! ! ---------------------------------------------------- ! FORMATS ! ---------------------------------------------------- ! ! 1000 FORMAT (2(1x,60('*')/),1x,'*',58(' '),'*'/ + 1x,5('***** ABORT'),'*****'/1x,'*',58(' '),'*'/ + ' *',2(' '),"FUNCTION CHECK_OPTIONS: INVALID OPTION: '",A8,"'", + 5(' '),'*'/' * ','ALLOWED: ',a,13(' '),'*') 1010 FORMAT (' * ',a,13(' '),'*') 1020 FORMAT (1x,'*',58(' '),'*',/2(1x,60('*')/)) ! 1101 format ( 2(/58('*'))/'*',56x,'*'/4('****** ABORT '),'******'/ + / '* FUNCTION CHECK_OPTIONS: ILLEGAL VALUE', + / '* FOR OPTION ',a,': ',a, + / '* ALLOWED: ',A//58('*')) 1100 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * FUNCTION CHECK_OPTIONS: ILLEGAL VALUE *', + / ' * FOR OPTION ', A9, ' *', + / ' * ALLOWED :',A,' *', + / ' * *', + / ' *****************************************', + / ' *****************************************') ! 1200 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * FUNCTION CHECK_OPTIONS: *', + / ' * *', + / ' * IF CONVEC = MANABE *', + / ' * *', + / ' * OR IF *', + / ' * *', + / ' * IF CONVEC = SEC *', + / ' * *', + / ' * THEN USE *', + / ' * *', + / ' * STCOND = NIL *', + / ' * *', + / ' *****************************************', + / ' *****************************************') * 1300 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * FUNCTION CHECK_OPTIONS: *', + / ' * *', + / ' * IF CONVEC = NEWKUO *', + / ' * *', + / ' * *', + / ' * THEN USE *', + / ' * *', + / ' * STCOND = NEWSUND *', + / ' * *', + / ' *****************************************', + / ' *****************************************') ! 1400 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * FUNCTION CHECK_OPTIONS: *', + / ' * *', + / ' * IF STCOND = CONSUN *', + / ' * *', + / ' * THEN USE *', + / ' * *', + / ' * KUOSTD *', + / ' * CONVEC = KUOSYM *', + / ' * KUOSUN *', + / ' * RAS *', + / ' * FCP *', + / ' * FCPKUO *', + / ' * KFC *', + / ' * BECHTOLD *', + / ' * *', + / ' * *', + / ' *****************************************', + / ' *****************************************') ! 1500 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * FUNCTION CHECK_OPTIONS: *', + / ' * *', + / ' * IF CONVEC = FCPKUO, KUOSYM, *', + / ' * KUOSTD OR KUOSUN, *', + / ' * *', + / ' * THEN USE *', + / ' * *', + / ' * STCOND = CONSUN *', + / ' * *', + / ' * *', + / ' *****************************************', + / ' *****************************************') ! 1600 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * FUNCTION CHECK_OPTIONS: *', + / ' * *', + / ' * NSLOFLUX CANNOT EXCEED *', + / ' * A VALUE OF',I3, 21X, '*', + / ' * *', + / ' * *', + / ' *****************************************', + / ' *****************************************') * 1700 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * CHECK_OPTIONS: INVALID COMBINATION *', + / ' * OF OPTIONS : ', A16,2x,A8, ' *', + / ' * *', + / ' *****************************************', + / ' *****************************************') ! ! 1705 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * CHECK_OPTIONS: INVALID COMBINATION *', + / ' * OF OPTIONS : ', A16,2x,A8, ' *', + / ' * ', A16,2x,A8, ' *', + / ' * *', + / ' *****************************************', + / ' *****************************************') ! 1800 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * INVALID VALUE FOR OPTION *', + / ' * ', A8,' : ',I4, ' *', + / ' * *', + / ' *****************************************', + / ' *****************************************') ! 1900 FORMAT( ' *****************************************************', + / ' *****************************************************', + / ' * *', + / ' * FUNCTION CHECK_OPTIONS, OPTION RADNIV: *', + / ' * ',A, + / ' * *', + / ' *****************************************************', + / ' *****************************************************') ! 2000 FORMAT ( ' RADFIX SET TO .FALSE. FOR CLIMATE OR STRATOS MODE ') ! 2100 FORMAT ( ' FOMIC MUST BE USED WITH NEWRAD') ! 2200 FORMAT ( ' FOMIC AND RADFIX ARE INCOMPATIBLE') ! 2300 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * CHECK_OPTIONS: INVALID COMBINATION *', + / ' * *', + / ' * IF PCPTYPE = BOURGE *', + / ' * *', + / ' * THEN YOU CANNOT USE ANY OF STCOND:*', + / ' * *', + / ' * EXC, EXCRIG, *', + / ' * MY_SM, MY_DM, or MY_TM *', + / ' * *', + / ' *****************************************', + / ' *****************************************') ! 2400 FORMAT ( ' *****************************************', + / ' *****************************************', + / ' * *', + / ' ***** ABORT ***** ABORT ***** ABORT *****', + / ' * *', + / ' * S/R PHYDEBU4: INVALID COMBINATION *', + / ' * *', + / ' * IF PCPTYPE = BOURGE3D *', + / ' * *', + / ' * THEN YOU CAN OLY USE *', + / ' * *', + / ' * CONSUN and KFC *', + / ' * *', + / ' *****************************************', + / ' *****************************************') ! ! return end