33 wts_ensmean,wts_ensperts,&
34 rdiaginv_loc,nanals,neigv,getkf_inflation,denkf,getkf)
125 integer(i_kind),
intent(in) :: nobsl,nanals,neigv
126 real(r_kind),
dimension(nobsl),
intent(in ) :: rdiaginv_loc
127 real(r_kind),
dimension(nanals,nobsl),
intent(inout) :: hxens
128 real(r_single),
dimension(nanals/neigv,nobsl),
intent(in) :: hxens_orig
129 real(r_single),
dimension(nobsl),
intent(in) :: dep
130 real(r_single),
dimension(nanals),
intent(out) :: wts_ensmean
131 real(r_single),
dimension(nanals,nanals/neigv),
intent(out) :: wts_ensperts
134 real(r_kind),
allocatable,
dimension(:,:) :: work3,evecs
135 real(r_single),
allocatable,
dimension(:,:) :: swork2,pa,swork3,shxens
136 real(r_single),
allocatable,
dimension(:) :: swork1
137 real(r_kind),
allocatable,
dimension(:) :: rrloc,evals,gammapI,gamma_inv
139 integer(i_kind) :: nanal,ierr,lwork,liwork
141 integer(i_kind) isuppz(2*nanals)
142 real(r_kind) vl,vu,normfact
143 integer(i_kind),
allocatable,
dimension(:) :: iwork
144 real(r_kind),
dimension(:),
allocatable :: work1
145 logical,
intent(in) :: getkf_inflation,denkf,getkf
149 call abor1_ftn(
"neigv must be >=1 in letkf_core")
152 allocate(work3(nanals,nanals),evecs(nanals,nanals))
153 allocate(rrloc(nobsl),gammapi(nanals),evals(nanals),gamma_inv(nanals))
157 allocate(iwork(3+5*nanals),work1(1+6*nanals+2*nanals*nanals))
161 eps = epsilon(0.0_r_single)
162 where (rrloc < eps) rrloc = eps
164 normfact = sqrt(real((nanals/neigv)-1,r_kind))
167 hxens(nanal,1:nobsl) = hxens(nanal,1:nobsl) * &
168 rrloc(1:nobsl)/normfact
173 lwork =
size(work1); liwork =
size(iwork)
174 if(r_kind == kind(1.d0))
then
176 call dgemm(
'n',
't',nanals,nanals,nobsl,1.d0,hxens,nanals, &
177 hxens,nanals,0.d0,work3,nanals)
184 call dsyevd(
'V',
'L',nanals,evecs,nanals,evals,work1,lwork,iwork,liwork,ierr)
186 call sgemm(
'n',
't',nanals,nanals,nobsl,1.e0,hxens,nanals, &
187 hxens,nanals,0.e0,work3,nanals)
193 call ssyevd(
'V',
'L',nanals,evecs,nanals,evals,work1,lwork,iwork,liwork,ierr)
195 if (ierr .ne. 0) print *,
'warning: dsyev* failed, ierr=',ierr
196 deallocate(work1,iwork,work3)
197 gamma_inv = 0.0_r_kind
199 if (evals(nanal) > eps)
then
200 gamma_inv(nanal) = 1./evals(nanal)
202 evals(nanal) = 0.0_r_kind
210 allocate(shxens(nanals,nobsl))
212 shxens(nanal,1:nobsl) = hxens(nanal,1:nobsl) * rrloc(1:nobsl)
221 allocate(swork3(nanals,nanals),swork2(nanals,nanals),pa(nanals,nanals))
223 swork3(nanal,:) = evecs(nanal,:)/gammapi
224 swork2(nanal,:) = evecs(nanal,:)
229 call sgemm(
'n',
't',nanals,nanals,nanals,1.e0,swork3,nanals,swork2,&
230 nanals,0.e0,pa,nanals)
234 allocate(swork1(nanals))
236 swork1(nanal) = sum(shxens(nanal,:)*dep(:))
241 wts_ensmean(nanal) = sum(pa(nanal,:)*swork1(:))/normfact
264 gammapi = sqrt(1.0/gammapi)
267 evecs(nanal,:)*(1.-gammapi(:))*gamma_inv(:)
272 call sgemm(
'n',
't',nanals,nanals,nanals,1.e0,swork3,nanals,swork2,&
273 nanals,0.e0,pa,nanals)
275 deallocate(swork2,swork3)
281 allocate(swork2(nanals,nanals/neigv))
283 call sgemm(
'n',
't',nanals,nanals/neigv,nobsl,1.e0,&
284 shxens,nanals,hxens_orig,nanals/neigv,0.e0,swork2,nanals)
289 call sgemm(
'n',
'n',nanals,nanals/neigv,nanals,-1.e0,&
290 pa,nanals,swork2,nanals,0.e0,wts_ensperts,nanals)
291 wts_ensperts = wts_ensperts/normfact
294 deallocate(shxens,swork2,pa)
301 call abor1_ftn(
"neigv must be 1 in letkf_core if getkf=F")
309 deallocate(shxens,pa)
310 gammapi = sqrt(1.0/gammapi)
312 swork3(nanal,:) = evecs(nanal,:)*gammapi
318 call sgemm(
'n',
't',nanals,nanals,nanals,1.0,swork3,nanals,swork2,&
319 nanals,0.e0,wts_ensperts,nanals)
320 deallocate(swork3,swork2)
324 deallocate(evecs,gammapi,gamma_inv)