pro convolve_gaussian_1d,resol,tarr,varrin,varrout
pi=3.14159265358D
eps=0.0001
ni=4
ndump=10
hw=0.5*resol
ntin=n_elements(tarr)
trel=tarr-tarr(0)
lhst=-0.5*(trel/hw)^2
rhst=alog(sqrt(2*pi)*hw*eps)
ind=where(lhst ge rhst,nbgauss)
if nbgauss lt ntin then begin
svin=size(varrin)
ndim=svin(0)
if ndim eq 1 then begin
nvec=1
secdim=n_elements(varrin)
endif else begin
nvec=svin(2)
secdim=svin(1)
endelse
nin=secdim
if nin ne ntin then begin
print,'Error: Lengths of time array and signal array differ. gaussconv exits.'
return
endif
varrout=fltarr(secdim,nvec)
for i=0,nvec-1 do begin
if nvec eq 1 then varrinn=varrin else varrinn=reform(varrin(*,i))
nadd=nbgauss
vaddr=fltarr(nadd)+varrinn(nin-1)
vaddl=fltarr(nadd)+varrinn(0)
nwork=nin+2*nadd+ndump+0L
n=ni
while 2.D^n lt nwork do n=n+1
ntot=long(round(2.D^n))
ndumpeff=ntot-nin-2*nadd
vdumpeff=varrinn(nin-1)+(varrinn(0)-varrinn(nin-1))*(lindgen(ndumpeff)+1.D)/(ndumpeff+1.D)
vtofft=[varrinn,vaddr,vdumpeff,reverse(vaddl)]
tmax=trel(ntin-1)
delavt=tmax/(ntin-1.)
delnu=1./(delavt*ntot)
coeff=2*(pi*hw*delnu)^2
harm=dindgen(ntot)
fft1=FFT(vtofft,/DOUBLE)
fft2=EXP(-coeff*harm^2)>EXP(-coeff*(ntot-harm)^2)
fcon=fft1*fft2
con=FFT(fcon,/INVERSE)
vcon=DOUBLE(con(0:nin-1))
if nvec eq 1 then varrout=vcon else varrout(*,i)=vcon
endfor
endif else begin
print,'Bell curve is broader than the signal base.'
print,'The meaning of convolution is unclear in this case.'
print,'gaussconv quits, convolution aborted.'
varrout=varrin
return
endelse
end