MODULE module_check_a_mundo USE module_state_description USE module_wrf_error USE module_configure IMPLICIT NONE CONTAINS SUBROUTINE check_nml_consistency IMPLICIT NONE LOGICAL :: exists, vnest LOGICAL , EXTERNAL :: wrf_dm_on_monitor INTEGER :: i, j, oops, d1_value LOGICAL :: km_opt_already_done , diff_opt_already_done INTEGER :: count_opt LOGICAL :: rinblw_already_done INTEGER :: count_fatal_error count_fatal_error = 0 model_config_rec % wrf_hydro = 0 do i=1,model_config_rec%max_dom if(model_config_rec%corral_x(i)<5) then call wrf_message("Corral X distance must be at least 5 due to intermediate domain halos.") model_config_rec%corral_x(i)=5 endif if(model_config_rec%corral_y(i)<5) then call wrf_message("Corral Y distance must be at least 5 due to intermediate domain halos.") model_config_rec%corral_y(i)=5 endif enddo DO i = 1, model_config_rec % max_dom IF ( model_config_rec % mp_physics(i) == nssl_2mom .OR. & model_config_rec % mp_physics(i) == nssl_2momccn .OR. & model_config_rec % mp_physics(i) == nssl_1mom .OR. & model_config_rec % mp_physics(i) == nssl_1momlfo .OR. & model_config_rec % mp_physics(i) == nssl_2momg ) THEN wrf_err_message = '--- ERROR: Chosen microphysics scheme cannot run with WRF-NMM ' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- Fix mp_physics in namelist.input ' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF ENDDO DO i = 2, model_config_rec % max_dom IF ( model_config_rec % sf_surface_physics(i) .NE. & model_config_rec % sf_surface_physics(1) ) THEN wrf_err_message = '--- ERROR: sf_surface_physics must be equal for all domains ' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- Fix sf_surface_physics in namelist.input ' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF ENDDO DO i = 2, model_config_rec % max_dom IF ( model_config_rec % sf_sfclay_physics(i) .NE. & model_config_rec % sf_sfclay_physics(1) ) THEN wrf_err_message = '--- ERROR: sf_sfclay_physics must be equal for all domains ' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- Fix sf_sfclay_physics in namelist.input ' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF ENDDO DO i = 2, model_config_rec % max_dom IF ( model_config_rec % mp_physics(i) .NE. & model_config_rec % mp_physics(1) ) THEN wrf_err_message = '--- NOTE: mp_physics must be equal for all domains ' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- NOTE: ----> Setting all mp_physics entries to value defined in the inner most domain' CALL wrf_message ( TRIM( wrf_err_message ) ) END IF ENDDO d1_value = model_config_rec%mp_physics(model_config_rec % max_dom) DO i = 1, model_config_rec % max_dom-1 model_config_rec%mp_physics(i) = d1_value END DO DO i = 2, model_config_rec % max_dom IF ( model_config_rec % ra_lw_physics(i) .NE. & model_config_rec % ra_lw_physics(1) ) THEN wrf_err_message = '--- ERROR: ra_lw_physics must be equal for all domains ' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- Fix ra_lw_physics in namelist.input ' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF ENDDO DO i = 2, model_config_rec % max_dom IF ( model_config_rec % ra_sw_physics(i) .NE. & model_config_rec % ra_sw_physics(1) ) THEN wrf_err_message = '--- ERROR: ra_sw_physics must be equal for all domains ' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- Fix ra_sw_physics in namelist.input ' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF ENDDO IF ( ( model_config_rec % use_wps_input == 0 ) .AND. & ( model_config_rec % time_step .EQ. -1 ) ) THEN wrf_err_message = '--- ERROR: Known problem. time_step must be set to a positive integer' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF DO i = 2, model_config_rec % max_dom IF ( ( model_config_rec % bl_pbl_physics(i) .NE. model_config_rec % bl_pbl_physics(1) ) .AND. & ( model_config_rec % bl_pbl_physics(i) .NE. 0 ) ) THEN wrf_err_message = '--- ERROR: bl_pbl_physics must be equal for all domains (or = zero)' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- Fix bl_pbl_physics in namelist.input ' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF ENDDO DO i = 2, model_config_rec % max_dom IF ( ( model_config_rec % cu_physics(i) .NE. model_config_rec % cu_physics(1) ) .AND. & ( model_config_rec % cu_physics(i) .NE. 0 ) ) THEN wrf_err_message = '--- ERROR: cu_physics must be equal for all domains (or = zero)' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- Fix cu_physics in namelist.input ' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF ENDDO IF ( ( model_config_rec%fractional_seaice .EQ. 0 ).AND. & ( model_config_rec%tice2tsk_if2cold ) ) THEN wrf_err_message = '--- WARNING: You set tice2tsk_if2cold = .true., but fractional_seaice = 0' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- WARNING: tice2tsk_if2cold will have no effect on results.' CALL wrf_message ( wrf_err_message ) END IF DO i = 1, model_config_rec % max_dom IF ( ( model_config_rec%fine_input_stream(i) .NE. 0 ).AND. & ( model_config_rec%io_form_auxinput2 .EQ. 0 ) ) THEN wrf_err_message = '--- ERROR: If fine_input_stream /= 0, io_form_auxinput2 must be /= 0' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- Set io_form_auxinput2 in the time_control namelist (probably to 2).' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF ENDDO DO i = 1, model_config_rec % max_dom IF ( model_config_rec%sf_surface_physics(i) == NOAHMPSCHEME ) THEN WRITE(wrf_err_message, '(" --- ERROR: Noah-MP LSM scheme (sf_surface_physics==", I2, ")")') NOAHMPSCHEME CALL wrf_message ( TRIM ( wrf_err_message ) ) WRITE(wrf_err_message, '(" does not work with NMM ")') CALL wrf_message ( TRIM ( wrf_err_message ) ) WRITE(wrf_err_message, '("Select a different LSM scheme ")') CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF END DO IF ( model_config_rec%traj_opt /= 0 ) THEN wrf_err_message = 'Trajectories not supported in NMM core ' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF IF ( model_config_rec%sst_update .EQ. 0 ) THEN model_config_rec%io_form_auxinput4 = 0 DO i = 1, model_config_rec % max_dom WRITE (wrf_err_message, FMT='(A,A)') '--- NOTE: sst_update is 0, ', & 'setting io_form_auxinput4 = 0 and auxinput4_interval = 0 for all domains' CALL wrf_message ( wrf_err_message ) model_config_rec%auxinput4_interval(i) = 0 model_config_rec%auxinput4_interval_y(i) = 0 model_config_rec%auxinput4_interval_d(i) = 0 model_config_rec%auxinput4_interval_h(i) = 0 model_config_rec%auxinput4_interval_m(i) = 0 model_config_rec%auxinput4_interval_s(i) = 0 ENDDO ELSE IF ( model_config_rec%io_form_auxinput4 .EQ. 0 ) THEN wrf_err_message = '--- ERROR: If sst_update /= 0, io_form_auxinput4 must be /= 0' CALL wrf_message ( wrf_err_message ) wrf_err_message = '--- Set io_form_auxinput4 in the time_control namelist (probably to 2).' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF END IF IF ( model_config_rec%sst_update .EQ. 1 ) THEN IF ( model_config_rec%io_form_auxinput4 .EQ. 0 ) THEN wrf_err_message = '--- ERROR: If sst_update /= 0, io_form_auxinput4 must be /= 0' CALL wrf_debug ( 0, TRIM(wrf_err_message) ) wrf_err_message = '--- Set io_form_auxinput4 in the time_control namelist (probably to 2).' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF IF ( ( model_config_rec%auxinput4_interval(1) .EQ. 0 ) .AND. & ( model_config_rec%auxinput4_interval_y(1) .EQ. 0 ) .AND. & ( model_config_rec%auxinput4_interval_d(1) .EQ. 0 ) .AND. & ( model_config_rec%auxinput4_interval_h(1) .EQ. 0 ) .AND. & ( model_config_rec%auxinput4_interval_m(1) .EQ. 0 ) .AND. & ( model_config_rec%auxinput4_interval_s(1) .EQ. 0 ) ) THEN wrf_err_message = '--- ERROR: If sst_update /= 0, one of the auxinput4_interval settings must be /= 0' CALL wrf_debug ( 0, TRIM(wrf_err_message) ) wrf_err_message = '--- Set auxinput4_interval_s to the same value as interval_seconds (usually a pretty good guess).' CALL wrf_debug ( 0, TRIM( wrf_err_message ) ) count_fatal_error = count_fatal_error + 1 END IF END IF IF ( ( model_config_rec % ra_lw_physics(1) .EQ. RRTMG_LWSCHEME ) .OR. & ( model_config_rec % ra_sw_physics(1) .EQ. RRTMG_SWSCHEME ) .OR. & ( model_config_rec % ra_lw_physics(1) .EQ. RRTMG_LWSCHEME_FAST ) .OR. & ( model_config_rec % ra_sw_physics(1) .EQ. RRTMG_SWSCHEME_FAST ) ) THEN wrf_err_message = '--- NOTE: RRTMG radiation is used, namelist ' // & 'value for o3input (ozone input) is used ' ELSE model_config_rec % o3input = 0 wrf_err_message = '--- NOTE: RRTMG radiation is not used, setting: ' // & 'o3input=0 to avoid data pre-processing' CALL wrf_message ( wrf_err_message ) END IF IF ( model_config_rec%cldovrlp .lt. 1 .OR. model_config_rec%cldovrlp .gt. 5) THEN wrf_err_message = '--- ERROR: cldovrlp value must be between 1 and 5' CALL wrf_message( wrf_err_message ) count_fatal_error = count_fatal_error + 1 END IF IF ( count_fatal_error .GT. 0 ) THEN WRITE (wrf_err_message, FMT='(A,I6, A)') 'NOTE: ', count_fatal_error, & ' namelist settings are wrong. Please check and reset these options' CALL wrf_error_fatal3("",389,& wrf_err_message ) END IF END SUBROUTINE check_nml_consistency SUBROUTINE setup_physics_suite USE module_domain, ONLY : change_to_lower_case IMPLICIT NONE END SUBROUTINE setup_physics_suite SUBROUTINE set_physics_rconfigs IMPLICIT NONE INTEGER :: numsoiltemp , nummosaictemp INTEGER :: i IF ( model_config_rec % sf_surface_mosaic .EQ. 1 ) THEN numsoiltemp = model_config_rec % num_soil_layers nummosaictemp = model_config_rec % mosaic_cat model_config_rec % mosaic_cat_soil = numsoiltemp * nummosaictemp wrf_err_message = '--- NOTE: Noah-mosaic is in use, setting: ' // & 'mosaic_cat_soil = mosaic_cat * num_soil_layers' CALL wrf_message ( wrf_err_message ) END IF IF (( model_config_rec % ra_lw_physics(1) .EQ. CAMLWSCHEME ) .OR. & ( model_config_rec % ra_sw_physics(1) .EQ. CAMSWSCHEME )) THEN model_config_rec % paerlev = 29 model_config_rec % levsiz = 59 model_config_rec % cam_abs_dim1 = 4 model_config_rec % cam_abs_dim2 = model_config_rec % e_vert(1) wrf_err_message = '--- NOTE: CAM radiation is in use, setting: ' // & 'paerlev=29, levsiz=59, cam_abs_dim1=4, cam_abs_dim2=e_vert' CALL wrf_message ( wrf_err_message ) END IF DO i = 1, model_config_rec % max_dom IF ( ( model_config_rec % mp_physics(i) .EQ. MILBRANDT2MOM ) .OR. & ( model_config_rec % do_radar_ref .EQ. 1 ) ) THEN model_config_rec % compute_radar_ref = 1 END IF ENDDO IF (( model_config_rec % ra_lw_physics(1) .EQ. RRTMG_LWSCHEME ) .OR. & ( model_config_rec % ra_sw_physics(1) .EQ. RRTMG_SWSCHEME )) THEN model_config_rec % levsiz = 59 model_config_rec % alevsiz = 12 model_config_rec % no_src_types = 6 wrf_err_message = '--- NOTE: RRTMG radiation is in use, setting: ' // & 'levsiz=59, alevsiz=12, no_src_types=6' CALL wrf_message ( wrf_err_message ) END IF IF ( model_config_rec % sf_surface_physics(1) .EQ. 0 ) & model_config_rec % num_soil_layers = 5 IF ( model_config_rec % sf_surface_physics(1) .EQ. SLABSCHEME ) & model_config_rec % num_soil_layers = 5 IF ( model_config_rec % sf_surface_physics(1) .EQ. LSMSCHEME ) & model_config_rec % num_soil_layers = 4 IF ( model_config_rec % sf_surface_physics(1) .EQ. NOAHMPSCHEME ) & model_config_rec % num_soil_layers = 4 IF ( model_config_rec % sf_surface_physics(1) .EQ. RUCLSMSCHEME .AND. & (model_config_rec % num_soil_layers .NE. 6 .AND. model_config_rec % num_soil_layers .NE. 9) ) & model_config_rec % num_soil_layers = 6 IF ( model_config_rec % sf_surface_physics(1) .EQ. PXLSMSCHEME ) & model_config_rec % num_soil_layers = 2 IF ( model_config_rec % sf_surface_physics(1) .EQ. CLMSCHEME ) & model_config_rec % num_soil_layers = 10 IF ( model_config_rec % sf_surface_physics(1) .EQ. 88 ) & model_config_rec % num_soil_layers = 4 WRITE (wrf_err_message, FMT='(A,I6)') '--- NOTE: num_soil_layers has been set to ', & model_config_rec % num_soil_layers CALL wrf_message ( wrf_err_message ) DO i = 1, model_config_rec % max_dom IF ( ( model_config_rec % mp_physics(i) .EQ. P3_1CATEGORY ) .OR. & ( model_config_rec % mp_physics(i) .EQ. P3_1CATEGORY_NC ) ) THEN IF ( ( ( model_config_rec % ra_lw_physics(i) .EQ. RRTMG_LWSCHEME ) .OR. & ( model_config_rec % ra_lw_physics(i) .EQ. RRTMG_LWSCHEME_FAST ) ) .AND. & ( ( model_config_rec % ra_sw_physics(i) .EQ. RRTMG_SWSCHEME ) .OR. & ( model_config_rec % ra_sw_physics(i) .EQ. RRTMG_SWSCHEME_FAST ) ) ) THEN ELSE wrf_err_message = '--- ERROR: P3 MP (mp_physics=50 or 51) requires using RRTMG LW and SW schemes.' CALL wrf_error_fatal3("",541,& TRIM( wrf_err_message ) ) END IF END IF END DO END SUBROUTINE set_physics_rconfigs END MODULE module_check_a_mundo