SUBROUTINE SOLVE_NMM(GRID,CONFIG_FLAGS & ,szj,s1z,spz,tcs,moist,dfi_moist,scalar,scalar_bxs,scalar_bxe,scalar_bys,scalar_bye,scalar_btxs,scalar_btxe,scalar_btys, & scalar_btye,dfi_scalar,dfi_scalar_bxs,dfi_scalar_bxe,dfi_scalar_bys,dfi_scalar_bye,dfi_scalar_btxs,dfi_scalar_btxe, & dfi_scalar_btys,dfi_scalar_btye,chem & & ) use module_timing USE MODULE_DOMAIN, ONLY : DOMAIN, GET_IJK_FROM_GRID USE MODULE_CONFIGURE, ONLY : GRID_CONFIG_REC_TYPE USE MODULE_MODEL_CONSTANTS USE MODULE_STATE_DESCRIPTION USE MODULE_CTLBLK use MODULE_RANDOM, ONLY : rand_grid_r4 USE MODULE_DM, ONLY : LOCAL_COMMUNICATOR & ,MYTASK,NTASKS,NTASKS_X & ,NTASKS_Y USE MODULE_COMM_DM USE MODULE_IGWAVE_ADJUST, ONLY: PDTE,PFDHT,DDAMP,VTOA USE MODULE_ADVECTION, ONLY: ADVE,VAD2,HAD2 & ,ADV2,MONO & ,VAD2_SCAL,HAD2_SCAL USE MODULE_NONHY_DYNAM, ONLY: EPS,VADZ,HADZ USE MODULE_DIFFUSION_NMM, ONLY: HDIFF USE MODULE_BNDRY_COND, ONLY: BOCOH,BOCOV USE MODULE_PHYSICS_CALLS USE MODULE_EXT_INTERNAL USE MODULE_PRECIP_ADJUST USE MODULE_NEST_UTIL IMPLICIT NONE TYPE(DOMAIN),TARGET :: GRID real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33,num_szj) :: szj real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33,num_s1z) :: s1z real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33,num_spz) :: spz real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33,num_tcs) :: tcs real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33,num_moist) :: moist real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33,num_dfi_moist) :: dfi_moist real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33,num_scalar) :: scalar real ,DIMENSION(grid%sm32:grid%em32,grid%sm33:grid%em33,grid%spec_bdy_width,num_scalar) :: scalar_bxs real ,DIMENSION(grid%sm32:grid%em32,grid%sm33:grid%em33,grid%spec_bdy_width,num_scalar) :: scalar_bxe real ,DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33,grid%spec_bdy_width,num_scalar) :: scalar_bys real ,DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33,grid%spec_bdy_width,num_scalar) :: scalar_bye real ,DIMENSION(grid%sm32:grid%em32,grid%sm33:grid%em33,grid%spec_bdy_width,num_scalar) :: scalar_btxs real ,DIMENSION(grid%sm32:grid%em32,grid%sm33:grid%em33,grid%spec_bdy_width,num_scalar) :: scalar_btxe real ,DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33,grid%spec_bdy_width,num_scalar) :: scalar_btys real ,DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33,grid%spec_bdy_width,num_scalar) :: scalar_btye real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,grid%sm33:grid%em33,num_dfi_scalar) :: dfi_scalar real ,DIMENSION(grid%sm32:grid%em32,grid%sm33:grid%em33,grid%spec_bdy_width,num_dfi_scalar) :: dfi_scalar_bxs real ,DIMENSION(grid%sm32:grid%em32,grid%sm33:grid%em33,grid%spec_bdy_width,num_dfi_scalar) :: dfi_scalar_bxe real ,DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33,grid%spec_bdy_width,num_dfi_scalar) :: dfi_scalar_bys real ,DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33,grid%spec_bdy_width,num_dfi_scalar) :: dfi_scalar_bye real ,DIMENSION(grid%sm32:grid%em32,grid%sm33:grid%em33,grid%spec_bdy_width,num_dfi_scalar) :: dfi_scalar_btxs real ,DIMENSION(grid%sm32:grid%em32,grid%sm33:grid%em33,grid%spec_bdy_width,num_dfi_scalar) :: dfi_scalar_btxe real ,DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33,grid%spec_bdy_width,num_dfi_scalar) :: dfi_scalar_btys real ,DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33,grid%spec_bdy_width,num_dfi_scalar) :: dfi_scalar_btye real ,DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33,grid%sm32:grid%em32,num_chem) :: chem TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,IPS,IPE,JPS,JPE,KPS,KPE & & ,ITS,ITE,JTS,JTE,KTS,KTE INTEGER :: I,ICLTEND,IDF,IRTN,J,JC,JDF,K,KDF,LB,N_MOIST & & ,NTSD_current,L integer :: ierr,nrand,idt INTEGER,SAVE :: NTSD_restart INTEGER :: MYPROC,imid,jmid INTEGER :: KVH,NTSD_rad,RC INTEGER :: NUM_OZMIXM,NUM_AEROSOLC REAL :: DT_INV,FICE,FRAIN,GPS,QI,QR,QW,WC,WP LOGICAL :: LAST_TIME,OPERATIONAL_PHYSICS,ETAMP_PHYSICS CHARACTER(80) :: MESSAGE INTEGER :: ISTAT,DOM,one LOGICAL :: HF REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:) :: PPTDAT REAL,ALLOCATABLE,DIMENSION(:,:,:) :: TTEN,QTEN REAL,ALLOCATABLE,DIMENSION(:,:,:) :: RTHRATEN,RTHBLTEN,RQVBLTEN LOGICAL wrf_dm_on_monitor EXTERNAL wrf_dm_on_monitor real,save :: solve_tim,exch_tim,pdte_tim,adve_tim,vtoa_tim & &, vadz_tim,hadz_tim,eps_tim,vad2_tim,had2_tim & &, radiation_tim,rdtemp_tim,turbl_tim,cltend_tim & &, cucnvc_tim,gsmdrive_tim,hdiff_tim,bocoh_tim & &, pfdht_tim,ddamp_tim,bocov_tim,uv_htov_tim,sum_tim & &, adjppt_tim real,save :: exch_tim_max real :: btim,btimx real :: et_max,this_tim integer :: n_print_time real*8 :: timef LOGICAL :: EULER INTEGER :: IDTADT INTEGER :: IDTADC INTEGER :: KS REAL,SAVE :: SUMDRRW CALL DOMAIN_CLOCK_GET(GRID,ADVANCEcOUNT=NTSD_current) IF(NTSD_current==0)THEN IF(GRID%RESTART.AND.GRID%TSTART>0.)THEN IHRST=grid%nstart_hour NTSD_restart=grid%ntsd ELSE IHRST=GRID%GMT grid%nstart_hour=IHRST NTSD_restart=0 ENDIF ENDIF grid%ntsd=NTSD_restart+NTSD_current LAST_TIME=domain_last_time_step(GRID) WRITE(MESSAGE,125)grid%ntsd,grid%ntsd*GRID%DT/3600. 125 FORMAT(' SOLVE_NMM: TIMESTEP IS ',I5,' TIME IS ',F7.3,' HOURS') CALL WRF_MESSAGE(TRIM(MESSAGE)) EULER=model_config_rec%EULER_ADV IDTADT=model_config_rec%IDTADT IDTADC=model_config_rec%IDTADC WP=model_config_rec%WP(grid%id) CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP) CALL WRF_GET_NPROC(NPES) CALL WRF_GET_MYPROC(MYPROC) MYPE=MYPROC CALL GET_IJK_FROM_GRID(GRID & & ,IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,IPS,IPE,JPS,JPE,KPS,KPE ) CALL SET_TILES(GRID,IDS,IDE,JDS,JDE,IPS,IPE,JPS,JPE) ETAMP_PHYSICS=.FALSE. IF (CONFIG_FLAGS%MP_PHYSICS == ETAMPNEW .OR. & & CONFIG_FLAGS%MP_PHYSICS == ETAMPOLD .OR. & & CONFIG_FLAGS%MP_PHYSICS == ETAMP_HWRF ) THEN ETAMP_PHYSICS=.TRUE. ENDIF OPERATIONAL_PHYSICS=.FALSE. IF(CONFIG_FLAGS%RA_SW_PHYSICS ==GFDLSWSCHEME.AND. & & CONFIG_FLAGS%RA_LW_PHYSICS ==GFDLLWSCHEME.AND. & & CONFIG_FLAGS%SF_SFCLAY_PHYSICS==MYJSFCSCHEME.AND. & & CONFIG_FLAGS%BL_PBL_PHYSICS ==MYJPBLSCHEME.AND. & & CONFIG_FLAGS%CU_PHYSICS ==BMJSCHEME.AND. & & ETAMP_PHYSICS ) THEN OPERATIONAL_PHYSICS=.TRUE. ENDIF ALLOCATE(TTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT) ALLOCATE(QTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT) ALLOCATE(RTHBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT) ALLOCATE(RQVBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT) ALLOCATE(RTHRATEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT) IF(CONFIG_FLAGS%CU_PHYSICS==GDSCHEME)THEN DO J=JMS,JME DO K=KMS,KME DO I=IMS,IME TTEN(I,K,J)=grid%t(I,J,K) QTEN(I,K,J)=grid%q(I,J,K) ENDDO ENDDO ENDDO ENDIF GRID%SIGMA=1 IF (config_flags%non_hydrostatic) THEN grid%hydro=.FALSE. ELSE grid%hydro=.TRUE. ENDIF IDF=IDE-1 JDF=JDE-1 KDF=KDE-1 ITS=IPS ITE=MIN(IPE,IDF) JTS=JPS JTE=MIN(JPE,JDF) KTS=KPS KTE=MIN(KPE,KDF) if(grid%ntsd==0)then write(message,*)' its=',its,' ite=',ite call wrf_message(trim(message)) write(message,*)' jts=',jts,' jte=',jte call wrf_message(trim(message)) write(message,*)' kts=',kts,' kte=',kte call wrf_message(trim(message)) endif if(grid%ntsd==0)then solve_tim=0. exch_tim=0. pdte_tim=0. adve_tim=0. vtoa_tim=0. vadz_tim=0. hadz_tim=0. eps_tim=0. vad2_tim=0. had2_tim=0. radiation_tim=0. rdtemp_tim=0. turbl_tim=0. cltend_tim=0. cucnvc_tim=0. gsmdrive_tim=0. hdiff_tim=0. bocoh_tim=0. pfdht_tim=0. ddamp_tim=0. bocov_tim=0. uv_htov_tim=0. exch_tim_max=0. adjppt_tim=0. endif N_MOIST=NUM_MOIST DO J=max(jds+( 0 ),jts-( 4 )),min(jde-( 0 ),jte+( 4 )) grid%iheg(J)=MOD(J+1,2) grid%ihwg(J)=grid%iheg(J)-1 grid%iveg(J)=MOD(J,2) grid%ivwg(J)=grid%iveg(J)-1 ENDDO DO J=max(jds+( 0 ),jts-( 4 )),min(jde-( 0 ),jte+( 4 )) grid%ivw(J)=grid%ivwg(J) grid%ive(J)=grid%iveg(J) grid%ihe(J)=grid%iheg(J) grid%ihw(J)=grid%ihwg(J) ENDDO LB=2*(IDF-IDS+1)+(JDF-JDS+1)-3 JC=JMS+(JME-JMS)/2 GPS=SQRT(grid%dx_nmm(IMS,JC)**2+grid%dy_nmm**2) TSPH=3600./GRID%DT n_print_time=nint(3600./grid%dt) NBOCO=0 IF(GRID%PCPFLG.AND..NOT.ALLOCATED(PPTDAT))THEN ALLOCATE(PPTDAT(IMS:IME,JMS:JME,3),STAT=ISTAT) ENDIF IF (grid%ntsd==0) THEN IF (GRID%PCPFLG) THEN CALL READPCP(PPTDAT,grid%ddata,grid%lspa & & ,IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE) ENDIF ENDIF btim=timef() randif: IF(in_use_for_config(grid%id,'random')) THEN nrand=config_flags%nrand if(nrand==0) nrand=grid%ncnvc if(nrand==0) nrand=1 IDT=MOD(grid%NTSD,nrand) IF(IDT.EQ.0 .OR. grid%NTSD .EQ. 0)THEN call start_timing call wrf_message('Update random numbers...') one=1 imid=(its+ite)/2 ; jmid=(jts+jte)/2 write(0,'(A,": random(",I0,",",I0,") = ",E15.10)') 'before call',imid,jmid,grid%random(imid,jmid) call rand_grid_r4(grid%randstate1,grid%randstate2, & grid%randstate3,grid%randstate4, & grid%random, & IDS,IDE,JDS,JDE,one,one, & IMS,IME,JMS,JME,one,one, & ITS,ITE,JTS,JTE,one,one) write(0,'(A,": random(",I0,",",I0,") = ",E15.10)') 'after call',imid,jmid,grid%random(imid,jmid) call end_timing('Updating random numbers') ENDIF ENDIF randif CALL BUCKETS(grid%ntsd,grid%nprec,grid%nsrfc,grid%nrdsw,grid%nrdlw & & ,GRID%RESTART,GRID%TSTART & & ,grid%nclod,grid%nheat,GRID%NPHS,TSPH & & ,grid%acprec,grid%cuprec,grid%acsnow,grid%acsnom,grid%ssroff,grid%bgroff & & ,grid%sfcevp,grid%potevp,grid%sfcshx,grid%sfclhx,grid%subshx,grid%snopcx & & ,grid%sfcuvx,grid%potflx & & ,grid%ardsw,grid%aswin,grid%aswout,grid%aswtoa & & ,grid%ardlw,grid%alwin,grid%alwout,grid%alwtoa & & ,grid%acfrst,grid%ncfrst,grid%acfrcv,grid%ncfrcv & & ,grid%avcnvc,grid%avrain,grid%tcucn,grid%train & & ,grid%asrfc & & ,grid%t,grid%tlmax,grid%tlmin,grid%tshltr,grid%pshltr,grid%qshltr & & ,grid%t02_max,grid%t02_min,grid%rh02_max,grid%rh02_min & & ,IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE) IF(grid%ntsd==0)THEN FIRST=.TRUE. btimx=timef() grid%mommix=amin1(grid%mommix,1.0) IF(EULER) THEN SUMDRRW=0. DO K=KTS,KTE DO J=JMS,JME DO I=IMS,IME grid%rrw(I,J,K)=0. IF(I>=IDE/2-6.AND.I<=IDE/2+6.AND. & J>=JDE/2-6.AND.J<=JDE/2+6 ) THEN grid%rrw(I,J,K)=10.0 ENDIF ENDDO ENDDO ENDDO DO KS=PARAM_FIRST_SCALAR,NUM_SZJ DO K=KMS,KME DO J=JMS,JME DO I=IMS,IME SZJ(I,J,K,KS)=0. S1Z(I,J,K,KS)=0. SPZ(I,J,K,KS)=0. TCS(I,J,K,KS)=0. ENDDO ENDDO ENDDO ENDDO ENDIF