| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817 |
- module pumamod
- use resmod
- !
- ! Parameter
- !
- parameter(NPRO = NPRO_ATM) ! Number of processes (resmod)
- parameter(NLEV=NLEV_ATM)
- parameter(NLAT = NLAT_ATM) ! Number of latitudes (resmod)
- parameter(NLON = NLAT + NLAT) ! Number of longitudes
- parameter(NLPP = NLAT / NPRO) ! Latitudes per process
- parameter(NHOR = NLON * NLPP) ! Horizontal part
- parameter(NUGP = NLON * NLAT) ! Number of gridpoints
- parameter(NTRU = (NLON-1) / 3) ! Triangular truncation
- parameter(NTP1 = NTRU + 1) ! Truncation + 1
- parameter(NRSP =(NTRU+1)*(NTRU+2)) ! No of real global modes
- parameter(NCSP = NRSP / 2) ! No of complex global modes
- parameter(NSPP = (NRSP+NPRO-1)/NPRO) ! Modes per process
- parameter(NESP = NSPP * NPRO) ! Dim of spectral fields
- parameter(NROOT = 0) ! Master node
- parameter(SOLAR_DAY=86400.)
- parameter(TFREEZE=271.25)
- parameter(CRHOI=920.)
- !
- real (kind=8) :: gwd(NHOR)
- !
- real :: ccls(NHOR)
- real :: cctaux(NHOR,0:13) = 0.
- real :: cctauy(NHOR,0:13) = 0.
- real :: ccprl(NHOR,0:13) = 0.
- real :: ccprc(NHOR,0:13) = 0.
- real :: ccevap(NHOR,0:13) = 0.
- real :: ccroff(NHOR,0:13) = 0.
- real :: cciced(NHOR,0:13) = 0.
- real :: ccsnow(NHOR,0:13) = 0.
- real :: ccsst(NHOR,0:13) = 0.
- real :: ccswr(NHOR,0:13) = 0.
- real :: cclwr(NHOR,0:13) = 0.
- real :: ccshf(NHOR,0:13) = 0.
- real :: cclhf(NHOR,0:13) = 0.
- !
- real :: cltaux(NHOR) = 0.
- real :: cltauy(NHOR) = 0.
- real :: clprl(NHOR) = 0.
- real :: clprc(NHOR) = 0.
- real :: clevap(NHOR) = 0.
- real :: clroff(NHOR) = 0.
- real :: cliced(NHOR) = 0.
- real :: clsnow(NHOR) = 0.
- real :: clsst(NHOR) = 0.
- real :: clswr(NHOR) = 0.
- real :: cllwr(NHOR) = 0.
- real :: clshf(NHOR) = 0.
- real :: cllhf(NHOR) = 0.
- !
- real :: yls(NHOR) = 0.
- real :: ytaux(NHOR) = 0.
- real :: ytauy(NHOR) = 0.
- real :: yprl(NHOR) = 0.
- real :: yprc(NHOR) = 0.
- real :: yevap(NHOR) = 0.
- real :: ysst(NHOR) = 0.
- real :: ypme(NHOR) = 0.
- real :: yroff(NHOR) = 0.
- real :: yheat(NHOR) = 0.
- real :: yicesnow(NHOR)= 0.
- real :: yfldo(NHOR) = 0.
- real :: ymld(NHOR) = 50.
- !
- real :: ols(NHOR) = 0.
- real :: otaux(NHOR) = 0.
- real :: otauy(NHOR) = 0.
- real :: oprl(NHOR) = 0.
- real :: oprc(NHOR) = 0.
- real :: oevap(NHOR) = 0.
- real :: osst(NHOR) = 0.
- real :: opme(NHOR) = 0.
- real :: oheat(NHOR) = 0.
- real :: oroff(NHOR) = 0.
- real :: oofl(NHOR) = 0.
- real :: oicesnow(NHOR)= 0.
- real :: oice(NHOR) = 0.
- real :: osnow(NHOR) = 0.
- !
- ! global integer
- !
- integer :: ndatim(7) = -1
- integer :: nstep = 0 ! time step
- integer :: naccuout = 0 ! counter for accumulated output
- integer :: nrestart = 0 ! switch for restart
- integer :: n_run_years = 0
- integer :: n_run_months = 0
- integer :: n_run_days = -1
- integer :: n_start_step = 0
- integer :: ntspd = 32
- integer :: n_days_per_month = 30
- integer :: n_days_per_year = 360
- integer :: n_start_year = 1
- integer :: n_start_month = 1
- integer :: nafter = 32
- integer :: naomod = 320
- integer :: nlsg = 1
- integer :: ngui = 0
- !
- ! Parallel Stuff
- !
- integer :: mpinfo = 0
- integer :: mypid = 0
- integer :: myworld = 0
- integer :: nproc = NPRO
- !
- ! needed to compile surfmod
- !
- real :: so(NSPP),dls(NHOR)
- !
- end module pumamod
- !
- program climate
- use pumamod
- !
- call clini
- !
- mocd = n_run_months ! month countdown
- nscd = n_run_days * ntspd ! step countdown
- if (nrestart == 0) nstep = n_start_step ! timestep since 01-01-0001
- !
- call updatim(nstep) ! set date & time array ndatim
- !
- do while (mocd > 0 .or. nscd > 0) ! main loop
- call clstep
- if(mod(nstep,nafter) == 0) then
- call clout
- endif
- iyea = ndatim(1) ! current year
- imon = ndatim(2) ! current month
- nstep = nstep + 1
- call updatim(nstep) ! set date & time array ndatim
- if (imon /= ndatim(2)) then
- mocd = mocd - 1 ! next month
- write(nud,"('Completed month ',I2.2,'-',I4.4)") imon,iyea
- endif
- if (nscd > 0) nscd = nscd - 1
- if (nscd == 0) exit
- enddo ! month countdown
- !
- call clstop
- !
- stop
- end
- !
- ! ================
- ! SUBROUTINE CLINI
- ! ================
- !
- subroutine clini
- use pumamod
- !
- ! version identifier (date)
- !
- character(len=80) :: version = '25.07.2008 by Larry'
- !
- integer :: ih(8)
- !
- real :: zin(NLON*NLAT)
- real :: zcltaux(NLON*NLAT,0:13) = 0.
- real :: zcltauy(NLON*NLAT,0:13) = 0.
- real :: zclprl(NLON*NLAT,0:13) = 0.
- real :: zclprc(NLON*NLAT,0:13) = 0.
- real :: zclevap(NLON*NLAT,0:13) = 0.
- real :: zclroff(NLON*NLAT,0:13) = 0.
- real :: zcliced(NLON*NLAT,0:13) = 0.
- real :: zclsnow(NLON*NLAT,0:13) = 0.
- real :: zclsst(NLON*NLAT,0:13) = 0.
- real :: zclswr(NLON*NLAT,0:13) = 0.
- real :: zcllwr(NLON*NLAT,0:13) = 0.
- real :: zclshf(NLON*NLAT,0:13) = 0.
- real :: zcllhf(NLON*NLAT,0:13) = 0.
- real :: zlsm(NLON*NLAT) = 0.
- !
- logical :: lrestart = .false.
- !
- character(len=80) :: climatefile='climate.txt'
- character(len=80) :: surface='surface.txt'
- namelist/clpar/ntspd,nafter,n_run_days,n_run_months,n_run_years &
- & ,n_start_year,n_start_month,nlsg,climatefile &
- & ,surface
- !
- ! get process id
- !
- call get_mpi_info(nproc,mypid)
- !
- ! read and print namelist and distribute it
- !
- if (mypid == NROOT) then
- open(12,file='cl_namelist',form='formatted')
- read(12,clpar)
- write(nud,'(/," *******************************************")')
- write(nud,'(" * CLIMATE ",a30," *")') trim(version)
- write(nud,'(" *******************************************")')
- write(nud,'(" * Namelist CLPAR from <cl_namelist> *")')
- write(nud,'(" *******************************************")')
- write(nud,clpar)
- close(12)
- n_start_step = ntspd * (n_start_year * n_days_per_year &
- + (n_start_month-1) * n_days_per_month)
- if(n_run_years > 0) n_run_months=n_run_years*12
- endif
- !
- call mpbci(ntspd)
- call mpbci(nlsg)
- call mpbci(nafter)
- call mpbci(n_days_per_month)
- call mpbci(n_days_per_year)
- call mpbci(n_run_days)
- call mpbci(n_run_months)
- call mpbci(n_run_years)
- call mpbci(n_start_step)
- call mpbci(n_start_year)
- call mpbci(n_start_month)
- !
- call calini(n_days_per_month,n_days_per_year,n_start_step,ntspd &
- & ,solar_day,mypid)
- !
- if(mypid == NROOT) then
- call restart_ini(lrestart,'climate_restart')
- if (lrestart) then
- nrestart = 1
- endif
- endif
- call mpbci(nrestart)
- !
- if (nrestart == 0) then
- !
- ! new start (read start file)
- !
- if (mypid == NROOT) then
- open(20,FILE=trim(climatefile),FORM='formatted')
- do
- read(20,'(8I10)',IOSTAT=iostat) ih(:)
- if (iostat /= 0) exit
- read(20,'(8E12.6)',IOSTAT=iostat) zin(:)
- if (iostat /= 0) exit
- if (ih(1) == 169) then ! Code 169 for SST
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'SST month ',jmon,' found in ',trim(climatefile)
- zclsst(:,jmon) = zin(:)
- elseif (ih(1) == 180) then ! Code 180 for taux
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'TAUX month ',jmon,' found in ',trim(climatefile)
- zcltaux(:,jmon) = zin(:)
- elseif (ih(1) == 181) then ! Code 181 for tauy
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'TAUY month ',jmon,' found in ',trim(climatefile)
- zcltauy(:,jmon) = zin(:)
- elseif (ih(1) == 182) then ! Code 182 for evap
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'EVAP month ',jmon,' found in ',trim(climatefile)
- zclevap(:,jmon) = zin(:)
- elseif (ih(1) == 142) then ! Code 142 for prl
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'PRL month ',jmon,' found in ',trim(climatefile)
- zclprl(:,jmon) = zin(:)
- elseif (ih(1) == 143) then ! Code 143 for prc
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'PRC month ',jmon,' found in ',trim(climatefile)
- zclprc(:,jmon) = zin(:)
- elseif (ih(1) == 160) then ! Code 160 for roff
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'ROFF month ',jmon,' found in ',trim(climatefile)
- zclroff(:,jmon) = zin(:)
- elseif (ih(1) == 211) then ! Code 211 for iced
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'ICED month ',jmon,' found in ',trim(climatefile)
- zcliced(:,jmon) = zin(:)
- elseif (ih(1) == 141) then ! Code 141 for snow
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'SNOW month ',jmon,' found in ',trim(climatefile)
- zclsnow(:,jmon) = zin(:)
- elseif (ih(1) == 176) then ! Code 176 for swr
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'SWR month ',jmon,' found in ',trim(climatefile)
- zclswr(:,jmon) = zin(:)
- elseif (ih(1) == 177) then ! Code 177 for lwr
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'LWR month ',jmon,' found in ',trim(climatefile)
- zcllwr(:,jmon) = zin(:)
- elseif (ih(1) == 146) then ! Code 146 for shf
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'SHF month ',jmon,' found in ',trim(climatefile)
- zclshf(:,jmon) = zin(:)
- elseif (ih(1) == 147) then ! Code 147 for lhf
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'LHF month ',jmon,' found in ',trim(climatefile)
- zcllhf(:,jmon) = zin(:)
- elseif (ih(1) == 172) then ! Code 172 for Land-Sea-Mask
- write(nud,*) 'land-sea-mask found in ',trim(climatefile)
- zlsm(:) = zin(:)
- endif
- enddo
- close(20)
- !
- ! read sst and ice from surface.txt (if exist) and replace
- !
- open(20,FILE=trim(surface),FORM='formatted')
- do
- read(20,'(8I10)',IOSTAT=iostat) ih(:)
- if (iostat /= 0) exit
- read(20,'(8E12.6)',IOSTAT=iostat) zin(:)
- if (iostat /= 0) exit
- if (ih(1) == 169) then ! Code 169 for SST
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'SST month ',jmon,' found in ',trim(surface)
- zclsst(:,jmon) = zin(:)
- elseif (ih(1) == 211) then ! Code 211 for iced
- jmon=ih(3)
- if (jmon > 12) jmon = mod(jmon/100,100)
- write(nud,*) 'ICED month ',jmon,' found in ',trim(surface)
- zcliced(:,jmon) = zin(:)
- elseif (ih(1) == 172) then ! Code 172 for Land-Sea-Mask
- write(nud,*) 'land-sea-mask found in ',trim(surface)
- zlsm(:) = zin(:)
- endif
- enddo
- close(20)
- endif ! mypid
- zclsst(:,0)=zclsst(:,12)
- zclsst(:,13)=zclsst(:,1)
- zcltaux(:,0)=zcltaux(:,12)
- zcltaux(:,13)=zcltaux(:,1)
- zcltauy(:,0)=zcltauy(:,12)
- zcltauy(:,13)=zcltauy(:,1)
- zclprl(:,0)=zclprl(:,12)
- zclprl(:,13)=zclprl(:,1)
- zclprc(:,0)=zclprc(:,12)
- zclprc(:,13)=zclprc(:,1)
- zclevap(:,0)=zclevap(:,12)
- zclevap(:,13)=zclevap(:,1)
- zclroff(:,0)=zclroff(:,12)
- zclroff(:,13)=zclroff(:,1)
- zcliced(:,0)=zcliced(:,12)
- zcliced(:,13)=zcliced(:,1)
- zclsnow(:,0)=zclsnow(:,12)
- zclsnow(:,13)=zclsnow(:,1)
- zclswr(:,0)=zclswr(:,12)
- zclswr(:,13)=zclswr(:,1)
- zcllwr(:,0)=zcllwr(:,12)
- zcllwr(:,13)=zcllwr(:,1)
- zclshf(:,0)=zclshf(:,12)
- zclshf(:,13)=zclshf(:,1)
- zcllhf(:,0)=zcllhf(:,12)
- zcllhf(:,13)=zcllhf(:,1)
- !
- call mpscgp(zclsst,ccsst,14)
- call mpscgp(zcltaux,cctaux,14)
- call mpscgp(zcltauy,cctauy,14)
- call mpscgp(zclevap,ccevap,14)
- call mpscgp(zclprl,ccprl,14)
- call mpscgp(zclprc,ccprc,14)
- call mpscgp(zclroff,ccroff,14)
- call mpscgp(zcliced,cciced,14)
- call mpscgp(zclsnow,ccsnow,14)
- call mpscgp(zclswr,ccswr,14)
- call mpscgp(zcllwr,cclwr,14)
- call mpscgp(zclshf,ccshf,14)
- call mpscgp(zcllhf,cclhf,14)
- call mpscgp(zls,ccls,1)
- !
- ! make clsst >= tfreeze
- !
- do jm=0,13
- ccsst(:,jm)=AMAX1(ccsst(:,jm),TFREEZE)
- enddo
- !
- ! initialize
- !
- naccuout=0
- !
- call clget
- !
- yls(:)=real(nint(ccls(:)))
- ytaux(:)=cltaux(:)
- ytauy(:)=cltauy(:)
- yprl(:)=clprl(:)
- yprc(:)=clprc(:)
- yevap(:)=clevap(:)
- ysst(:)=clsst(:)
- ypme(:)=clprl(:)+clprc(:)+clevap(:)
- yroff(:)=clroff(:)
- yicesnow(:)=cliced(:)*CRHOI/1000.+clsnow(:)
- yheat(:)=clswr(:)+cllwr(:)+clshf(:)+cllhf(:)
- !
- else
- !
- ! restart from restart file
- !
- if (mypid == NROOT) then
- call get_restart_integer('nstep' ,nstep)
- call get_restart_integer('naccu' ,naccuout)
- endif
- !
- call mpgetgp('ccls',ccls,NHOR,1)
- call mpgetgp('ccsst',ccsst,NHOR,14)
- call mpgetgp('cctaux',cctaux,NHOR,14)
- call mpgetgp('cctauy',cctauy,NHOR,14)
- call mpgetgp('ccprl',ccprl,NHOR,14)
- call mpgetgp('ccprc',ccprc,NHOR,14)
- call mpgetgp('ccevap',ccevap,NHOR,14)
- call mpgetgp('ccroff',ccroff,NHOR,14)
- call mpgetgp('cciced',cciced,NHOR,14)
- call mpgetgp('ccsnow',ccsnow,NHOR,14)
- call mpgetgp('ccswr',ccswr,NHOR,14)
- call mpgetgp('cclwr',cclwr,NHOR,14)
- call mpgetgp('ccshf',ccshf,NHOR,14)
- call mpgetgp('cclhf',cclhf,NHOR,14)
- call mpgetgp('ols',ols,NHOR,1)
- call mpgetgp('otaux',otaux,NHOR,1)
- call mpgetgp('otauy',otauy,NHOR,1)
- call mpgetgp('oprl',oprl,NHOR,1)
- call mpgetgp('oprc',oprc,NHOR,1)
- call mpgetgp('oevap',oevap,NHOR,1)
- call mpgetgp('osst',osst,NHOR,1)
- call mpgetgp('opme',opme,NHOR,1)
- call mpgetgp('oicesnow',oicesnow,NHOR,1)
- call mpgetgp('oice',oice,NHOR,1)
- call mpgetgp('osnow',osnow,NHOR,1)
- call mpgetgp('oheat',oheat,NHOR,1)
- call mpgetgp('oofl',oofl,NHOR,1)
- call mpgetgp('oroff',oroff,NHOR,1)
- yls(:)=ccls(:)
- !
- endif
- !
- call mpbci(nstep)
- call mpbci(naccuout)
- !
- ! open output file
- !
- if (mypid == NROOT) then
- open(31,file='cl_output',form='unformatted')
- endif
- !
- if (nlsg > 0) then
- call mpgagp(zlsm,yls,1)
- call ntomin(nstep,ndatim(5),ndatim(4),ndatim(3),ndatim(2) &
- & ,ndatim(1))
- if(mypid == nroot) then
- !
- ! check if day_per_year are right (lsg coupling needs 360)
- !
- kdpy=n_days_per_year
- if(kdpy .ne. 360.) then
- write(nud,*) '!ERROR! for LSG coupling you need to set '
- write(nud,*) ' n_days_per_year in plasim namelist INP '
- write(nud,*) ' to 360 !'
- write(nud,*) ' at the moment, n_days_per_year= ',kdpy
- write(nud,*) 'Model stoped!'
- stop 'ERROR'
- endif
- call clsgini(ndatim,ntspd,naomod,nlsg,ngui,zlsm,nlon,nlat)
- endif
- endif
- !
- if (mypid == NROOT) then
- open(31,file='cl_output',form='unformatted')
- endif
- !
- return
- end subroutine clini
- ! ===================================================================
- ! SUBROUTINE clstep
- ! ===================================================================
- subroutine clstep
- use pumamod
- !
- real :: zsst(nlon*nlat)
- real :: ztaux(nlon*nlat)
- real :: ztauy(nlon*nlat)
- real :: zpme(nlon*nlat)
- real :: zroff(nlon*nlat)
- real :: zice(nlon*nlat)
- real :: zheat(nlon*nlat)
- real :: zfldo(nlon*nlat)
- real :: zmld(nlon*nlat)
- !
- ! dbug arrays
- !
- real,allocatable :: zprf1(:),zprf2(:),zprf3(:),zprf4(:),zprf5(:)
- !
- ! get climate
- !
- call clget
- !
- ! set climate (exept sst which is set later according to oceanmod)
- !
- yls(:)=ccls(:)
- ytaux(:)=cltaux(:)
- ytauy(:)=cltauy(:)
- yprl(:)=clprl(:)
- yprc(:)=clprc(:)
- yevap(:)=clevap(:)
- ypme(:)=clprl(:)+clprc(:)+clevap(:)
- yroff(:)=clroff(:)
- yicesnow(:)=cliced(:)*CRHOI/1000.+clsnow(:)
- yheat(:)=clswr(:)+cllwr(:)+clshf(:)+cllhf(:)
- !
- ols(:)=ccls(:)+ols(:)
- otaux(:)=cltaux(:)+otaux(:)
- otauy(:)=cltauy(:)+otauy(:)
- oprl(:)=clprl(:)+oprl(:)
- oprc(:)=clprc(:)+oprc(:)
- oevap(:)=clevap(:)+oevap(:)
- osst(:)=clsst(:)+osst(:)
- opme(:)=clprl(:)+clprc(:)+clevap(:)+opme(:)
- oroff(:)=clroff(:)+oroff(:)
- oicesnow(:)=cliced(:)*CRHOI/1000.+clsnow(:)+oicesnow(:)
- oice(:)=cliced(:)+oice(:)
- osnow(:)=clsnow(:)+osnow(:)
- oheat(:)=clswr(:)+cllwr(:)+clshf(:)+cllhf(:)+oheat(:)
- naccuout=naccuout+1
- !
- ! do the lsg coupling
- !
- if (nlsg > 0) then
- if(nlsg < 2) call mpgagp(zsst,ysst,1)
- call mpgagp(ztaux,ytaux,1)
- call mpgagp(ztauy,ytauy,1)
- call mpgagp(zpme,ypme,1)
- call mpgagp(zroff,yroff,1)
- call mpgagp(zice,yicesnow,1)
- call mpgagp(zheat,yheat,1)
- !! call mpgagp(zmld,ymld,1)
- call ntomin(nstep,ndatim(5),ndatim(4),ndatim(3),ndatim(2) &
- & ,ndatim(1))
- if(mypid == nroot) then
- call clsgstep(ndatim,nstep,zsst,ztaux,ztauy,zpme,zroff,zice &
- & ,zheat,zfldo)
- endif
- if(nlsg < 2) then
- if(mod(nstep,naomod) == naomod-1) call mpscgp(zfldo,yfldo,1)
- else
- yfldo(:)=0.
- endif
- oofl(:)=oofl(:)+yfldo(:)
- endif
- !
- ! if lsg coupling due to ahfl and osst, replace ssts
- !
- if(nlsg > 1) then
- if(mod(nstep,naomod) == naomod-1) call mpscgp(zsst,ysst,1)
- endif
- !
- ! set sst according to oceanmod
- !
- ysst(:)=clsst(:)
- !
- return
- end subroutine clstep
- ! ===================================
- ! SUBROUTINE CLSTOP
- ! ===================================
- subroutine clstop
- use pumamod
- !
- ! write restart file
- !
- if (mypid == NROOT) then
- call restart_prepare('climate_status')
- call put_restart_integer('nstep',nstep)
- call put_restart_integer('naccu',naccuout)
- endif
- !
- call mpputgp('ccls',ccls,NHOR,1)
- call mpputgp('ccsst',ccsst,NHOR,14)
- call mpputgp('cctaux',cctaux,NHOR,14)
- call mpputgp('cctauy',cctauy,NHOR,14)
- call mpputgp('ccprl',ccprl,NHOR,14)
- call mpputgp('ccprc',ccprc,NHOR,14)
- call mpputgp('ccevap',ccevap,NHOR,14)
- call mpputgp('ccroff',ccroff,NHOR,14)
- call mpputgp('cciced',cciced,NHOR,14)
- call mpputgp('ccsnow',ccsnow,NHOR,14)
- call mpputgp('ccswr',ccswr,NHOR,14)
- call mpputgp('cclwr',cclwr,NHOR,14)
- call mpputgp('ccshf',ccshf,NHOR,14)
- call mpputgp('cclhf',cclhf,NHOR,14)
- call mpputgp('ols',ols,NHOR,1)
- call mpputgp('otaux',otaux,NHOR,1)
- call mpputgp('otauy',otauy,NHOR,1)
- call mpputgp('oprl',oprl,NHOR,1)
- call mpputgp('oprc',oprc,NHOR,1)
- call mpputgp('oevap',oevap,NHOR,1)
- call mpputgp('osst',osst,NHOR,1)
- call mpputgp('opme',opme,NHOR,1)
- call mpputgp('oicesnow',oicesnow,NHOR,1)
- call mpputgp('oice',oice,NHOR,1)
- call mpputgp('osnow',osnow,NHOR,1)
- call mpputgp('oheat',oheat,NHOR,1)
- call mpputgp('oofl',oofl,NHOR,1)
- call mpputgp('oroff',oroff,NHOR,1)
- !
- ! close output file
- !
- if (mypid == NROOT) then
- close(31)
- endif
- !
- ! stop lsg coupling
- !
- if(nlsg > 0) then
- if(mypid == NROOT) then
- call clsgstop
- endif
- endif
- !
- return
- end subroutine clstop
- ! ===================================
- ! SUBROUTINE CLOUT
- ! ===================================
- subroutine clout
- use pumamod
- !
- integer ih(8)
- !
- zn=1./real(naccuout)
- ols(:)=ols(:)*zn
- osst(:)=osst(:)*zn
- otaux(:)=otaux(:)*zn
- otauy(:)=otauy(:)*zn
- oprl(:)=oprl(:)*zn
- oprc(:)=oprc(:)*zn
- oevap(:)=oevap(:)*zn
- oroff(:)=oroff(:)*zn
- oice(:)=oice(:)*zn
- oofl(:)=oofl(:)*zn
- oicesnow(:)=oicesnow(:)*zn
- opme(:)=opme(:)*zn
- osnow(:)=osnow(:)*zn
- oheat(:)=oheat(:)*zn
- !
- call writegp(31,oprl,142,1)
- call writegp(31,oprc,143,1)
- call writegp(31,oroff,160,1)
- call writegp(31,osst,169,1)
- call writegp(31,ols,172,1)
- call writegp(31,otaux,180,1)
- call writegp(31,otauy,181,1)
- call writegp(31,oevap,182,1)
- call writegp(31,oice,211,1)
- call writegp(31,oofl,222,1)
- call writegp(31,oicesnow,69,1)
- call writegp(31,oheat,263,1)
- call writegp(31,opme,260,1)
- call writegp(31,osnow,141,1)
- !
- naccuout=0
- ols(:)=0.
- osst(:)=0.
- otaux(:)=0.
- otauy(:)=0.
- oprl(:)=0.
- oprc(:)=0.
- oevap(:)=0.
- oroff(:)=0.
- oice(:)=0.
- oofl(:)=0.
- oicesnow(:)=0.
- opme(:)=0.
- osnow(:)=0.
- oheat(:)=0.
- !
- return
- end subroutine clout
- !====================================================================
- ! SUBROUTINE CLGET
- !====================================================================
- subroutine clget
- use pumamod
- ! *********************
- ! * get annual cycle *
- ! *********************
- ! modified for 14 months version of SST
- ! jm2: 0=Dec, 1-12:Months, 13=Jan
- jstep=nstep+1 !advance time step (ts = ts(t)+ dtsdt)
- call ntomin(jstep,nmin,nhour,nday,nmonth,nyear)
- !
- jm1 = nmonth
- if (nday > 15) then ! Does not work for other planets
- jm2=jm1+1
- else
- jm2=jm1-1
- endif
- ! ****************************************
- !* interpolate
- ! ****************************************
- zgw2 = abs((nday-1)*1440+nhour*60+nmin-21600)/43200.
- zgw1 = 1.0 - zgw2
- clsst(:) = zgw1*ccsst(:,jm1)+zgw2*ccsst(:,jm2)
- cltaux(:) = zgw1*cctaux(:,jm1)+zgw2*cctaux(:,jm2)
- cltauy(:) = zgw1*cctauy(:,jm1)+zgw2*cctauy(:,jm2)
- clprl(:) = zgw1*ccprl(:,jm1)+zgw2*ccprl(:,jm2)
- clprc(:) = zgw1*ccprc(:,jm1)+zgw2*ccprc(:,jm2)
- clevap(:) = zgw1*ccevap(:,jm1)+zgw2*ccevap(:,jm2)
- clroff(:) = zgw1*ccroff(:,jm1)+zgw2*ccroff(:,jm2)
- cliced(:) = zgw1*cciced(:,jm1)+zgw2*cciced(:,jm2)
- clsnow(:) = zgw1*ccsnow(:,jm1)+zgw2*ccsnow(:,jm2)
- clswr(:) = zgw1*ccswr(:,jm1)+zgw2*ccswr(:,jm2)
- cllwr(:) = zgw1*cclwr(:,jm1)+zgw2*cclwr(:,jm2)
- clshf(:) = zgw1*ccshf(:,jm1)+zgw2*ccshf(:,jm2)
- cllhf(:) = zgw1*cclhf(:,jm1)+zgw2*cclhf(:,jm2)
- clsnow(:)=max(clsnow(:),0.)
- cliced(:)=max(cliced(:),0.)
- clprl(:)=max(clprl(:),0.)
- clprc(:)=max(clprc(:),0.)
- clroff(:)=max(clroff(:),0.)
- clevap(:)=min(clevap(:),0.)
- where(cliced(:)==0.) clsnow=0.
- return
- end subroutine clget
- ! ==================
- ! SUBROUTINE UPDATIM
- ! ==================
- subroutine updatim(kstep)
- use pumamod
- if (n_days_per_year == 365) then
- call step2cal(kstep,ntspd,ndatim)
- else
- call step2cal30(kstep,ntspd,ndatim)
- endif
- return
- end
- subroutine writegp(kunit,pf,kcode,klev)
- use pumamod
- real :: pf(NHOR)
- real :: zf(NUGP)
- integer(kind=4) :: ihead(8)
- real(kind=4) :: zzf(NUGP)
- istep = nstep
- call ntomin(istep,nmin,nhour,nday,nmonth,nyear)
- ihead(1) = kcode
- ihead(2) = klev
- ihead(3) = nday + 100 * nmonth + 10000 * nyear
- ihead(4) = nmin + 100 * nhour
- ihead(5) = NLON
- ihead(6) = NLAT
- ihead(7) = 1
- ihead(8) = n_days_per_year
- call mpgagp(zf,pf,1)
- if (mypid == NROOT) then
- write(kunit) ihead
- zzf(:)=zf(:)
- write(kunit) zzf
- endif
- return
- end
- !
- ! dummies
- !
- subroutine get_surf_array(yn,pa,k1,k2,kread)
- character (len=*) :: yn ! array name
- real :: pa(k1,k2) ! array to receive values
- integer :: k1 ! 1. dim of array
- integer :: k2 ! 2. dim of array
- integer :: kread ! flag to indicate success
- return
- end
- subroutine get_3d_year(yn,pa,kdim,klev,kread)
- character (len=*) :: yn
- real :: pa(kdim,klev,0:13)
- return
- end
- subroutine get_surf_year(yn,pa,kdim,kread)
- character (len=*) :: yn
- integer :: ih(8)
- real :: pa(kdim,0:13)
- return
- end
|