SUBROUTINE arpsolve( mptr ) 1,102
!*********************************************************************
! call the model solver to step grid mptr forward for one time step.
!
! Implementation for ARPS 4.0
! Author: Ming Xue, 10/27/1992
!
! Updates: E.J.Adlerman
! August 1995 for Arps4.0.22
!
! Yuhe Liu
! Nov. 14 1996 for ARPS 4.2.2
!
!*********************************************************************
INCLUDE 'nodal.inc'
INCLUDE 'agrialloc.inc'
INCLUDE 'agrigrid.inc'
INCLUDE 'agricpu.inc'
INCLUDE 'globcst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'exbc.inc'
INCLUDE 'radcst.inc'
INTEGER :: ncalls
DATA ncalls /0/
SAVE ncalls
INTEGER :: frstep ! Flag for the initial step
INTEGER :: nx,ny,nz
INTEGER :: nxy,nxyz,nxyz0
INTEGER :: rbufsz ! buffer size for working
! arrays in radiation package
INTEGER :: nstyps ! Number of soil type
PARAMETER (nstyps=4)
INTEGER :: exbcbufsz ! EXBC buffer size
INTEGER :: ncall1, ncall3, ncall4
DATA ncall1, ncall3, ncall4/ 0,0,0/
SAVE ncall1, ncall3, ncall4
!*********************************************************************
! here we get the pointers to the data and pass the
! stuff to step to actually take the timestep
!*********************************************************************
CALL resett
nx = node(5,mptr)
ny = node(6,mptr)
nz = node(14,mptr)
nxy = nx*ny
nxyz = nxy*nz
nxyz0 = (nx+1)*(ny+1)*(nz+1)
!*****************************************************************
! retrieve constant values from the constant arrays
!*****************************************************************
ii = igtint(mptr,1)
ir = igtrel(mptr,1)
CALL getcnts
(nx,ny,nz, a(ii),nsint, a(ir),nsreal)
mgrid = mptr
IF ( radopt == 2 ) THEN
rbufsz = n2d_radiat*nx*ny+n3d_radiat*nx*ny*nz
ELSE
rbufsz = 1
END IF
!*********************************************************************
! 1-d constant-Arrays
!*********************************************************************
iifax1 = igtns1(mptr,id_ifax1,13)
iifax2 = igtns1(mptr,id_ifax2,13)
!*********************************************************************
! 1-d x-Arrays
!*********************************************************************
ix = igtnx1(mptr,id_x)
itrigs1 = igtnx1(mptr,id_trigs1)
iwsave2 = igtnx1(mptr,id_wsave2)
!*********************************************************************
! 1-d y-Arrays
!*********************************************************************
iy = igtny1(mptr,id_y)
itrigs2 = igtny1(mptr,id_trigs2)
iwsave1 = igtny1(mptr,id_wsave1)
!*********************************************************************
! 1-d z-Arrays
!*********************************************************************
iz = igtnz1(mptr,id_z)
!*********************************************************************
! 2-d xy arrays
!*********************************************************************
ihterain = igtnxy(mptr,id_hterain, 1)
isinlat = igtnxy(mptr,id_sinlat, 1)
isoiltyp = igtnxy(mptr,id_soiltyp, 4)
istypfrct = igtnxy(mptr,id_stypfrct,4)
ivegtyp = igtnxy(mptr,id_vegtyp, 1)
ilai = igtnxy(mptr,id_lai, 1)
iroufns = igtnxy(mptr,id_roufns, 1)
iveg = igtnxy(mptr,id_veg, 1)
itsfc = igtnxy(mptr,id_tsfc, 5)
itsoil = igtnxy(mptr,id_tsoil, 5)
iwetsfc = igtnxy(mptr,id_wetsfc, 5)
iwetdp = igtnxy(mptr,id_wetdp, 5)
iwetcanp = igtnxy(mptr,id_wetcanp, 5)
iqvsfc = igtnxy(mptr,id_qvsfc, 5)
isnowdpth = igtnxy(mptr,id_snowdpth, 1)
iraing = igtnxy(mptr,id_raing, 1)
irainc = igtnxy(mptr,id_rainc, 1)
iptsfc = igtnxy(mptr,id_ptsfc, 1)
ipbldpth = igtnxy(mptr,id_pbldpth, 3)
imapfct = igtnxy(mptr,id_mapfct, 8)
irad2d = igtnxy(mptr,id_rad2d, 10)
iradsw = igtnxy(mptr,id_radsw, 1)
irnflx = igtnxy(mptr,id_rnflx, 1)
iprcrate = igtnxy(mptr,id_prcrate, 4)
ibcrlx = igtnxy(mptr,id_bcrlx, 1)
ivwork1 = igtnxy(mptr,id_vwork1, 2)
ivwork2 = igtnxy(mptr,id_vwork2, 2)
iraincv = igtnxy(mptr,id_raincv, 1)
inca = igtnxy(mptr,id_nca, 1)
iusflx = igtnxy(mptr,id_usflx, 1)
ivsflx = igtnxy(mptr,id_vsflx, 1)
iptsflx = igtnxy(mptr,id_ptsflx, 1)
iqvsflx = igtnxy(mptr,id_qvsflx, 1)
itemxy1 = igetsp(nxy)
!*********************************************************************
! 2-d xz arrays
!*********************************************************************\
iudtnb = igtnxz(mptr,id_udtnb,1)
iudtsb = igtnxz(mptr,id_udtsb,1)
ivdtnb = igtnxz(mptr,id_vdtnb,1)
ivdtsb = igtnxz(mptr,id_vdtsb,1)
isdtnb = igtnxz(mptr,id_sdtnb,1)
isdtsb = igtnxz(mptr,id_sdtsb,1)
ipdtnb = igtnxz(mptr,id_pdtnb,1)
ipdtsb = igtnxz(mptr,id_pdtsb,1)
iwdtnb = igtnxz(mptr,id_wdtnb,1)
iwdtsb = igtnxz(mptr,id_wdtsb,1)
!*********************************************************************
! 2-d yz arrays
!*********************************************************************
iudteb = igtnyz(mptr,id_udteb,1)
iudtwb = igtnyz(mptr,id_udtwb,1)
ivdteb = igtnyz(mptr,id_vdteb,1)
ivdtwb = igtnyz(mptr,id_vdtwb,1)
isdteb = igtnyz(mptr,id_sdteb,1)
isdtwb = igtnyz(mptr,id_sdtwb,1)
ipdteb = igtnyz(mptr,id_pdteb,1)
ipdtwb = igtnyz(mptr,id_pdtwb,1)
iwdteb = igtnyz(mptr,id_wdteb,1)
iwdtwb = igtnyz(mptr,id_wdtwb,1)
!*********************************************************************
! 3-d arrays
!*********************************************************************
iu = igtxyz(mptr,id_u, 3)
iv = igtxyz(mptr,id_v, 3)
iw = igtxyz(mptr,id_w, 3)
iptprt = igtxyz(mptr,id_ptprt,3)
ipprt = igtxyz(mptr,id_pprt, 3)
iqv = igtxyz(mptr,id_qv, 3)
iqc = igtxyz(mptr,id_qc, 3)
iqr = igtxyz(mptr,id_qr, 3)
iqi = igtxyz(mptr,id_qi, 3)
iqs = igtxyz(mptr,id_qs, 3)
iqh = igtxyz(mptr,id_qh, 3)
itke = igtxyz(mptr,id_tke, 3)
iubar = igtxyz(mptr,id_ubar, 1)
ivbar = igtxyz(mptr,id_vbar, 1)
iwbar = igtxyz(mptr,id_wbar, 1)
iptbar = igtxyz(mptr,id_ptbar, 1)
ipbar = igtxyz(mptr,id_pbar, 1)
iptbari = igtxyz(mptr,id_ptbari, 1)
ipbari = igtxyz(mptr,id_pbari, 1)
irhostr = igtxyz(mptr,id_rhostr, 1)
irhostri = igtxyz(mptr,id_rhostri,1)
iqvbar = igtxyz(mptr,id_qvbar, 1)
izp = igtxyz(mptr,id_zp, 1)
ij1 = igtxyz(mptr,id_j1, 1)
ij2 = igtxyz(mptr,id_j2, 1)
ij3 = igtxyz(mptr,id_j3, 1)
ij3inv = igtxyz(mptr,id_j3inv,1)
iaj3x = igtxyz(mptr,id_aj3x, 1)
iaj3y = igtxyz(mptr,id_aj3y, 1)
iaj3z = igtxyz(mptr,id_aj3z, 1)
iwcont = igtxyz(mptr,id_wcont, 1)
ikmh = igtxyz(mptr,id_kmh, 1)
ikmv = igtxyz(mptr,id_kmv, 1)
irprntl = igtxyz(mptr,id_rprntl, 1)
ippi = igtxyz(mptr,id_ppi, 1)
icsndsq = igtxyz(mptr,id_csndsq, 1)
iptcumsrc = igtxyz(mptr,id_ptcumsrc,1)
iqcumsrc = igtxyz(mptr,id_qcumsrc, 5)
iradfrc = igtxyz(mptr,id_radfrc, 1)
iw0avg = igtxyz(mptr,id_w0avg, 1)
!
!-----------------------------------------------------------------------
!
! 3-d temporary arrays for all grids
!
!-----------------------------------------------------------------------
!
item1 = igetsp( nxyz )
item2 = igetsp( nxyz )
item3 = igetsp( nxyz )
item4 = igetsp( nxyz )
item5 = igetsp( nxyz )
item6 = igetsp( nxyz )
item7 = igetsp( nxyz )
item8 = igetsp( nxyz )
item9 = igetsp( nxyz )
item10 = igetsp( nxyz )
item11 = igetsp( nxyz )
item12 = igetsp( nxyz )
item13 = igetsp( nxyz )
item14 = igetsp( nxyz )
item15 = igetsp( nxyz )
item16 = igetsp( nxyz )
item17 = igetsp( nxyz )
item18 = igetsp( nxyz )
item19 = igetsp( nxyz )
item20 = igetsp( nxyz )
item21 = igetsp( nxyz )
item22 = igetsp( nxyz )
item23 = igetsp( nxyz )
item24 = igetsp( nxyz )
item25 = igetsp( nxyz )
item26 = igetsp( nxyz )
item1_0= igetsp( nxyz0 )
item2_0= igetsp( nxyz0 )
item3_0= igetsp( nxyz0 )
!
!-----------------------------------------------------------------------
!
! Get radiation buffer for working arrays
!
!-----------------------------------------------------------------------
!
iradbuf = igetsp( rbufsz )
!
!-----------------------------------------------------------------------
!
! 3-d EXBC arrays if lbcopt=2
!
!-----------------------------------------------------------------------
!
IF ( lbcopt == 2 ) THEN
IF ( mptr == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! 3-d EXBC arrays for base grid
!
!-----------------------------------------------------------------------
!
exbcbufsz = nxyz*nexbc3d
iexbcbuf = igtexbc(mptr,1,nexbc3d)
ELSE IF ( raydmp == 2 ) THEN
!
!-----------------------------------------------------------------------
!
! 3-d EXBC temporary arrays for fine grids
!
!-----------------------------------------------------------------------
!
exbcbufsz = 4*nxyz
iexbcbuf = igetsp( exbcbufsz )
CALL updexbc
(mptr,iexbcbuf)
ELSE
exbcbufsz = 1
iexbcbuf = igetsp( exbcbufsz )
END IF
ELSE
exbcbufsz = 1
iexbcbuf = igetsp( exbcbufsz )
END IF
!*********************************************************************
! now call the solver
!*********************************************************************
nstep = node(13,mptr)
nstep = nstep + 1
node(13,mptr) = nstep
IF( (nstep == 1) .AND. (restrt /= 1) ) THEN
frstep=1 ! Indicate that this is the initial step of
! model integration. For this step forward
! time integration scheme will be used.
ELSE ! For non-first step or restart run
frstep=0 ! When frstep=0, leapfrog scheme is used.
END IF
! print*,' To call cordintg for grid ',mptr,' at nstep=',nstep
! print*,'Frstep = ', frstep
cpu0 = f_cputime
()
CALL cordintg
(mptr,frstep,nx,ny,nz,rbufsz,nstyps,exbcbufsz, &
a(iu),a(iv),a(iw),a(iwcont),a(iptprt),a(ipprt), &
a(iqv),a(iqc),a(iqr),a(iqi),a(iqs),a(iqh), &
a(itke),a(ipbldpth), &
a(iudteb),a(iudtwb),a(iudtnb),a(iudtsb), &
a(ivdteb),a(ivdtwb),a(ivdtnb),a(ivdtsb), &
a(iwdteb),a(iwdtwb),a(iwdtnb),a(iwdtsb), &
a(ipdteb),a(ipdtwb),a(ipdtnb),a(ipdtsb), &
a(isdteb),a(isdtwb),a(isdtnb),a(isdtsb), &
a(iubar),a(ivbar),a(iptbar),a(ipbar),a(iptbari),a(ipbari), &
a(irhostr),a(irhostri),a(iqvbar),a(ippi),a(icsndsq), &
a(ix),a(iy),a(iz),a(izp),a(imapfct), &
a(ij1),a(ij2),a(ij3),a(iaj3x),a(iaj3y),a(iaj3z),a(ij3inv), &
a(itrigs1),a(itrigs2),a(iifax1),a(iifax2), &
a(iwsave1),a(iwsave2),a(ivwork1),a(ivwork2), &
a(isinlat),a(ikmh),a(ikmv),a(irprntl), &
a(isoiltyp),a(istypfrct), &
a(ivegtyp),a(ilai),a(iroufns),a(iveg), &
a(itsfc),a(itsoil),a(iwetsfc),a(iwetdp),a(iwetcanp), &
a(isnowdpth),a(iptsfc),a(iqvsfc), &
a(iptcumsrc),a(iqcumsrc),a(iraing),a(irainc),a(iprcrate), &
a(iw0avg),a(inca),a(iraincv), &
a(iradfrc),a(iradsw),a(irnflx),a(irad2d),a(iradbuf), &
a(iexbcbuf),a(ibcrlx), &
a(iusflx),a(ivsflx),a(iptsflx),a(iqvsflx),a(itemxy1), &
a(item1),a(item2),a(item3),a(item4),a(item5), &
a(item6),a(item7),a(item8),a(item9),a(item10), &
a(item11),a(item12),a(item13),a(item14),a(item15), &
a(item16),a(item17),a(item18),a(item19),a(item20), &
a(item21),a(item22),a(item23),a(item24),a(item25), &
a(item26),a(item1_0),a(item2_0),a(item3_0) )
cpu_main = cpu_main + f_cputime
() - cpu0
curtim = curtim + dtbig
rnode(20,mptr) = curtim
WRITE(6,'(1x,a,i6,a,f10.2,a,i2)') &
'nstep=',nstep,', curtim =',curtim, &
' after calling arpsolve for grid ',mptr
!*********************************************************************
! put back the values constants into the integer and real arrays
!*********************************************************************
CALL strcnts
(nx,ny,nz, a(ii),nsint, a(ir),nsreal)
!*********************************************************************
! return 2-d and 3-d arrays to their permanent storage when unpacked.
!*********************************************************************
!*********************************************************************
! 2-d xy arrays
!*********************************************************************
CALL retnxy
(mptr,id_hterain, 1,ihterain, .false.)
CALL retnxy
(mptr,id_sinlat, 1,isinlat, .false.)
CALL retnxy
(mptr,id_soiltyp, 4,isoiltyp, .false.)
CALL retnxy
(mptr,id_stypfrct,4,istypfrct,.false.)
CALL retnxy
(mptr,id_vegtyp, 1,ivegtyp, .false.)
CALL retnxy
(mptr,id_lai, 1,ilai, .false.)
CALL retnxy
(mptr,id_roufns, 1,iroufns, .false.)
CALL retnxy
(mptr,id_veg, 1,iveg, .false.)
CALL retnxy
(mptr,id_tsfc, 5,itsfc, .true.)
CALL retnxy
(mptr,id_tsoil, 5,itsoil, .true.)
CALL retnxy
(mptr,id_wetsfc, 5,iwetsfc, .true.)
CALL retnxy
(mptr,id_wetdp, 5,iwetdp, .true.)
CALL retnxy
(mptr,id_wetcanp, 5,iwetcanp, .true.)
CALL retnxy
(mptr,id_qvsfc, 5,iqvsfc, .true.)
CALL retnxy
(mptr,id_snowdpth, 1,isnowdpth, .true.)
CALL retnxy
(mptr,id_raing, 1,iraing, .true.)
CALL retnxy
(mptr,id_rainc, 1,irainc, .true.)
CALL retnxy
(mptr,id_ptsfc, 1,iptsfc, .true.)
CALL retnxy
(mptr,id_pbldpth, 3,ipbldpth, .true.)
CALL retnxy
(mptr,id_mapfct, 8,imapfct, .true.)
CALL retnxy
(mptr,id_rad2d, 10,irad2d, .true.)
CALL retnxy
(mptr,id_radsw, 1,iradsw, .true.)
CALL retnxy
(mptr,id_rnflx, 1,irnflx, .true.)
CALL retnxy
(mptr,id_prcrate, 4,iprcrate, .true.)
CALL retnxy
(mptr,id_bcrlx, 1,ibcrlx, .true.)
CALL retnxy
(mptr,id_vwork1, 2,ivwork1, .true.)
CALL retnxy
(mptr,id_vwork2, 2,ivwork2, .true.)
CALL retnxy
(mptr,id_raincv, 1,iraincv, .true.)
CALL retnxy
(mptr,id_nca, 1,inca, .true.)
CALL retnxy
(mptr,id_usflx, 1,iusflx, .true.)
CALL retnxy
(mptr,id_vsflx, 1,ivsflx, .true.)
CALL retnxy
(mptr,id_ptsflx, 1,iptsflx, .true.)
CALL retnxy
(mptr,id_qvsflx, 1,iqvsflx, .true.)
!*********************************************************************
! 2-d xz arrays
!*********************************************************************
CALL retnxz
(mptr,id_udtnb,1,iudtnb,.false.)
CALL retnxz
(mptr,id_udtsb,1,iudtsb,.false.)
CALL retnxz
(mptr,id_vdtnb,1,ivdtnb,.true.)
CALL retnxz
(mptr,id_vdtsb,1,ivdtsb,.true.)
CALL retnxz
(mptr,id_sdtnb,1,isdtnb,.false.)
CALL retnxz
(mptr,id_sdtsb,1,isdtsb,.false.)
CALL retnxz
(mptr,id_pdtnb,1,ipdtnb,.true.)
CALL retnxz
(mptr,id_pdtsb,1,ipdtsb,.true.)
CALL retnxz
(mptr,id_wdtnb,1,iwdtnb,.false.)
CALL retnxz
(mptr,id_wdtsb,1,iwdtsb,.false.)
!*********************************************************************
! 2-d yz arrays
!*********************************************************************
CALL retnyz
(mptr,id_udteb,1,iudteb,.true.)
CALL retnyz
(mptr,id_udtwb,1,iudtwb,.true.)
CALL retnyz
(mptr,id_vdteb,1,ivdteb,.false.)
CALL retnyz
(mptr,id_vdtwb,1,ivdtwb,.false.)
CALL retnyz
(mptr,id_sdteb,1,isdteb,.false.)
CALL retnyz
(mptr,id_sdtwb,1,isdtwb,.false.)
CALL retnyz
(mptr,id_pdteb,1,ipdteb,.true.)
CALL retnyz
(mptr,id_pdtwb,1,ipdtwb,.true.)
CALL retnyz
(mptr,id_wdteb,1,iwdteb,.false.)
CALL retnyz
(mptr,id_wdtwb,1,iwdtwb,.false.)
!*********************************************************************
! 3-d arrays
!*********************************************************************
CALL retxyz
(mptr,id_u, 3,iu, .true.)
CALL retxyz
(mptr,id_v, 3,iv, .true.)
CALL retxyz
(mptr,id_w, 3,iw, .true.)
CALL retxyz
(mptr,id_ptprt,3,iptprt,.true.)
CALL retxyz
(mptr,id_pprt, 3,ipprt, .true.)
CALL retxyz
(mptr,id_qv, 3,iqv, .true.)
CALL retxyz
(mptr,id_qc, 3,iqc, .true.)
CALL retxyz
(mptr,id_qr, 3,iqr, .true.)
CALL retxyz
(mptr,id_qi, 3,iqi, .true.)
CALL retxyz
(mptr,id_qs, 3,iqs, .true.)
CALL retxyz
(mptr,id_qh, 3,iqh, .true.)
CALL retxyz
(mptr,id_tke, 3,itke, .true.)
CALL retxyz
(mptr,id_ubar, 1,iubar ,.false.)
CALL retxyz
(mptr,id_vbar, 1,ivbar ,.false.)
CALL retxyz
(mptr,id_wbar, 1,iwbar ,.false.)
CALL retxyz
(mptr,id_ptbar, 1,iptbar ,.false.)
CALL retxyz
(mptr,id_pbar, 1,ipbar ,.false.)
CALL retxyz
(mptr,id_ptbari, 1,iptbari ,.false.)
CALL retxyz
(mptr,id_pbari, 1,ipbari ,.false.)
CALL retxyz
(mptr,id_rhostr, 1,irhostr ,.false.)
CALL retxyz
(mptr,id_rhostri,1,irhostri,.false.)
CALL retxyz
(mptr,id_qvbar, 1,iqvbar ,.false.)
CALL retxyz
(mptr,id_zp, 1,izp, .false.)
CALL retxyz
(mptr,id_j1, 1,ij1, .false.)
CALL retxyz
(mptr,id_j2, 1,ij2, .false.)
CALL retxyz
(mptr,id_j3, 1,ij3, .false.)
CALL retxyz
(mptr,id_j3inv,1,ij3inv,.false.)
CALL retxyz
(mptr,id_aj3x, 1,iaj3x, .false.)
CALL retxyz
(mptr,id_aj3y, 1,iaj3y, .false.)
CALL retxyz
(mptr,id_aj3z, 1,iaj3z, .false.)
CALL retxyz
(mptr,id_wcont, 1,iwcont, .true.)
CALL retxyz
(mptr,id_kmh, 1,ikmh, .true.)
CALL retxyz
(mptr,id_kmv, 1,ikmv, .true.)
CALL retxyz
(mptr,id_rprntl, 1,irprntl, .true.)
CALL retxyz
(mptr,id_ppi, 1,ippi, .false.)
CALL retxyz
(mptr,id_csndsq, 1,icsndsq, .false.)
CALL retxyz
(mptr,id_ptcumsrc,1,iptcumsrc,.true.)
CALL retxyz
(mptr,id_qcumsrc, 5,iqcumsrc, .true.)
CALL retxyz
(mptr,id_radfrc, 1,iradfrc, .true.)
CALL retxyz
(mptr,id_w0avg, 1,iw0avg, .false.)
IF ( mptr == 1 .AND. lbcopt == 2 ) THEN
CALL retexbc
(1,1,nexbc3d,iexbcbuf, .true.)
END IF
!*********************************************************************
! re-set all tem. space
!*********************************************************************
CALL resett
!*********************************************************************
! we're done here
!*********************************************************************
IF(.true.)WRITE(6,'(''ARPSOLVE CALLED FOR GRID '',I3)') mptr
WRITE(6,'('' GRID '',I3,'' STEPPED FORWARD ONE STEP.'')')mptr
RETURN
END SUBROUTINE arpsolve