| 1 |
C $Header: /u/gcmpack/MITgcm/pkg/ecco/cost_ssh_new.F,v 1.5 2009/04/28 18:13:28 jmc Exp $ |
| 2 |
C $Name: $ |
| 3 |
|
| 4 |
#include "COST_CPPOPTIONS.h" |
| 5 |
|
| 6 |
|
| 7 |
subroutine cost_ssh_new( |
| 8 |
I myiter, |
| 9 |
I mytime, |
| 10 |
I mythid |
| 11 |
& ) |
| 12 |
|
| 13 |
c ================================================================== |
| 14 |
c SUBROUTINE cost_ssh |
| 15 |
c ================================================================== |
| 16 |
c |
| 17 |
c o Evaluate cost function contribution of sea surface height. |
| 18 |
c using of geoid error covariances requires regular model grid |
| 19 |
c |
| 20 |
c started: Detlef Stammer, Ralf Giering Jul-1996 |
| 21 |
c |
| 22 |
c changed: Christian Eckert eckert@mit.edu 25-Feb-2000 |
| 23 |
c |
| 24 |
c - Restructured the code in order to create a package |
| 25 |
c for the MITgcmUV. |
| 26 |
c |
| 27 |
c changed: Ralf Giering Ralf.Giering@FastOpt.de 12-Jun-2001 |
| 28 |
c |
| 29 |
c - totally rewrite for parallel processing |
| 30 |
c |
| 31 |
c ================================================================== |
| 32 |
c SUBROUTINE cost_ssh |
| 33 |
c ================================================================== |
| 34 |
|
| 35 |
implicit none |
| 36 |
|
| 37 |
c == global variables == |
| 38 |
|
| 39 |
#include "EEPARAMS.h" |
| 40 |
#include "SIZE.h" |
| 41 |
#include "PARAMS.h" |
| 42 |
|
| 43 |
#include "ecco_cost.h" |
| 44 |
#include "ctrl.h" |
| 45 |
#include "ctrl_dummy.h" |
| 46 |
#include "optim.h" |
| 47 |
#include "DYNVARS.h" |
| 48 |
#ifdef ALLOW_PROFILES |
| 49 |
#include "profiles.h" |
| 50 |
#endif |
| 51 |
|
| 52 |
c == routine arguments == |
| 53 |
|
| 54 |
integer myiter |
| 55 |
_RL mytime |
| 56 |
integer mythid |
| 57 |
|
| 58 |
#ifdef ALLOW_SSH_COST_CONTRIBUTION |
| 59 |
c == local variables == |
| 60 |
|
| 61 |
integer bi,bj |
| 62 |
integer i,j |
| 63 |
integer itlo,ithi |
| 64 |
integer jtlo,jthi |
| 65 |
integer jmin,jmax |
| 66 |
integer imin,imax |
| 67 |
integer irec |
| 68 |
integer ilps |
| 69 |
integer gwunit |
| 70 |
|
| 71 |
logical doglobalread |
| 72 |
logical ladinit |
| 73 |
|
| 74 |
_RL offset |
| 75 |
_RL costmean |
| 76 |
_RL offset_sum |
| 77 |
_RL psmean ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 78 |
_RL psmeantp ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 79 |
_RL psmeaners ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 80 |
_RL psmeangfo ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 81 |
_RL sumtp ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 82 |
_RL sumers ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 83 |
_RL sumgfo ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 84 |
|
| 85 |
_RL wwwtp1 ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 86 |
_RL wwwers1 ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 87 |
_RL wwwgfo1 ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 88 |
_RL wwwtp2 ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 89 |
_RL wwwers2 ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 90 |
_RL wwwgfo2 ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 91 |
_RL junk,diff |
| 92 |
CMM( |
| 93 |
_RL obsmeantp ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 94 |
_RL obsmeaners ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 95 |
_RL obsmeangfo ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 96 |
_RL tpmean_loc ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) |
| 97 |
_RL mean_slaobs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) |
| 98 |
_RL mean_slaobs_NUM(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) |
| 99 |
_RL mean_psMssh_all(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) |
| 100 |
_RL mean_psMssh_all_NUM(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) |
| 101 |
_RL mean_psMssh_all_MSK(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) |
| 102 |
_RL diagnosfld(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) |
| 103 |
_RL sumc, num_hmean_mm |
| 104 |
_RL factor, spval |
| 105 |
integer IDOT, k |
| 106 |
character*(80) fname4test |
| 107 |
CMM) |
| 108 |
character*(80) fname |
| 109 |
character*(MAX_LEN_MBUF) msgbuf |
| 110 |
|
| 111 |
c == external functions == |
| 112 |
|
| 113 |
integer ilnblnk |
| 114 |
external ilnblnk |
| 115 |
|
| 116 |
c == end of interface == |
| 117 |
|
| 118 |
jtlo = mybylo(mythid) |
| 119 |
jthi = mybyhi(mythid) |
| 120 |
itlo = mybxlo(mythid) |
| 121 |
ithi = mybxhi(mythid) |
| 122 |
jmin = 1 |
| 123 |
jmax = sny |
| 124 |
imin = 1 |
| 125 |
imax = snx |
| 126 |
|
| 127 |
c-- Initialise local variables. |
| 128 |
costmean = 0. _d 0 |
| 129 |
|
| 130 |
c-- First, read tiled data. |
| 131 |
doglobalread = .false. |
| 132 |
ladinit = .false. |
| 133 |
|
| 134 |
write(fname(1:80),'(80a)') ' ' |
| 135 |
ilps=ilnblnk( psbarfile ) |
| 136 |
write(fname(1:80),'(2a,i10.10)') |
| 137 |
& psbarfile(1:ilps),'.',optimcycle |
| 138 |
|
| 139 |
c-- ============ |
| 140 |
c-- Mean values. |
| 141 |
c-- ============ |
| 142 |
|
| 143 |
do bj = jtlo,jthi |
| 144 |
do bi = itlo,ithi |
| 145 |
do j = jmin,jmax |
| 146 |
do i = imin,imax |
| 147 |
psmean(i,j,bi,bj) = 0. _d 0 |
| 148 |
psmeantp(i,j,bi,bj) = 0. _d 0 |
| 149 |
psmeaners(i,j,bi,bj) = 0. _d 0 |
| 150 |
psmeangfo(i,j,bi,bj) = 0. _d 0 |
| 151 |
CMM( initialize |
| 152 |
obsmeantp(i,j,bi,bj) = 0. _d 0 |
| 153 |
obsmeaners(i,j,bi,bj) = 0. _d 0 |
| 154 |
obsmeangfo(i,j,bi,bj) = 0. _d 0 |
| 155 |
mean_slaobs(i,j,bi,bj) = 0. _d 0 |
| 156 |
mean_slaobs_NUM(i,j,bi,bj) = 0. _d 0 |
| 157 |
mean_psMssh_all(i,j,bi,bj) = 0. _d 0 |
| 158 |
mean_psMssh_all_NUM(i,j,bi,bj) = 0. _d 0 |
| 159 |
mean_psMssh_all_MSK(i,j,bi,bj) = 0. _d 0 |
| 160 |
diagnosfld(i,j,bi,bj) = 0. _d 0 |
| 161 |
tpmean_loc(i,j,bi,bj) = 0. _d 0 |
| 162 |
CMM) |
| 163 |
sumtp(i,j,bi,bj) = 0. _d 0 |
| 164 |
sumers(i,j,bi,bj) = 0. _d 0 |
| 165 |
sumgfo(i,j,bi,bj) = 0. _d 0 |
| 166 |
wwwtp1(i,j,bi,bj) = 0. _d 0 |
| 167 |
wwwers1(i,j,bi,bj) = 0. _d 0 |
| 168 |
wwwgfo1(i,j,bi,bj) = 0. _d 0 |
| 169 |
wwwtp2(i,j,bi,bj) = 0. _d 0 |
| 170 |
wwwers2(i,j,bi,bj) = 0. _d 0 |
| 171 |
wwwgfo2(i,j,bi,bj) = 0. _d 0 |
| 172 |
enddo |
| 173 |
enddo |
| 174 |
enddo |
| 175 |
enddo |
| 176 |
|
| 177 |
c-- Read mean field and generate mask |
| 178 |
call cost_ReadTopexMean( mythid ) |
| 179 |
|
| 180 |
CMM( HAD TO MOVE OFFSET CALC TO GET IT INTO RECORD LOOP |
| 181 |
c-- Compute and remove offset for current tile and sum over all |
| 182 |
c-- tiles of this instance. |
| 183 |
offset = 0. _d 0 |
| 184 |
offset_sum = 0. _d 0 |
| 185 |
CMM) |
| 186 |
c-- Loop over records for the first time. |
| 187 |
do irec = 1, ndaysrec |
| 188 |
|
| 189 |
c-- Compute the mean over all psbar records. |
| 190 |
call active_read_xy( fname, psbar, irec, doglobalread, |
| 191 |
& ladinit, optimcycle, mythid, |
| 192 |
& xx_psbar_mean_dummy ) |
| 193 |
|
| 194 |
#ifdef ALLOW_SSH_TPANOM_COST_CONTRIBUTION |
| 195 |
cph these if would be more efficient, but need recomputations |
| 196 |
c if ( tpTimeMask(irec) .NE. 0. ) |
| 197 |
call cost_readtopex( irec, mythid ) |
| 198 |
#endif |
| 199 |
#ifdef ALLOW_SSH_ERSANOM_COST_CONTRIBUTION |
| 200 |
cph these if would be more efficient, but need recomputations |
| 201 |
c if ( ersTimeMask(irec) .NE. 0. ) |
| 202 |
call cost_readers( irec, mythid ) |
| 203 |
#endif |
| 204 |
#ifdef ALLOW_SSH_GFOANOM_COST_CONTRIBUTION |
| 205 |
cph these if would be more efficient, but need recomputations |
| 206 |
c if ( gfoTimeMask(irec) .NE. 0. ) |
| 207 |
call cost_readgfo( irec, mythid ) |
| 208 |
#endif |
| 209 |
|
| 210 |
do bj = jtlo,jthi |
| 211 |
do bi = itlo,ithi |
| 212 |
do j = jmin,jmax |
| 213 |
do i = imin,imax |
| 214 |
psmean(i,j,bi,bj) = psmean(i,j,bi,bj) + |
| 215 |
& psbar(i,j,bi,bj) / float(ndaysrec) |
| 216 |
#ifdef ALLOW_SSH_TPANOM_COST_CONTRIBUTION |
| 217 |
if ( tpmask(i,j,bi,bj)*wtp(i,j,bi,bj) |
| 218 |
& *tpTimeMask(irec) .NE. 0. ) then |
| 219 |
psmeantp(i,j,bi,bj) = psmeantp(i,j,bi,bj) + |
| 220 |
& psbar(i,j,bi,bj) |
| 221 |
obsmeantp(i,j,bi,bj) = obsmeantp(i,j,bi,bj) + |
| 222 |
& tpobs(i,j,bi,bj) |
| 223 |
sumtp(i,j,bi,bj) = sumtp(i,j,bi,bj) + 1. _d 0 |
| 224 |
endif |
| 225 |
#endif |
| 226 |
#ifdef ALLOW_SSH_ERSANOM_COST_CONTRIBUTION |
| 227 |
if ( ersmask(i,j,bi,bj)*wers(i,j,bi,bj) |
| 228 |
& *ersTimeMask(irec) .NE. 0. ) then |
| 229 |
psmeaners(i,j,bi,bj) = psmeaners(i,j,bi,bj) + |
| 230 |
& psbar(i,j,bi,bj) |
| 231 |
obsmeaners(i,j,bi,bj) = obsmeaners(i,j,bi,bj) + |
| 232 |
& ersobs(i,j,bi,bj) |
| 233 |
sumers(i,j,bi,bj) = sumers(i,j,bi,bj) + 1. _d 0 |
| 234 |
endif |
| 235 |
#endif |
| 236 |
#ifdef ALLOW_SSH_GFOANOM_COST_CONTRIBUTION |
| 237 |
if ( gfomask(i,j,bi,bj)*wgfo(i,j,bi,bj) |
| 238 |
& *gfoTimeMask(irec) .NE. 0. ) then |
| 239 |
psmeangfo(i,j,bi,bj) = psmeangfo(i,j,bi,bj) + |
| 240 |
& psbar(i,j,bi,bj) |
| 241 |
obsmeangfo(i,j,bi,bj) = obsmeangfo(i,j,bi,bj) + |
| 242 |
& gfoobs(i,j,bi,bj) |
| 243 |
sumgfo(i,j,bi,bj) = sumgfo(i,j,bi,bj) + 1. _d 0 |
| 244 |
endif |
| 245 |
#endif |
| 246 |
enddo |
| 247 |
enddo |
| 248 |
enddo |
| 249 |
enddo |
| 250 |
|
| 251 |
c-- END loop over records for the first time. |
| 252 |
enddo |
| 253 |
|
| 254 |
do bj = jtlo,jthi |
| 255 |
do bi = itlo,ithi |
| 256 |
do j = jmin,jmax |
| 257 |
do i = imin,imax |
| 258 |
CMM( average up all SLA |
| 259 |
mean_slaobs(i,j,bi,bj) = obsmeantp(i,j,bi,bj) + |
| 260 |
& obsmeaners(i,j,bi,bj) + obsmeangfo(i,j,bi,bj) |
| 261 |
mean_slaobs_NUM(i,j,bi,bj) = sumtp(i,j,bi,bj) + |
| 262 |
& sumers(i,j,bi,bj) + sumgfo(i,j,bi,bj) |
| 263 |
if ( ( mean_slaobs_NUM(i,j,bi,bj) .NE. 0. ).AND. |
| 264 |
& ( tpmeanmask(i,j,bi,bj) .NE. 0. ) ) then |
| 265 |
mean_slaobs(i,j,bi,bj) = mean_slaobs(i,j,bi,bj) / |
| 266 |
& mean_slaobs_NUM(i,j,bi,bj) |
| 267 |
else |
| 268 |
mean_slaobs(i,j,bi,bj) = 0. _d 0 |
| 269 |
endif |
| 270 |
#ifdef ALLOW_SSH_TPANOM_COST_CONTRIBUTION |
| 271 |
if ( sumtp(i,j,bi,bj) .NE. 0. ) then |
| 272 |
mean_psMssh_all(i,j,bi,bj) = |
| 273 |
& mean_psMssh_all(i,j,bi,bj) + |
| 274 |
& psmeantp(i,j,bi,bj) - obsmeantp(i,j,bi,bj) |
| 275 |
mean_psMssh_all_NUM(i,j,bi,bj) = |
| 276 |
& mean_psMssh_all_NUM(i,j,bi,bj) + |
| 277 |
& sumtp(i,j,bi,bj) |
| 278 |
psmeantp(i,j,bi,bj) = psmeantp(i,j,bi,bj) / |
| 279 |
& sumtp(i,j,bi,bj) |
| 280 |
obsmeantp(i,j,bi,bj) = obsmeantp(i,j,bi,bj) / |
| 281 |
& sumtp(i,j,bi,bj) |
| 282 |
wwwtp1(i,j,bi,bj) = 1. _d 0 |
| 283 |
endif |
| 284 |
#endif |
| 285 |
#ifdef ALLOW_SSH_ERSANOM_COST_CONTRIBUTION |
| 286 |
if ( sumers(i,j,bi,bj) .NE. 0. ) then |
| 287 |
mean_psMssh_all(i,j,bi,bj) = |
| 288 |
& mean_psMssh_all(i,j,bi,bj) + |
| 289 |
& psmeaners(i,j,bi,bj) - obsmeaners(i,j,bi,bj) |
| 290 |
mean_psMssh_all_NUM(i,j,bi,bj) = |
| 291 |
& mean_psMssh_all_NUM(i,j,bi,bj) + |
| 292 |
& sumers(i,j,bi,bj) |
| 293 |
psmeaners(i,j,bi,bj) = psmeaners(i,j,bi,bj) / |
| 294 |
& sumers(i,j,bi,bj) |
| 295 |
obsmeaners(i,j,bi,bj) = obsmeaners(i,j,bi,bj) / |
| 296 |
& sumers(i,j,bi,bj) |
| 297 |
wwwers1(i,j,bi,bj) = 1. _d 0 |
| 298 |
endif |
| 299 |
#endif |
| 300 |
#ifdef ALLOW_SSH_GFOANOM_COST_CONTRIBUTION |
| 301 |
if ( sumgfo(i,j,bi,bj) .NE. 0. ) then |
| 302 |
mean_psMssh_all(i,j,bi,bj) = |
| 303 |
& mean_psMssh_all(i,j,bi,bj) + |
| 304 |
& psmeangfo(i,j,bi,bj)-obsmeangfo(i,j,bi,bj) |
| 305 |
mean_psMssh_all_NUM(i,j,bi,bj) = |
| 306 |
& mean_psMssh_all_NUM(i,j,bi,bj) + |
| 307 |
& sumgfo(i,j,bi,bj) |
| 308 |
psmeangfo(i,j,bi,bj) = psmeangfo(i,j,bi,bj) / |
| 309 |
& sumgfo(i,j,bi,bj) |
| 310 |
obsmeangfo(i,j,bi,bj) = obsmeangfo(i,j,bi,bj) / |
| 311 |
& sumgfo(i,j,bi,bj) |
| 312 |
wwwgfo1(i,j,bi,bj) = 1. _d 0 |
| 313 |
endif |
| 314 |
#endif |
| 315 |
if ( ( mean_psMssh_all_NUM(i,j,bi,bj) .NE. 0. ).AND. |
| 316 |
& ( tpmeanmask(i,j,bi,bj) .NE. 0. ) ) then |
| 317 |
mean_psMssh_all(i,j,bi,bj) = |
| 318 |
& mean_psMssh_all(i,j,bi,bj) / |
| 319 |
& mean_psMssh_all_NUM(i,j,bi,bj)-tpmean(i,j,bi,bj) |
| 320 |
& -mean_slaobs(i,j,bi,bj) |
| 321 |
mean_psMssh_all_MSK(i,j,bi,bj) = 1. _d 0 |
| 322 |
offset=offset+mean_psMssh_all(i,j,bi,bj)* |
| 323 |
& mean_psMssh_all_NUM(i,j,bi,bj) |
| 324 |
offset_sum=offset_sum+mean_psMssh_all_NUM(i,j,bi,bj) |
| 325 |
else |
| 326 |
mean_psMssh_all(i,j,bi,bj) = 0. _d 0 |
| 327 |
mean_psMssh_all_MSK(i,j,bi,bj) = 0. _d 0 |
| 328 |
endif |
| 329 |
CMM( OFFSET IS < DOT + obs - model > |
| 330 |
enddo |
| 331 |
enddo |
| 332 |
enddo |
| 333 |
enddo |
| 334 |
CMM( output SLA mean for referencing |
| 335 |
write(fname4test(1:80),'(1a)') 'sla2mdt_raw' |
| 336 |
call mdswritefield(fname4test,32,.false.,'RL', |
| 337 |
& 1,mean_slaobs,1,1,mythid) |
| 338 |
CMM) |
| 339 |
|
| 340 |
c-- Do a global summation. |
| 341 |
_GLOBAL_SUM_RL( offset , mythid ) |
| 342 |
_GLOBAL_SUM_RL( offset_sum , mythid ) |
| 343 |
|
| 344 |
if (offset_sum .eq. 0.0) then |
| 345 |
_BEGIN_MASTER( mythid ) |
| 346 |
write(msgbuf,'(a)') ' cost_ssh: offset_sum = zero!' |
| 347 |
call print_message( msgbuf, standardmessageunit, |
| 348 |
& SQUEEZE_RIGHT , mythid) |
| 349 |
_END_MASTER( mythid ) |
| 350 |
stop ' ... stopped in cost_ssh.' |
| 351 |
else |
| 352 |
_BEGIN_MASTER( mythid ) |
| 353 |
write(msgbuf,'(a,d22.15)') |
| 354 |
& ' cost_ssh: offset_sum = ',offset_sum |
| 355 |
call print_message( msgbuf, standardmessageunit, |
| 356 |
& SQUEEZE_RIGHT , mythid) |
| 357 |
write(msgbuf,'(a,d22.15)') |
| 358 |
& ' cost_ssh: offset_tot = ',offset |
| 359 |
call print_message( msgbuf, standardmessageunit, |
| 360 |
& SQUEEZE_RIGHT , mythid) |
| 361 |
_END_MASTER( mythid ) |
| 362 |
endif |
| 363 |
|
| 364 |
offset = offset / offset_sum |
| 365 |
|
| 366 |
#ifdef ALLOW_PROFILES |
| 367 |
do bj = jtlo,jthi |
| 368 |
do bi = itlo,ithi |
| 369 |
do j = 1,sny |
| 370 |
do i = 1,snx |
| 371 |
prof_etan_mean(i,j,bi,bj)=offset+psmean(i,j,bi,bj) |
| 372 |
enddo |
| 373 |
enddo |
| 374 |
enddo |
| 375 |
enddo |
| 376 |
_EXCH_XY_RL( prof_etan_mean, mythid ) |
| 377 |
#endif |
| 378 |
|
| 379 |
#ifdef ALLOW_SSH_MEAN_COST_CONTRIBUTION |
| 380 |
#ifndef ALLOW_SSH_TOT |
| 381 |
c-- ========== |
| 382 |
c-- Mean |
| 383 |
c-- ========== |
| 384 |
c-- compute mean ssh difference cost contribution |
| 385 |
c-- Mean |
| 386 |
CMM mean_psMssh_all = <model - obs> - (DOT + <obs>) |
| 387 |
do bj = jtlo,jthi |
| 388 |
do bi = itlo,ithi |
| 389 |
do j = jmin,jmax |
| 390 |
do i = imin,imax |
| 391 |
if ( psmean(i,j,bi,bj) .ne. 0. ) then |
| 392 |
diagnosfld(i,j,bi,bj) = (mean_psMssh_all(i,j,bi,bj) - offset) |
| 393 |
& *mean_psMssh_all_MSK(i,j,bi,bj) |
| 394 |
diff = mean_psMssh_all(i,j,bi,bj) - offset |
| 395 |
sumc = sumc + diff*diff |
| 396 |
& * wp(i,j,bi,bj)*mean_psMssh_all_MSK(i,j,bi,bj) |
| 397 |
if ( wp(i,j,bi,bj)*mean_psMssh_all_MSK(i,j,bi,bj) .ne. 0. ) |
| 398 |
& num_hmean_mm = num_hmean_mm + 1. _d 0 |
| 399 |
CMM diagnosfld(i,j,bi,bj) = diff*diff |
| 400 |
CMM & * wp(i,j,bi,bj)*mean_psMssh_all_MSK(i,j,bi,bj) |
| 401 |
endif |
| 402 |
enddo |
| 403 |
enddo |
| 404 |
enddo |
| 405 |
enddo |
| 406 |
|
| 407 |
CALL WRITE_FLD_XY_RL( 'DiagnosSSHmean1', ' ', diagnosfld, |
| 408 |
& optimcycle, mythid ) |
| 409 |
|
| 410 |
objf_hmean = objf_hmean + sumc |
| 411 |
num_hmean = num_hmean + num_hmean_mm |
| 412 |
CMM) |
| 413 |
CMM(((((HERE ADD OTHER DOT FOR DOT PROJECT |
| 414 |
CMM THIS IS ALL HARDCODED! |
| 415 |
CMM DO THIS for 4 DOTS -- first read the field |
| 416 |
CMM first get orig cost |
| 417 |
c-- Do a global summation. |
| 418 |
_GLOBAL_SUM_RL( sumc , mythid ) |
| 419 |
_GLOBAL_SUM_RL( num_hmean_mm , mythid ) |
| 420 |
write(standardmessageunit,'(A,D22.15)') |
| 421 |
& 'CMM DOT tmp ref: offset ', offset |
| 422 |
write(standardmessageunit,'(A,D22.15)') |
| 423 |
& 'CMM DOT tmp ref: offset N ', offset_sum |
| 424 |
write(standardmessageunit,'(A,D22.15)') |
| 425 |
& 'CMM DOT tmp ref: cost integral ', sumc |
| 426 |
write(standardmessageunit,'(A,D22.15)') |
| 427 |
& 'CMM DOT tmp ref: cost N ', num_hmean_mm |
| 428 |
CMM now to |
| 429 |
factor = 0.01 |
| 430 |
spval = -9990. |
| 431 |
write(standardmessageunit,'(A)') |
| 432 |
& 'CMM ssh_cost - reading DOT in order: EGM08 AVISO GRACE MAXI' |
| 433 |
do IDOT = 1,4 |
| 434 |
CMM reinitialize due to recomps |
| 435 |
do bj = jtlo,jthi |
| 436 |
do bi = itlo,ithi |
| 437 |
do j = jmin,jmax |
| 438 |
do i = imin,imax |
| 439 |
tpmean_loc(i,j,bi,bj) = 0. _d 0 |
| 440 |
enddo |
| 441 |
enddo |
| 442 |
enddo |
| 443 |
enddo |
| 444 |
sumc = 0. |
| 445 |
num_hmean_mm = 0. |
| 446 |
if (IDOT.eq.1) then |
| 447 |
call mdsreadfield( 'DOT_egm08.bin', cost_iprec,cost_yftype |
| 448 |
& ,1,tpmean_loc, 1, mythid ) |
| 449 |
elseif (IDOT.eq.2) then |
| 450 |
call mdsreadfield( 'DOT_aviso.bin', cost_iprec,cost_yftype, |
| 451 |
& 1,tpmean_loc, 1, mythid ) |
| 452 |
elseif (IDOT.eq.3) then |
| 453 |
call mdsreadfield( 'DOT_grace2.bin', cost_iprec,cost_yftype, |
| 454 |
& 1,tpmean_loc, 1, mythid ) |
| 455 |
elseif (IDOT.eq.4) then |
| 456 |
call mdsreadfield( 'DOT_maxi.bin', cost_iprec,cost_yftype, |
| 457 |
& 1,tpmean_loc, 1, mythid ) |
| 458 |
endif |
| 459 |
CMM NOW MAKE MASK |
| 460 |
do bj = jtlo,jthi |
| 461 |
do bi = itlo,ithi |
| 462 |
k = 1 |
| 463 |
do j = jmin,jmax |
| 464 |
do i = imin,imax |
| 465 |
mean_psMssh_all_MSK(i,j,bi,bj) = tpmeanmask(i,j,bi,bj) |
| 466 |
if (tpmean_loc(i,j,bi,bj) .lt. spval) then |
| 467 |
mean_psMssh_all_MSK(i,j,bi,bj) = 0. _d 0 |
| 468 |
endif |
| 469 |
if (tpmean_loc(i,j,bi,bj) .eq. 0. _d 0 ) then |
| 470 |
mean_psMssh_all_MSK(i,j,bi,bj) = 0. _d 0 |
| 471 |
endif |
| 472 |
tpmean_loc(i,j,bi,bj) = tpmean_loc(i,j,bi,bj)* |
| 473 |
& mean_psMssh_all_MSK(i,j,bi,bj)* |
| 474 |
& factor |
| 475 |
enddo |
| 476 |
enddo |
| 477 |
enddo |
| 478 |
enddo |
| 479 |
CMM NOW GET OFFSET |
| 480 |
c-- Compute and remove offset for current tile and sum over all |
| 481 |
c-- tiles of this instance. |
| 482 |
offset = 0. _d 0 |
| 483 |
offset_sum = 0. _d 0 |
| 484 |
c-- Sum over this thread tiles. |
| 485 |
do bj = jtlo,jthi |
| 486 |
do bi = itlo,ithi |
| 487 |
do j = 1,sny |
| 488 |
do i = 1,snx |
| 489 |
offset = offset + |
| 490 |
& mean_psMssh_all_MSK(i,j,bi,bj)*cosphi(i,j,bi,bj)* |
| 491 |
& (tpmean_loc(i,j,bi,bj) - psmean(i,j,bi,bj)) |
| 492 |
offset_sum = offset_sum + |
| 493 |
& mean_psMssh_all_MSK(i,j,bi,bj)*cosphi(i,j,bi,bj) |
| 494 |
enddo |
| 495 |
enddo |
| 496 |
enddo |
| 497 |
enddo |
| 498 |
|
| 499 |
c-- Do a global summation. |
| 500 |
_GLOBAL_SUM_RL( offset , mythid ) |
| 501 |
_GLOBAL_SUM_RL( offset_sum , mythid ) |
| 502 |
|
| 503 |
if (offset_sum .eq. 0.0) then |
| 504 |
_BEGIN_MASTER( mythid ) |
| 505 |
write(msgbuf,'(a)') ' cost_ssh: offset_sum = zero!' |
| 506 |
call print_message( msgbuf, standardmessageunit, |
| 507 |
& SQUEEZE_RIGHT , mythid) |
| 508 |
_END_MASTER( mythid ) |
| 509 |
stop ' ... stopped in cost_ssh.' |
| 510 |
else |
| 511 |
_BEGIN_MASTER( mythid ) |
| 512 |
write(msgbuf,'(a,d22.15)') |
| 513 |
& ' cost_ssh: offset = ',offset |
| 514 |
call print_message( msgbuf, standardmessageunit, |
| 515 |
& SQUEEZE_RIGHT , mythid) |
| 516 |
write(msgbuf,'(a,d22.15)') |
| 517 |
& ' cost_ssh: offset_sum = ',offset_sum |
| 518 |
call print_message( msgbuf, standardmessageunit, |
| 519 |
& SQUEEZE_RIGHT , mythid) |
| 520 |
|
| 521 |
_END_MASTER( mythid ) |
| 522 |
endif |
| 523 |
offset = offset / offset_sum |
| 524 |
do bj = jtlo,jthi |
| 525 |
do bi = itlo,ithi |
| 526 |
do j = jmin,jmax |
| 527 |
do i = imin,imax |
| 528 |
diagnosfld(i,j,bi,bj)=(psmean(i,j,bi,bj)-tpmean_loc(i,j,bi,bj) |
| 529 |
& + offset)*mean_psMssh_all_MSK(i,j,bi,bj) |
| 530 |
diff = psmean(i,j,bi,bj) - tpmean_loc(i,j,bi,bj) + offset |
| 531 |
sumc = sumc + diff*diff |
| 532 |
& *wp(i,j,bi,bj)*mean_psMssh_all_MSK(i,j,bi,bj) |
| 533 |
if ( wp(i,j,bi,bj)*mean_psMssh_all_MSK(i,j,bi,bj) .ne. 0. ) |
| 534 |
& num_hmean_mm = num_hmean_mm + 1. _d 0 |
| 535 |
CMM diagnosfld(i,j,bi,bj) = diff*diff |
| 536 |
CMM & *wp(i,j,bi,bj)*mean_psMssh_all_MSK(i,j,bi,bj) |
| 537 |
enddo |
| 538 |
enddo |
| 539 |
enddo |
| 540 |
enddo |
| 541 |
|
| 542 |
if (IDOT.eq.1) then |
| 543 |
CALL WRITE_FLD_XY_RL( 'DiagnosSSHmean_mm_A', ' ', diagnosfld, |
| 544 |
& optimcycle, mythid ) |
| 545 |
elseif (IDOT.eq.2) then |
| 546 |
CALL WRITE_FLD_XY_RL( 'DiagnosSSHmean_mm_B', ' ', diagnosfld, |
| 547 |
& optimcycle, mythid ) |
| 548 |
elseif (IDOT.eq.3) then |
| 549 |
CALL WRITE_FLD_XY_RL( 'DiagnosSSHmean_mm_C', ' ', diagnosfld, |
| 550 |
& optimcycle, mythid ) |
| 551 |
elseif (IDOT.eq.4) then |
| 552 |
CALL WRITE_FLD_XY_RL( 'DiagnosSSHmean_mm_D', ' ', diagnosfld, |
| 553 |
& optimcycle, mythid ) |
| 554 |
endif |
| 555 |
|
| 556 |
CMM ADD TO COST FUNCTION |
| 557 |
objf_hmean = objf_hmean + sumc |
| 558 |
num_hmean = num_hmean + num_hmean_mm |
| 559 |
|
| 560 |
c-- Do a global summation. |
| 561 |
_GLOBAL_SUM_RL( sumc , mythid ) |
| 562 |
_GLOBAL_SUM_RL( num_hmean_mm , mythid ) |
| 563 |
|
| 564 |
write(standardmessageunit,'(A,I6)') |
| 565 |
& 'CMM DOT sta ref number: ', IDOT |
| 566 |
write(standardmessageunit,'(A,D22.15)') |
| 567 |
& 'CMM DOT sta ref: offset ', offset |
| 568 |
write(standardmessageunit,'(A,D22.15)') |
| 569 |
& 'CMM DOT sta ref: offset N ', offset_sum |
| 570 |
write(standardmessageunit,'(A,D22.15)') |
| 571 |
& 'CMM DOT sta ref: cost integral ', sumc |
| 572 |
write(standardmessageunit,'(A,D22.15)') |
| 573 |
& 'CMM DOT sta ref: cost N ', num_hmean_mm |
| 574 |
|
| 575 |
enddo |
| 576 |
CMM end of loop over DOT products |
| 577 |
|
| 578 |
|
| 579 |
#endif /* ALLOW_SSH_TOT */ |
| 580 |
#endif /* ALLOW_SSH_MEAN_COST_CONTRIBUTION */ |
| 581 |
|
| 582 |
c-- ========== |
| 583 |
c-- Anomalies. |
| 584 |
c-- ========== |
| 585 |
|
| 586 |
c-- Loop over records for the second time. |
| 587 |
do irec = 1, ndaysrec |
| 588 |
|
| 589 |
call active_read_xy( fname, psbar, irec, doglobalread, |
| 590 |
& ladinit, optimcycle, mythid, |
| 591 |
& xx_psbar_mean_dummy ) |
| 592 |
|
| 593 |
#ifdef ALLOW_SSH_TPANOM_COST_CONTRIBUTION |
| 594 |
call cost_readtopex( irec, mythid ) |
| 595 |
#endif |
| 596 |
#ifdef ALLOW_SSH_ERSANOM_COST_CONTRIBUTION |
| 597 |
call cost_readers( irec, mythid ) |
| 598 |
#endif |
| 599 |
#ifdef ALLOW_SSH_GFOANOM_COST_CONTRIBUTION |
| 600 |
call cost_readgfo( irec, mythid ) |
| 601 |
#endif |
| 602 |
|
| 603 |
do bj = jtlo,jthi |
| 604 |
do bi = itlo,ithi |
| 605 |
|
| 606 |
#ifdef ALLOW_SSH_TPANOM_COST_CONTRIBUTION |
| 607 |
do j = jmin,jmax |
| 608 |
do i = imin,imax |
| 609 |
c-- The array psobs contains SSH anomalies. |
| 610 |
wwwtp2(i,j,bi,bj) = wwwtp1(i,j,bi,bj) |
| 611 |
& *wtp(i,j,bi,bj) |
| 612 |
& *tpmask(i,j,bi,bj) |
| 613 |
& *cosphi(i,j,bi,bj) |
| 614 |
#ifndef ALLOW_SSH_TOT |
| 615 |
CMM junk = ( psbar(i,j,bi,bj) |
| 616 |
CMM & - psmeantp(i,j,bi,bj) - tpobs(i,j,bi,bj) ) |
| 617 |
junk = ( psbar(i,j,bi,bj) - psmeantp(i,j,bi,bj) ) |
| 618 |
& - ( tpobs(i,j,bi,bj) - obsmeantp(i,j,bi,bj) ) |
| 619 |
objf_tp(bi,bj) = objf_tp(bi,bj) |
| 620 |
& + junk*junk*wwwtp2(i,j,bi,bj) |
| 621 |
if ( wwwtp2(i,j,bi,bj) .ne. 0. ) |
| 622 |
& num_tp(bi,bj) = num_tp(bi,bj) + 1. _d 0 |
| 623 |
#else |
| 624 |
if (tpmeanmask(i,j,bi,bj)*tpmask(i,j,bi,bj) |
| 625 |
& *wp(i,j,bi,bj)*wwwtp2(i,j,bi,bj) .ne.0.) then |
| 626 |
junk = ( psbar(i,j,bi,bj) - |
| 627 |
& (tpobs(i,j,bi,bj)+tpmean(i,j,bi,bj)-offset) ) |
| 628 |
objf_tp(bi,bj) = objf_tp(bi,bj) |
| 629 |
& +junk*junk/( 1/wp(i,j,bi,bj)+1/wwwtp2(i,j,bi,bj) ) |
| 630 |
num_tp(bi,bj) = num_tp(bi,bj) + 1. _d 0 |
| 631 |
endif |
| 632 |
#endif /* ALLOW_SSH_TOT */ |
| 633 |
enddo |
| 634 |
enddo |
| 635 |
#endif |
| 636 |
|
| 637 |
#ifdef ALLOW_SSH_ERSANOM_COST_CONTRIBUTION |
| 638 |
do j = jmin,jmax |
| 639 |
do i = imin,imax |
| 640 |
c-- The array ersobs contains SSH anomalies. |
| 641 |
wwwers2(i,j,bi,bj) = wwwers1(i,j,bi,bj) |
| 642 |
& *wers(i,j,bi,bj) |
| 643 |
& *ersmask(i,j,bi,bj) |
| 644 |
& *cosphi(i,j,bi,bj) |
| 645 |
#ifndef ALLOW_SSH_TOT |
| 646 |
CMM junk = ( psbar(i,j,bi,bj) |
| 647 |
CMM & - psmeaners(i,j,bi,bj) - ersobs(i,j,bi,bj) ) |
| 648 |
junk = ( psbar(i,j,bi,bj) - psmeaners(i,j,bi,bj) ) |
| 649 |
& - ( ersobs(i,j,bi,bj) - obsmeaners(i,j,bi,bj) ) |
| 650 |
objf_ers(bi,bj) = objf_ers(bi,bj) |
| 651 |
& + junk*junk*wwwers2(i,j,bi,bj) |
| 652 |
if ( wwwers2(i,j,bi,bj) .ne. 0. ) |
| 653 |
& num_ers(bi,bj) = num_ers(bi,bj) + 1. _d 0 |
| 654 |
#else |
| 655 |
if (tpmeanmask(i,j,bi,bj)*ersmask(i,j,bi,bj) |
| 656 |
& *wp(i,j,bi,bj)*wwwers2(i,j,bi,bj) .ne.0.) then |
| 657 |
junk = ( psbar(i,j,bi,bj) - |
| 658 |
& (ersobs(i,j,bi,bj)+tpmean(i,j,bi,bj)-offset) ) |
| 659 |
objf_ers(bi,bj) = objf_ers(bi,bj) |
| 660 |
& +junk*junk/( 1/wp(i,j,bi,bj)+1/wwwers2(i,j,bi,bj) ) |
| 661 |
num_ers(bi,bj) = num_ers(bi,bj) + 1. _d 0 |
| 662 |
endif |
| 663 |
#endif /* ALLOW_SSH_TOT */ |
| 664 |
enddo |
| 665 |
enddo |
| 666 |
#endif |
| 667 |
|
| 668 |
#ifdef ALLOW_SSH_GFOANOM_COST_CONTRIBUTION |
| 669 |
do j = jmin,jmax |
| 670 |
do i = imin,imax |
| 671 |
c-- The array gfoobs contains SSH anomalies. |
| 672 |
wwwgfo2(i,j,bi,bj) = wwwgfo1(i,j,bi,bj) |
| 673 |
& *wgfo(i,j,bi,bj) |
| 674 |
& *gfomask(i,j,bi,bj) |
| 675 |
& *cosphi(i,j,bi,bj) |
| 676 |
#ifndef ALLOW_SSH_TOT |
| 677 |
CMM junk = ( psbar(i,j,bi,bj) |
| 678 |
CMM & - psmeangfo(i,j,bi,bj) - gfoobs(i,j,bi,bj) ) |
| 679 |
junk = ( psbar(i,j,bi,bj) - psmeangfo(i,j,bi,bj) ) |
| 680 |
& - ( gfoobs(i,j,bi,bj) - obsmeangfo(i,j,bi,bj) ) |
| 681 |
objf_gfo(bi,bj) = objf_gfo(bi,bj) |
| 682 |
& + junk*junk*wwwgfo2(i,j,bi,bj) |
| 683 |
if ( wwwgfo2(i,j,bi,bj) .ne. 0. ) |
| 684 |
& num_gfo(bi,bj) = num_gfo(bi,bj) + 1. _d 0 |
| 685 |
#else |
| 686 |
if (tpmeanmask(i,j,bi,bj)*gfomask(i,j,bi,bj) |
| 687 |
& *wp(i,j,bi,bj)*wwwgfo2(i,j,bi,bj) .ne.0.) then |
| 688 |
junk = ( psbar(i,j,bi,bj) - |
| 689 |
& (gfoobs(i,j,bi,bj)+tpmean(i,j,bi,bj)-offset) ) |
| 690 |
objf_gfo(bi,bj) = objf_gfo(bi,bj) |
| 691 |
& +junk*junk/( 1/wp(i,j,bi,bj)+1/wwwgfo2(i,j,bi,bj) ) |
| 692 |
num_gfo(bi,bj) = num_gfo(bi,bj) + 1. _d 0 |
| 693 |
endif |
| 694 |
#endif /* ALLOW_SSH_TOT */ |
| 695 |
enddo |
| 696 |
enddo |
| 697 |
#endif |
| 698 |
|
| 699 |
enddo |
| 700 |
enddo |
| 701 |
|
| 702 |
enddo |
| 703 |
c-- End of second loop over records. |
| 704 |
|
| 705 |
do bj = jtlo,jthi |
| 706 |
do bi = itlo,ithi |
| 707 |
objf_h(bi,bj) = objf_h(bi,bj) + |
| 708 |
& objf_tp(bi,bj) + objf_ers(bi,bj) + objf_gfo(bi,bj) |
| 709 |
num_h(bi,bj) = num_h(bi,bj) + |
| 710 |
& num_tp(bi,bj) + num_ers(bi,bj) + num_gfo(bi,bj) |
| 711 |
enddo |
| 712 |
enddo |
| 713 |
|
| 714 |
|
| 715 |
#endif /* ifdef ALLOW_SSH_COST_CONTRIBUTION */ |
| 716 |
|
| 717 |
end |