/[MITgcm]/MITgcm_contrib/osse/EnKF/EnKF.F
ViewVC logotype

Contents of /MITgcm_contrib/osse/EnKF/EnKF.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations) (download)
Wed May 19 15:43:10 2004 UTC (21 years, 2 months ago) by afe
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +0 -0 lines
FILE REMOVED
o refining osse setup

1 c*** ensemble kalman filter subroutine
2
3 subroutine EnKF(A,z,H,ns,no,varmes,nrsamp)
4
5 c*** A is the matrix of ensemble forecasts, z is the observation,
6 c*** H is the observation operator, ns is the size of the model
7 c*** state, no is the number of observation locations, varmes is
8 c*** the observational uncertainty, and nrsamp is the ensemble size.
9
10 integer ns, no, nrsamp
11 integer ijim
12
13 real, intent(inout) :: A(ns,nrsamp)
14 real, intent(in) :: z(no)
15
16 integer i,j,m,mm,info,idum,ibawk
17 real rcond
18 real H(no,ns)
19 real vave(ns), vvar(ns), varmes(no)
20 real temp
21
22 real, allocatable :: K(:,:)
23 real, allocatable :: RR(:,:)
24 real, allocatable :: RRR(:,:)
25 real, allocatable :: w(:)
26 real, allocatable :: tmp(:,:)
27 real, allocatable :: d(:)
28 real, allocatable :: pd(:,:)
29 real, allocatable :: transA(:,:)
30 real, allocatable :: transtmp(:,:)
31 real, allocatable :: tmp2(:,:)
32
33
34 allocate (K(no,ns), RR(no,no), RRR(no,no))
35 allocate (transA(nrsamp,ns),transtmp(nrsamp,no))
36 allocate (w(ns), tmp(no,nrsamp))
37 allocate (d(no), pd(1,ns), tmp2(1,ns))
38
39 c*** initialising the observational error covariance matrix and
40 c*** the projector from model space to observational space.
41 RR=0.0
42
43 c*** define obs error covariance matrix as a diagonal matrix
44 do m=1,no
45 RR(m,m)=varmes(m)
46 enddo
47
48 c*** calculate ensemble mean
49 call ranmean2(A,w,ns,nrsamp)
50
51 c*** remove ensemble mean from the ensemble members
52 do i=1,nrsamp
53 A(:,i)=A(:,i)-w(:)
54 enddo
55
56 c*** tmp takes on the product of the observation projector and
57 c*** the ensemble anomalies.
58 tmp=matmul(H,A)
59
60 c*** K takes on the value of H(A-ABAR)(A-ABAR)^T
61 K=matmul(tmp,transpose(A))
62
63 c*** K is what is called B in eqn (6)
64 K=(1.0/(float(nrsamp)-1.0))*K
65
66 c*** restore A by adding back ensemble mean value.
67 do i=1,nrsamp
68 A(:,i)=A(:,i)+w(:)
69 enddo
70
71 c*** RR is obs error cov matrix, and the forecast error cov is added to
72 c*** it, making it the first half of the right hand side of equation (8).
73 c*** if one was to wipe out spurious long distance correlations, it would
74 c*** happen here.
75 RR=RR+(1./(float(nrsamp)-1.))*matmul(tmp,transpose(tmp))
76
77 c*** standard solver for coefficients beta
78 call spoco(RR,no,no,rcond,w,info)
79
80 c*** correct each member of the ensemble
81 do j=1,nrsamp
82
83 call random2(d,no)
84 d=z+sqrt(varmes)*d-matmul(H,A(:,j))
85 call sposl(RR,no,no,d)
86 A(:,j)=A(:,j)+matmul(d,K)
87
88 enddo !A has now been corrected by the data.
89
90 deallocate (K, RR, RRR)
91 deallocate (transA, transtmp)
92 deallocate (w, tmp)
93 deallocate (d,pd,tmp2)
94
95 return
96 end
97
98
99
100
101

  ViewVC Help
Powered by ViewVC 1.1.22