subroutine co2emitdata return end subroutine co2ccndata return end subroutine satdata !======================================================================= ! routine to read and interpolate one dimensional forcing data !======================================================================= implicit none character(120) :: fname, name, new_file_name, text integer iou, n, ln, ib(10), ic(10) logical inqvardef, exists, track real avg_sat, dat(3), data_time, fa, pk, tim(3) real tmp, wt1, wt3 real, allocatable :: data(:), time(:) save dat, data, ln, tim, time include "size.h" include "param.h" include "pconst.h" include "stdunits.h" include "calendar.h" include "cembm.h" include "atm.h" include "ice.h" include "switch.h" include "tmngr.h" real dmsk(imt,jmt), sat(imt,jmt) ! fa is used in converting g carbon cm-2 => ppmv CO2 ! 4.138e-7 => 12e-6 g/umol carbon / 29 g/mol air fa = 1./(4.138e-7*rhoatm*shc) ! temperature to CO2 conversion divided by response time scale ! (approximate CO2 concentration divided by climate sensitivity) pk = 300./3.0/(float(ntrack_sat)/4.) track = .true. if (.not. allocated (time)) then name = "A_sattrack.nc" fname = new_file_name (name) inquire (file=trim(fname), exist=exists) if (.not. exists) then print*, "==> Warning: ", trim(fname), " does not exist." ln = 3 allocate ( time(ln) ) allocate ( data(ln) ) time(:) = year0 data(:) = track_sat(1) else call openfile (fname, iou) call getdimlen ('time', iou, ln) allocate ( time(ln) ) allocate ( data(ln) ) ib(:) = 1 ic(:) = ln call getvara ('time', iou, ln, ib, ic, time, c1, c0) text = 'years' call getatttext (iou, 'time', 'units', text) if (trim(text) .eq. "days since 1-1-1") & time(:) = time(:)/yrlen - 1. if (trim(text) .eq. "days since 0-1-1") & time(:) = time(:)/yrlen if (trim(text) .eq. "years since 1-1-1") & time(:) = time(:) - 1. exists = inqvardef('A_sat', iou) if (.not. exists) then print*, "==> Warning: A_sat data does not exist." else call getvara ('A_sat', iou, ln, ib, ic, data, c1, c0) text = "C" call getatttext (iou, 'A_sat', 'units', text) ! convert to model units (C) if (trim(text) .eq. "K") & where (data(:) .lt. 1.e30) data(:) = data(:) - 273.15 endif endif tim(:) = time(1) dat(:) = data(1) endif data_time = year0 + accel_yr0 + (relyr - accel_yr0)*accel tim(2) = min(time(ln), max(time(1), data_time)) if (tim(2) .le. time(1)) then dat(2) = data(1) elseif (tim(2) .ge. time(ln)) then dat(2) = data(ln) else if (tim(2) .gt. tim(3)) then do n=2,ln if (time(n-1) .le. tim(2) .and. time(n) .ge. tim(2)) then tim(1) = time(n-1) dat(1) = data(n-1) tim(3) = time(n) dat(3) = data(n) endif enddo endif wt1 = 1. if (tim(3) .ne. tim(1)) wt1 = (tim(3)-tim(2))/(tim(3)-tim(1)) wt1 = max(0., min(1., wt1)) wt3 = 1. - wt1 dat(2) = dat(1)*wt1 + dat(3)*wt3 endif sat(:,:) = at(:,:,2,isat) - elev(:,:)*rlapse & - hicel(:,:,2)*rlapse dmsk(:,:) = 1. call areaavg (sat, dmsk, tmp) itrack_sat = itrack_sat + 1 if (itrack_sat .gt. ntrack_sat) itrack_sat = 1 track_sat(itrack_sat) = tmp avg_sat = 0. do n=1,ntrack_sat if (track_sat(n) .ge. 1.e10) track = .false. avg_sat = avg_sat + track_sat(n) enddo avg_sat = avg_sat/ntrack_sat if (track) then ! use simple proportional control co2emit = pk*(dat(2) - avg_sat)/(segtim*daylen*fa) endif return end