Skip to content

Commit

Permalink
add hotstart variable for clam module in ICM
Browse files Browse the repository at this point in the history
  • Loading branch information
wzhengui committed Jul 5, 2024
1 parent 1c3f4fa commit 31bf902
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 32 deletions.
59 changes: 30 additions & 29 deletions src/ICM/icm.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1033,6 +1033,7 @@ subroutine clam_calc(id,kb,wdz)
!clam model computation
!----------------------------------------------------------------------------
use schism_glbl,only : rkind,nvrt
use schism_msgp, only : myrank,parallel_abort
use icm_mod
implicit none
integer,intent(in) :: id,kb
Expand Down Expand Up @@ -1069,50 +1070,50 @@ subroutine clam_calc(id,kb,wdz)
fTSS(i)=1.0-(1.0-cfTSSm(i))*(TSSc-cTSS(i,3))/(cTSS(i,4)-cTSS(i,3))
endif
Fr(i)=cfrmax(i)*fT(i)*fS(i)*fDO(i)*fTSS(i) !filtration rate (m3.g[C_clam].day-1)
cIF(i)=min(1.d0,cIFmax(i)/sum(Fr(i)*PC)) !ingestion rate
cIF(i)=min(1.d0,cIFmax(i)/max(sum(Fr(i)*PC),1.d-5)) !ingestion rate

!filtered matters
TFC(i)=sum(PC*Fr(i)*CLAM(id,i)) !POC filtered (g[C].m-2.day-1)
TFN(i)=sum(PN*Fr(i)*CLAM(id,i)) !PON filtered (g[N].m-2.day-1)
TFP(i)=sum(PP*Fr(i)*CLAM(id,i)) !POP filtered (g[P].m-2.day-1)
ATFC(i)=sum(calpha(i,1:5)*PC*Fr(i)*cIF(i)*CLAM(id,i)) !potential POC assimilated (g[C].m-2.day-1)
ATFN(i)=sum(calpha(i,1:5)*PN*Fr(i)*cIF(i)*CLAM(id,i)) !potential PON assimilated (g[N].m-2.day-1)
ATFP(i)=sum(calpha(i,1:5)*PP*Fr(i)*cIF(i)*CLAM(id,i)) !potential POP assimilated (g[P].m-2.day-1)
fN(i)=min(1.d0, ATFN(i)/(cn2c(i)*ATFC(i)),ATFP(i)/(cp2c(i)*ATFC(i))) !nutrient(N,P) limitation
TFC(i)=sum(PC*Fr(i)*CLAM(i,id)) !POC filtered (g[C].m-2.day-1)
TFN(i)=sum(PN*Fr(i)*CLAM(i,id)) !PON filtered (g[N].m-2.day-1)
TFP(i)=sum(PP*Fr(i)*CLAM(i,id)) !POP filtered (g[P].m-2.day-1)
ATFC(i)=sum(calpha(i,1:5)*PC*Fr(i)*cIF(i)*CLAM(i,id)) !potential POC assimilated (g[C].m-2.day-1)
ATFN(i)=sum(calpha(i,1:5)*PN*Fr(i)*cIF(i)*CLAM(i,id)) !potential PON assimilated (g[N].m-2.day-1)
ATFP(i)=sum(calpha(i,1:5)*PP*Fr(i)*cIF(i)*CLAM(i,id)) !potential POP assimilated (g[P].m-2.day-1)
fN(i)=min(1.d0, ATFN(i)/max(cn2c(i)*ATFC(i),1.d-5),ATFP(i)/max(cp2c(i)*ATFC(i),1.d-5)) !nutrient(N,P) limitation

!growth, metabolism, and mortality
GP(i)=sum(fN(i)*calpha(i,1:5)*cIF(i)*(1.0-cRF(i))*PC(1:5)*Fr(i)*CLAM(id,i)) !growth (g[C].m-2.day-1)
MT(i)=cMTB(i)*exp(cKTMT(i)*(wtemp-cTMT(i)))*fDO(i)*CLAM(id,i) !metabolism (g[C].m-2.day-1)
RT(i)=cMRT(i)*(1.d0-fDO(i))*CLAM(id,i) !mortality (g[C].m-2.day-1)
if(idoy>=cDoyp(i,1).and.idoy<=cDoyp(i,2)) PR(i) =cPRR(i)*CLAM(id,i) !predation (g[C].m-2.day-1)
if(idoy>=cDoyh(i,1).and.idoy<=cDoyh(i,2)) HST(i)=cHSR(i)*CLAM(id,i) !harvest (g[C].m-2.day-1)
CLAM(id,i)=CLAM(id,i)+(GP(i)-MT(i)-RT(i)-PR(i)-HST(i))*dtw !update clam biomass
GP(i)=sum(fN(i)*calpha(i,1:5)*cIF(i)*(1.0-cRF(i))*PC(1:5)*Fr(i)*CLAM(i,id)) !growth (g[C].m-2.day-1)
MT(i)=cMTB(i)*exp(cKTMT(i)*(wtemp-cTMT(i)))*fDO(i)*CLAM(i,id) !metabolism (g[C].m-2.day-1)
RT(i)=cMRT(i)*(1.d0-fDO(i))*CLAM(i,id) !mortality (g[C].m-2.day-1)
if(idoy>=cDoyp(i,1).and.idoy<=cDoyp(i,2)) PR(i) =cPRR(i)*CLAM(i,id) !predation (g[C].m-2.day-1)
if(idoy>=cDoyh(i,1).and.idoy<=cDoyh(i,2)) HST(i)=cHSR(i)*CLAM(i,id) !harvest (g[C].m-2.day-1)
CLAM(i,id)=CLAM(i,id)+(GP(i)-MT(i)-RT(i)-PR(i)-HST(i))*dtw !update clam biomass
enddo !i=1,nclam

!interaction with water column variables; change rate of conc. (g.m-3.day-1)
cdwqc(iPB1, kb+1)=sum(PC(1)*Fr*CLAM(id,1:nclam))/wdz
cdwqc(iPB2, kb+1)=sum(PC(2)*Fr*CLAM(id,1:nclam))/wdz
cdwqc(iPB3, kb+1)=sum(PC(3)*Fr*CLAM(id,1:nclam))/wdz
cdwqc(iLPOC,kb+1)=sum(PC(4)*Fr*CLAM(id,1:nclam))/wdz
cdwqc(iRPOC,kb+1)=sum(PC(5)*Fr*CLAM(id,1:nclam))/wdz
cdwqc(iLPON,kb+1)=sum(PN(4)*Fr*CLAM(id,1:nclam))/wdz
cdwqc(iRPON,kb+1)=sum(PN(5)*Fr*CLAM(id,1:nclam))/wdz
cdwqc(iLPOP,kb+1)=sum(PP(4)*Fr*CLAM(id,1:nclam))/wdz
cdwqc(iRPOP,kb+1)=sum(PP(5)*Fr*CLAM(id,1:nclam))/wdz
cdwqc(iPB1, kb+1)=sum(PC(1)*Fr*CLAM(1:nclam,id))/wdz
cdwqc(iPB2, kb+1)=sum(PC(2)*Fr*CLAM(1:nclam,id))/wdz
cdwqc(iPB3, kb+1)=sum(PC(3)*Fr*CLAM(1:nclam,id))/wdz
cdwqc(iLPOC,kb+1)=sum(PC(4)*Fr*CLAM(1:nclam,id))/wdz
cdwqc(iRPOC,kb+1)=sum(PC(5)*Fr*CLAM(1:nclam,id))/wdz
cdwqc(iLPON,kb+1)=sum(PN(4)*Fr*CLAM(1:nclam,id))/wdz
cdwqc(iRPON,kb+1)=sum(PN(5)*Fr*CLAM(1:nclam,id))/wdz
cdwqc(iLPOP,kb+1)=sum(PP(4)*Fr*CLAM(1:nclam,id))/wdz
cdwqc(iRPOP,kb+1)=sum(PP(5)*Fr*CLAM(1:nclam,id))/wdz
cdwqc(iNH4, kb+1)=sum((ATFN-cn2c*GP)+cn2c*MT)/wdz
cdwqc(iPO4, kb+1)=sum((ATFP-cp2c*GP)+cp2c*MT)/wdz
cdwqc(iDOX, kb+1)=o2c*sum((ATFC-GP)+MT)/wdz

!interaction with sediment layer
cFPOC(id,1:2)=0; cFPON(id,1:2)=0; cFPOP(id,1:2)=0
do i=1,nclam
cFPOC(id,1)=cFPOC(id,1)+sum(((1-cIF(i))+(1.0-calpha(i,1:4))*cIF(i))*Fr(i)*CLAM(id,i)*PC(1:4))+sum(RT+PR)
cFPON(id,1)=cFPON(id,1)+sum(((1-cIF(i))+(1.0-calpha(i,1:4))*cIF(i))*Fr(i)*CLAM(id,i)*PN(1:4))+sum(cn2c(i)*(RT+PR))
cFPOP(id,1)=cFPOP(id,1)+sum(((1-cIF(i))+(1.0-calpha(i,1:4))*cIF(i))*Fr(i)*CLAM(id,i)*PP(1:4))+sum(cp2c(i)*(RT+PR))
cFPOC(id,1)=cFPOC(id,1)+sum(((1-cIF(i))+(1.0-calpha(i,1:4))*cIF(i))*Fr(i)*CLAM(i,id)*PC(1:4))+sum(RT+PR)
cFPON(id,1)=cFPON(id,1)+sum(((1-cIF(i))+(1.0-calpha(i,1:4))*cIF(i))*Fr(i)*CLAM(i,id)*PN(1:4))+sum(cn2c(i)*(RT+PR))
cFPOP(id,1)=cFPOP(id,1)+sum(((1-cIF(i))+(1.0-calpha(i,1:4))*cIF(i))*Fr(i)*CLAM(i,id)*PP(1:4))+sum(cp2c(i)*(RT+PR))
enddo !i
cFPOC(id,2)=sum(((1-cIF)+(1.0-calpha(1:nclam,5))*cIF)*Fr*CLAM(id,1:nclam)*PC(5))
cFPON(id,2)=sum(((1-cIF)+(1.0-calpha(1:nclam,5))*cIF)*Fr*CLAM(id,1:nclam)*PN(5))
cFPOP(id,2)=sum(((1-cIF)+(1.0-calpha(1:nclam,5))*cIF)*Fr*CLAM(id,1:nclam)*PP(5))
cFPOC(id,2)=sum(((1-cIF)+(1.0-calpha(1:nclam,5))*cIF)*Fr*CLAM(1:nclam,id)*PC(5))
cFPON(id,2)=sum(((1-cIF)+(1.0-calpha(1:nclam,5))*cIF)*Fr*CLAM(1:nclam,id)*PN(5))
cFPOP(id,2)=sum(((1-cIF)+(1.0-calpha(1:nclam,5))*cIF)*Fr*CLAM(1:nclam,id)*PP(5))

endif !iClam
end subroutine clam_calc
Expand Down
10 changes: 7 additions & 3 deletions src/ICM/icm_init.F90
Original file line number Diff line number Diff line change
Expand Up @@ -357,9 +357,13 @@ subroutine read_icm_param(imode)
if(iClam==1) then
do i=1,nclam
write(stmp,"(I3)") i
p=>wqout(nout+i); p%name='ICM_CLAM'//trim(adjustl(stmp)); p%p1=>CLAM(:,i); p%itype=4
p=>wqout(nout+i); p%name='ICM_CLAM'//trim(adjustl(stmp)); p%p1=>CLAM(i,:); p%itype=4
enddo
nb=nclam; nouts(10)=nb; iout(1,10)=nout+1; iout(2,10)=nout+nb; nout=nout+nb

!hotstart
p=>wqhot(nhot+1); p%name='clam'; p%p2=>CLAM
nhot=nhot+1
endif

!allocate iof_icm, and get output information
Expand Down Expand Up @@ -665,7 +669,7 @@ subroutine icm_vars_init
!-------------------------------------------------------------------------------
allocate(cpatch(nea)); cpatch=0
if(iClam==1) then
allocate(CLAM(nea,nclam),cFPOC(nea,2),cFPON(nea,2),cFPOP(nea,2), stat=istat)
allocate(CLAM(nclam,nea),cFPOC(nea,2),cFPON(nea,2),cFPOP(nea,2), stat=istat)
if(istat/=0) call parallel_abort('failed in alloc. CLAM')
endif

Expand Down Expand Up @@ -920,7 +924,7 @@ subroutine icm_vars_init
gpatch(i)=nint(gpatch0); gBA(i)=gBA0
endif
if(iClam==1) then
cpatch(i)=nint(cpatch0); CLAM(i,1:nclam)=clam0
cpatch(i)=nint(cpatch0); CLAM(1:nclam,i)=clam0
endif
enddo

Expand Down

0 comments on commit 31bf902

Please sign in to comment.