1 |
afe |
1.1 |
program hadley3 |
2 |
|
|
|
3 |
|
|
c*** This subroutine calculates analysis errors using greg's |
4 |
|
|
c*** ensemble square root filter, or the traditional ensemble |
5 |
|
|
c*** kalman filter. |
6 |
|
|
c*** |
7 |
|
|
c*** Written by: Sai Ravela |
8 |
|
|
c*** Last modified: Feb 2, 2003 |
9 |
|
|
|
10 |
|
|
implicit none |
11 |
|
|
|
12 |
|
|
integer i, j, k, n, ijim, ijuli, isteps, nens, ics |
13 |
|
|
integer nx, ny, nz, nf, nnx, nny, nnz, mobs, isai |
14 |
|
|
integer ii, jj, zob, xob, yob |
15 |
|
|
#include "hadley3.h" |
16 |
|
|
integer iobsloc(mobs), indxa |
17 |
|
|
real*8 ytrue(n), yobs(mobs), ytmp(n) |
18 |
|
|
real*8 pert(n), R(mobs), yobsfull(n), ave(n), var(n) |
19 |
|
|
real*8 xens(n,nens) |
20 |
|
|
real*8 var_obs, eps, dt, x |
21 |
|
|
real*8 obserr, analerr, distsub, distobs |
22 |
|
|
integer iret, system |
23 |
|
|
real*4 mask(ny,nx) |
24 |
|
|
|
25 |
|
|
c*** open some output files |
26 |
|
|
open(unit=2,file='test.dat',status='unknown') |
27 |
|
|
c open(unit=3,file='fields.dat',status='unknown') |
28 |
|
|
|
29 |
|
|
c*** initialisations |
30 |
|
|
eps=0.005 ! obs error - 1/2 mm/s |
31 |
|
|
isteps=1 ! number of steps per obs cycle |
32 |
|
|
|
33 |
|
|
c*** Here is where you read iobsloc and corresponding |
34 |
|
|
c variances. You should know |
35 |
|
|
c mobs in advance...in hadley |
36 |
|
|
|
37 |
|
|
call ReadObs(3,mobs,iobsloc) |
38 |
|
|
write (*,*) 'iobsloc set',mobs, iobsloc(mobs), nens |
39 |
|
|
var_obs=eps**2 |
40 |
|
|
do i=1,mobs |
41 |
|
|
if (iobsloc(i) < nx*ny*nz*3) then |
42 |
|
|
R(i)=var_obs |
43 |
|
|
else |
44 |
|
|
R(i) = 0.1 ! 0.9 deg other |
45 |
|
|
end if |
46 |
|
|
enddo |
47 |
|
|
|
48 |
|
|
|
49 |
|
|
c*** loop over initial conditions |
50 |
|
|
do ijim=1,ics |
51 |
|
|
|
52 |
|
|
call ReadPickup(0,n,nx,ny,nz,ytrue) |
53 |
|
|
write (*,*) 'Picked Truth' |
54 |
|
|
do k = 1,mobs |
55 |
|
|
indxa = iobsloc(k) |
56 |
|
|
yobs(k) = ytrue(indxa) |
57 |
|
|
end do |
58 |
|
|
do isai=1,nens |
59 |
|
|
call ReadPickUp(isai,n,nx,ny,nz,ytmp) |
60 |
|
|
do k=1,n |
61 |
|
|
xens(k,isai)=ytmp(k) |
62 |
|
|
enddo |
63 |
|
|
enddo |
64 |
|
|
write (*,*) 'Picked Ensemble' |
65 |
|
|
call EnSRF3d(xens,yobs,iobsloc,n,mobs,R,nens,nx,ny,nz,mask) |
66 |
|
|
c*** get ensemble mean and variance |
67 |
|
|
call ranmean2(xens,ave,n,nens) |
68 |
|
|
c*** calculate obs and anal err |
69 |
|
|
analerr=distobs(yobs,ave,iobsloc,mobs,n) |
70 |
|
|
write(6,*) ijim, analerr |
71 |
|
|
write(2,*) ijim, analerr |
72 |
|
|
analerr=distsub(ytrue,ave,n) |
73 |
|
|
write(6,*) '>',ijim, analerr |
74 |
|
|
write(2,*) '>',ijim, analerr |
75 |
|
|
c write(3,'(250f18.10)') (ave(i), i=1,n) |
76 |
|
|
|
77 |
|
|
|
78 |
|
|
c*** step truth forward |
79 |
|
|
call Model(0) |
80 |
|
|
call ReadPickup(0,n,nx,ny,nz,ytmp) |
81 |
|
|
call WritePickUp(0,n,nx,ny,nz,ytmp) |
82 |
|
|
write (*,*) 'Stepped Truth' |
83 |
|
|
c*** step ensemble forward |
84 |
|
|
do isai=1,nens |
85 |
|
|
do k=1,n |
86 |
|
|
ytmp(k)=xens(k,isai) |
87 |
|
|
enddo |
88 |
|
|
call WritePickUp(isai,n,nx,ny,nz,ytmp) |
89 |
|
|
call Model(isai) |
90 |
|
|
enddo |
91 |
|
|
write (*,*) 'Stepped Ensemble' |
92 |
|
|
call flush() |
93 |
|
|
|
94 |
|
|
enddo |
95 |
|
|
|
96 |
|
|
return |
97 |
|
|
end |
98 |
|
|
|