1 *************************************************************************** 2 * * 3 * program eof analysis for January atlantic sst anomalies 4 * 5 * parameter * 6 * * 7 * 1.variable * 8 * sst : sea surface temperature * 9 * mon : month * 10 * iyr : year * 11 * 12 * compile command f77 file.f -llapack -lblas 13 * deback command f77 file.f -o silly -g -llapack -lblas 14 * 15 *************************************************************************** 16 parameter (i2s=1,i2e=59,j2s=1,j2e=60,k2s=26,k2e=60) 17 parameter (iys=1900,iye=1996,ipn=1069,idn=(iye-iys+1-1)) 18 parameter (mode=5) 19 20 double precision t0(idn,ipn) 21 double precision a (ipn,ipn) 22 integer i2g(ipn),j2g(ipn) 23 24 open(91,file= 25 &'../dataset/sst.gisst.1900-1996.1x1.monthly.n_atl.dat' 26 & ,form='unformatted',access='direct' 27 & ,recl=_________________________ 28 & ,status='old') 29 30 open(92,file='../stat_data/SSTeof101v' 31 & ,form='unformatted',access='direct' 32 & ,recl=(i2e-i2s+1)*(k2e-k2s+1)*4) 33 open(93,file='../stat_data/SSTeof101t' 34 & ,form='unformatted',access='direct' 35 & ,recl=mode*4) 36 37 write(6,*) 'dread(t0,i2g,j2g)' 38 call dread(t0,i2g,j2g) 39 40 write(6,*) 'covar(t0,a)' 41 call covar(t0,a) 42 43 write(6,*) 'eigen(t0,a,i2g,j2g)' 44 call eigen(t0,a,i2g,j2g) 45 46 stop 47 end 48 c/////////////////////////////////////////////////////////////////////// 49 subroutine dread(t0,i2g,j2g) 50 parameter (i2s=1,i2e=59,j2s=1,j2e=60,k2s=26,k2e=60) 51 parameter (iys=1900,iye=1996,ipn=1069,idn=(iye-iys+1-1)) 52 53 double precision t0(idn,ipn) 54 integer i2g(ipn),j2g(ipn) 55 56 real sst (i2e-i2s+1,j2e-j2s+1,iys+1:iye) 57 real*4 r4 (i2e-i2s+1,j2e-j2s+1) 58 integer n (i2e-i2s+1,j2e-j2s+1) 59 60 do 1010 i2=i2s,i2e 61 do 1010 j2=j2s,j2e 62 n (i2,j2)=0 63 do 1015 iyr=iys+1,iye 64 sst(i2,j2,iyr)=0.0 65 1015 continue 66 1010 continue 67 68 do 1020 iyr=iys+1,iye 69 mon=3 70 ir=12*(iyr-iys)+mon 71 read(91,rec=ir) r4 72 73 do 1025 i2=1,i2e-i2s+1 74 do 1025 j2=1,j2e-j2s+1 75 if(r4(i2,j2).gt.-0.9e21) then 76 sst(i2,j2,iyr)=r4(i2,j2) 77 n (i2,j2) =n (i2,j2)+1 78 endif 79 1025 continue 80 1020 continue 81 82 np=0 83 do 1030 i2=1,i2e-i2s+1 84 do 1030 j2=k2s,k2e 85 c '25' is the northern limit of southern domain 86 if(n (i2,j2).eq.(iye-iys+1-1)) then 87 np =np+1 88 i2g(np)=i2 89 j2g(np)=j2 90 do 1031 iyr=iys+1,iye 91 t0(iyr-iys,np)=dble(______________) 92 1031 continue 93 endif 94 1030 continue 95 write(6,*) np 96 pause 97 98 return 99 end 100 c/////////////////////////////////////////////////////////// 101 subroutine covar(t0,a) 102 parameter (iys=1900,iye=1996,ipn=1069,idn=(iye-iys+1-1)) 103 104 double precision t0(idn,ipn) 105 double precision a (ipn,ipn) 106 double precision x0,y0,vxy,sumvar,sumcovar 107 108 do 10 _=1,ipn 109 do 10 _=1,ipn 110 vxy=0.0d00 111 112 do 11 k=1,idn 113 x0=t0(k,i) 114 y0=t0(k,j) 115 vxy=________ 116 11 continue 117 118 a(i,j)=(vxy)/dble(idn) 119 120 10 continue 121 122 sumvar=0.0 123 nvar =0 124 do 20 i=1,ipn 125 sumvar=sumvar+a(i,i) 126 nvar =nvar+1 127 20 continue 128 129 sumcovar=0.0 130 ncovar =0 131 do 30 i=1,ipn 132 do 30 j=1,ipn 133 if(i.ne.j) then 134 sumcovar=sumcovar+a(i,j) 135 ncovar=ncovar+1 136 endif 137 30 continue 138 139 write(6,*) sumvar ,nvar 140 write(6,*) sumcovar,ncovar,ipn*ipn-ipn 141 142 return 143 end 144 c/////////////////////////////////////////////////////////// 145 subroutine eigen(t0,a,i2g,j2g) 146 parameter (i2s=1,i2e=59,j2s=1,j2e=60,k2s=26,k2e=60) 147 parameter (iys=1900,iye=1996,ipn=1069,idn=(iye-iys+1-1)) 148 parameter (lwork=ipn*ipn) 149 parameter (mode=5) 150 151 double precision t0(idn,ipn) 152 double precision a (ipn,ipn) 153 integer i2g(ipn),j2g(ipn) 154 155 double precision eval(ipn) 156 double precision work(lwork) 157 158 real*4 score(mode) 159 real*4 mtrx(i2e-i2s+1,k2e-k2s+1) 160 161 real sum,vxy 162 163 c------------------------------------eigen value decomposition 164 n =ipn 165 lda1=ipn 166 call dsyev(___,___,_,_,____,____,____,_____,____) 167 168 write(6,*) info 169 c------------------------------------------------------------- 170 c------------------------------------explained variance of each mode 171 sum=0.0 172 do 10 i=ipn,1,-1 173 sum=sum+eval(i) 174 10 continue 175 176 write(6,'(5f8.5)') (eval(i)/sum,i=ipn,ipn-4,-1) 177 c---------------------------------------------------------------- 178 c------------------------------------temporal coefficient of each mode 179 k=0 180 do 20 iyr=iys+1,iye 181 k =k+1 182 do 21 i=ipn,ipn-4,-1 183 vxy=0.0 184 do 22 j=1,ipn 185 c dim.1: grid, dim.2: mode > a(j,i)) 186 vxy=vxy+t0(k,j)*a(j,i) 187 22 continue 188 c dim.1: mode, dim.2: time > score(ipn-1+1,k) 189 score(ipn-i+1)=vxy/sqrt(eval(i)) 190 21 continue 191 itn=iyr-iys 192 c write(6,*) itn,score 193 write(93,rec=itn) score 194 20 continue 195 196 c---------------------------------------------------------------- 197 c-----------------------------------check for squared all eigen vectors =1.0 198 sumev=0.0 199 do 30 j=1,ipn 200 c write(6,'(5f10.5)') (a(j,i),i=ipn,ipn-4,-1) 201 sumev=sumev+a(j,i)*a(j,i) 202 30 continue 203 c write(6,*) 'sumev=', sumev 204 c---------------------------------------------------------------- 205 c------------------------------------eigen vectors on lon x lat map 206 do 40 i2=1,i2e-i2s+1 207 do 40 j2=1,k2e-k2s+1 208 mtrx(i2,j2)=-1.0e21 209 40 continue 210 211 iw=0 212 do 50 i=ipn,ipn-4,-1 213 iw=iw+1 214 do 51 j=1,ipn 215 c write(6,'(3i5,f10.5)') j,ig(j),jg(j),a(j,i) 216 mtrx(i2g(j),j2g(j)-k2s+1)=a(j,i)*sqrt(eval(i)) 217 51 continue 218 219 write(92,rec=iw) mtrx 220 50 continue 221 222 return 223 end