Changeset 5682 for branches/2015/dev_r5072_UKMO2_OBS_simplification/NEMOGCM/NEMO/OPA_SRC/OBS/obs_write.F90
- Timestamp:
- 2015-08-12T17:46:45+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_r5072_UKMO2_OBS_simplification/NEMOGCM/NEMO/OPA_SRC/OBS/obs_write.F90
r5659 r5682 55 55 CONTAINS 56 56 57 SUBROUTINE obs_wri_prof( cobstype, profdata, padd, pext )57 SUBROUTINE obs_wri_prof( profdata, k2dint, padd, pext ) 58 58 !!----------------------------------------------------------------------- 59 59 !! … … 76 76 !!----------------------------------------------------------------------- 77 77 78 !! * Modules used79 80 78 !! * Arguments 81 CHARACTER(LEN=*), INTENT(IN) :: cobstype ! Prefix for output files82 79 TYPE(obs_prof), INTENT(INOUT) :: profdata ! Full set of profile data 80 INTEGER, INTENT(IN) :: k2dint ! Horizontal interpolation method 83 81 TYPE(obswriinfo), OPTIONAL :: padd ! Additional info for each variable 84 82 TYPE(obswriinfo), OPTIONAL :: pext ! Extra info 85 83 86 84 !! * Local declarations 87 85 TYPE(obfbdata) :: fbdata 88 CHARACTER(LEN=40) :: cfname 86 CHARACTER(LEN=40) :: clfname 87 CHARACTER(LEN=6) :: clfiletype 89 88 INTEGER :: ilevel 90 89 INTEGER :: jvar … … 94 93 INTEGER :: ja 95 94 INTEGER :: je 95 INTEGER :: iadd 96 INTEGER :: iext 96 97 REAL(wp) :: zpres 97 INTEGER :: nadd 98 INTEGER :: next 98 REAL(wp), DIMENSION(:), ALLOCATABLE :: & 99 & zu, & 100 & zv 99 101 100 102 IF ( PRESENT( padd ) ) THEN 101 nadd = padd%inum103 iadd = padd%inum 102 104 ELSE 103 nadd = 0105 iadd = 0 104 106 ENDIF 105 107 106 108 IF ( PRESENT( pext ) ) THEN 107 next = pext%inum109 iext = pext%inum 108 110 ELSE 109 next = 0110 ENDIF 111 111 iext = 0 112 ENDIF 113 112 114 CALL init_obfbdata( fbdata ) 113 115 … … 118 120 END DO 119 121 120 SELECT CASE ( TRIM(cobstype) ) 121 CASE('prof') 122 122 SELECT CASE ( TRIM(profdata%cvars(1)) ) 123 CASE('POTM') 124 125 clfiletype='profb' 123 126 CALL alloc_obfbdata( fbdata, 2, profdata%nprof, ilevel, & 124 & 1 + nadd, 1 + next, .TRUE. )125 fbdata%cname(1) = 'POTM'126 fbdata%cname(2) = 'PSAL'127 & 1 + iadd, 1 + iext, .TRUE. ) 128 fbdata%cname(1) = profdata%cvars(1) 129 fbdata%cname(2) = profdata%cvars(2) 127 130 fbdata%coblong(1) = 'Potential temperature' 128 131 fbdata%coblong(2) = 'Practical salinity' … … 137 140 fbdata%caddunit(1,2) = 'PSU' 138 141 fbdata%cgrid(:) = 'T' 139 DO je = 1, next142 DO je = 1, iext 140 143 fbdata%cextname(1+je) = pext%cdname(je) 141 144 fbdata%cextlong(1+je) = pext%cdlong(je,1) 142 145 fbdata%cextunit(1+je) = pext%cdunit(je,1) 143 146 END DO 144 DO ja = 1, nadd147 DO ja = 1, iadd 145 148 fbdata%caddname(1+ja) = padd%cdname(ja) 146 149 DO jvar = 1, 2 … … 149 152 END DO 150 153 END DO 151 152 CASE('vel') 153 154 155 CASE('UVEL') 156 157 clfiletype='velfb' 154 158 CALL alloc_obfbdata( fbdata, 2, profdata%nprof, ilevel, 2, 0, .TRUE. ) 155 fbdata%cname(1) = 'UVEL'156 fbdata%cname(2) = 'VVEL'159 fbdata%cname(1) = profdata%cvars(1) 160 fbdata%cname(2) = profdata%cvars(2) 157 161 fbdata%coblong(1) = 'Zonal velocity' 158 162 fbdata%coblong(2) = 'Meridional velocity' 159 163 fbdata%cobunit(1) = 'm/s' 160 164 fbdata%cobunit(2) = 'm/s' 161 DO je = 1, next165 DO je = 1, iext 162 166 fbdata%cextname(je) = pext%cdname(je) 163 167 fbdata%cextlong(je) = pext%cdlong(je,1) … … 175 179 fbdata%cgrid(1) = 'U' 176 180 fbdata%cgrid(2) = 'V' 177 DO ja = 1, nadd181 DO ja = 1, iadd 178 182 fbdata%caddname(2+ja) = padd%cdname(ja) 179 183 fbdata%caddlong(2+ja,1) = padd%cdlong(ja,1) … … 187 191 188 192 END SELECT 189 193 190 194 fbdata%caddname(1) = 'Hx' 191 192 WRITE(c fname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(cobstype), nproc195 196 WRITE(clfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc 193 197 194 198 IF(lwp) THEN … … 196 200 WRITE(numout,*)'obs_wri_prof :' 197 201 WRITE(numout,*)'~~~~~~~~~~~~~' 198 WRITE(numout,*)'Writing profile feedback file : ',TRIM(cfname)202 WRITE(numout,*)'Writing '//TRIM(clfiletype)//' feedback file : ',TRIM(clfname) 199 203 ENDIF 200 204 … … 242 246 DO jk = profdata%npvsta(jo,jvar), profdata%npvend(jo,jvar) 243 247 ik = profdata%var(jvar)%nvlidx(jk) 244 IF ( TRIM( cobstype) == 'prof' ) THEN248 IF ( TRIM(profdata%cvars(1)) == 'POTM' ) THEN 245 249 fbdata%padd(ik,jo,1,jvar) = profdata%var(jvar)%vmod(jk) 246 ELSE IF ( TRIM( cobstype) == 'vel' ) THEN250 ELSE IF ( TRIM(profdata%cvars(1)) == 'UVEL' ) THEN 247 251 IF ( jvar == 1 ) THEN 248 252 fbdata%padd(ik,jo,1,jvar) = zu(jk) … … 265 269 ENDIF 266 270 fbdata%iobsk(ik,jo,jvar) = profdata%var(jvar)%mvk(jk) 267 DO ja = 1, nadd271 DO ja = 1, iadd 268 272 fbdata%padd(ik,jo,1+ja,jvar) = & 269 273 & profdata%var(jvar)%vext(jk,padd%ipoint(ja)) 270 274 END DO 271 DO je = 1, next275 DO je = 1, iext 272 276 fbdata%pext(ik,jo,1+je) = & 273 277 & profdata%var(jvar)%vext(jk,pext%ipoint(je)) … … 280 284 END DO 281 285 282 IF ( TRIM( cobstype) == 'prof' ) THEN286 IF ( TRIM(profdata%cvars(1)) == 'POTM' ) THEN 283 287 ! Convert insitu temperature to potential temperature using the model 284 288 ! salinity if no potential temperature … … 301 305 END DO 302 306 ENDIF 303 307 304 308 ! Write the obfbdata structure 305 CALL write_obfbdata( c fname, fbdata )309 CALL write_obfbdata( clfname, fbdata ) 306 310 307 311 ! Output some basic statistics … … 309 313 310 314 CALL dealloc_obfbdata( fbdata ) 311 315 312 316 END SUBROUTINE obs_wri_prof 313 317 314 SUBROUTINE obs_wri_surf( cobstype,surfdata, padd, pext )318 SUBROUTINE obs_wri_surf( surfdata, padd, pext ) 315 319 !!----------------------------------------------------------------------- 316 320 !! … … 332 336 333 337 !! * Arguments 334 CHARACTER(LEN=*), INTENT(IN) :: cobstype ! Prefix for output files335 338 TYPE(obs_surf), INTENT(INOUT) :: surfdata ! Full set of surface data 336 339 TYPE(obswriinfo), OPTIONAL :: padd ! Additional info for each variable … … 339 342 !! * Local declarations 340 343 TYPE(obfbdata) :: fbdata 341 CHARACTER(LEN=40) :: cfname ! netCDF filename 344 CHARACTER(LEN=40) :: clfname ! netCDF filename 345 CHARACTER(LEN=6) :: clfiletype 342 346 CHARACTER(LEN=12), PARAMETER :: cpname = 'obs_wri_surf' 343 347 INTEGER :: jo 344 348 INTEGER :: ja 345 349 INTEGER :: je 346 INTEGER :: nadd347 INTEGER :: next350 INTEGER :: iadd 351 INTEGER :: iext 348 352 349 353 IF ( PRESENT( padd ) ) THEN 350 nadd = padd%inum354 iadd = padd%inum 351 355 ELSE 352 nadd = 0356 iadd = 0 353 357 ENDIF 354 358 355 359 IF ( PRESENT( pext ) ) THEN 356 next = pext%inum360 iext = pext%inum 357 361 ELSE 358 next = 0362 iext = 0 359 363 ENDIF 360 364 … … 362 366 363 367 CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, & 364 & 2 + nadd, 1 + next, .TRUE. ) 365 366 SELECT CASE ( TRIM(cobstype) ) 367 CASE('sla') 368 369 fbdata%cname(1) = 'SLA' 368 & 2 + iadd, 1 + iext, .TRUE. ) 369 370 SELECT CASE ( TRIM(surfdata%cvars(1)) ) 371 CASE('SLA') 372 373 clfiletype = 'slafb' 374 fbdata%cname(1) = surfdata%cvars(1) 370 375 fbdata%coblong(1) = 'Sea level anomaly' 371 376 fbdata%cobunit(1) = 'Metres' … … 373 378 fbdata%cextlong(1) = 'Mean dynamic topography' 374 379 fbdata%cextunit(1) = 'Metres' 375 DO je = 1, next380 DO je = 1, iext 376 381 fbdata%cextname(je) = pext%cdname(je) 377 382 fbdata%cextlong(je) = pext%cdlong(je,1) … … 384 389 fbdata%caddunit(2,1) = 'Metres' 385 390 fbdata%cgrid(1) = 'T' 386 DO ja = 1, nadd391 DO ja = 1, iadd 387 392 fbdata%caddname(2+ja) = padd%cdname(ja) 388 393 fbdata%caddlong(2+ja,1) = padd%cdlong(ja,1) … … 390 395 END DO 391 396 392 CASE('sst') 393 394 fbdata%cname(1) = 'SST' 397 CASE('SST') 398 399 clfiletype = 'sstfb' 400 fbdata%cname(1) = surfdata%cvars(1) 395 401 fbdata%coblong(1) = 'Sea surface temperature' 396 402 fbdata%cobunit(1) = 'Degree centigrade' 397 DO je = 1, next403 DO je = 1, iext 398 404 fbdata%cextname(je) = pext%cdname(je) 399 405 fbdata%cextlong(je) = pext%cdlong(je,1) … … 403 409 fbdata%caddunit(1,1) = 'Degree centigrade' 404 410 fbdata%cgrid(1) = 'T' 405 DO ja = 1, nadd411 DO ja = 1, iadd 406 412 fbdata%caddname(1+ja) = padd%cdname(ja) 407 413 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) … … 409 415 END DO 410 416 411 CASE('sss') 412 413 fbdata%cname(1) = 'SSS' 414 fbdata%coblong(1) = 'Sea surface salinity' 415 fbdata%cobunit(1) = 'PSU' 416 DO je = 1, next 417 CASE('SEAICE') 418 419 clfiletype = 'sicfb' 420 fbdata%cname(1) = surfdata%cvars(1) 421 fbdata%coblong(1) = 'Sea ice' 422 fbdata%cobunit(1) = 'Fraction' 423 DO je = 1, iext 417 424 fbdata%cextname(je) = pext%cdname(je) 418 425 fbdata%cextlong(je) = pext%cdlong(je,1) 419 426 fbdata%cextunit(je) = pext%cdunit(je,1) 420 427 END DO 421 fbdata%caddlong(1,1) = 'Model interpolated SSS'422 fbdata%caddunit(1,1) = ' PSU'428 fbdata%caddlong(1,1) = 'Model interpolated ICE' 429 fbdata%caddunit(1,1) = 'Fraction' 423 430 fbdata%cgrid(1) = 'T' 424 DO ja = 1, nadd431 DO ja = 1, iadd 425 432 fbdata%caddname(1+ja) = padd%cdname(ja) 426 433 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) … … 428 435 END DO 429 436 430 CASE('seaice')431 432 fbdata%cname(1) = 'SEAICE'433 fbdata%coblong(1) = 'Sea ice'434 fbdata%cobunit(1) = 'Fraction'435 DO je = 1, next436 fbdata%cextname(je) = pext%cdname(je)437 fbdata%cextlong(je) = pext%cdlong(je,1)438 fbdata%cextunit(je) = pext%cdunit(je,1)439 END DO440 fbdata%caddlong(1,1) = 'Model interpolated ICE'441 fbdata%caddunit(1,1) = 'Fraction'442 fbdata%cgrid(1) = 'T'443 DO ja = 1, nadd444 fbdata%caddname(1+ja) = padd%cdname(ja)445 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1)446 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1)447 END DO448 449 437 END SELECT 450 438 451 439 fbdata%caddname(1) = 'Hx' 452 440 453 WRITE(c fname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(cobstype), nproc441 WRITE(clfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc 454 442 455 443 IF(lwp) THEN … … 457 445 WRITE(numout,*)'obs_wri_surf :' 458 446 WRITE(numout,*)'~~~~~~~~~~~~~' 459 WRITE(numout,*)'Writing surface feedback file : ',TRIM(cfname)447 WRITE(numout,*)'Writing '//TRIM(surfdata%cvars(1))//' feedback file : ',TRIM(clfname) 460 448 ENDIF 461 449 … … 498 486 & krefdate = 19500101 ) 499 487 fbdata%padd(1,jo,1,1) = surfdata%rmod(jo,1) 500 IF ( TRIM( cobstype) == 'sla' ) fbdata%padd(1,jo,2,1) = surfdata%rext(jo,1)488 IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) fbdata%padd(1,jo,2,1) = surfdata%rext(jo,1) 501 489 fbdata%pob(1,jo,1) = surfdata%robs(jo,1) 502 490 fbdata%pdep(1,jo) = 0.0 … … 514 502 ENDIF 515 503 fbdata%iobsk(1,jo,1) = 0 516 IF ( TRIM( cobstype) == 'sla' ) fbdata%pext(1,jo,1) = surfdata%rext(jo,2)517 DO ja = 1, nadd504 IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) fbdata%pext(1,jo,1) = surfdata%rext(jo,2) 505 DO ja = 1, iadd 518 506 fbdata%padd(1,jo,2+ja,1) = & 519 507 & surfdata%rext(jo,padd%ipoint(ja)) 520 508 END DO 521 DO je = 1, next509 DO je = 1, iext 522 510 fbdata%pext(1,jo,1+je) = & 523 511 & surfdata%rext(jo,pext%ipoint(je)) … … 526 514 527 515 ! Write the obfbdata structure 528 CALL write_obfbdata( c fname, fbdata )516 CALL write_obfbdata( clfname, fbdata ) 529 517 530 518 ! Output some basic statistics … … 556 544 INTEGER :: jo 557 545 INTEGER :: jk 558 559 INTEGER :: numgoodobs 560 INTEGER :: numgoodobsmpp 546 INTEGER :: inumgoodobs 547 INTEGER :: inumgoodobsmpp 561 548 REAL(wp) :: zsumx 562 549 REAL(wp) :: zsumx2 … … 566 553 WRITE(numout,*) '' 567 554 WRITE(numout,*) 'obs_wri_stats :' 568 WRITE(numout,*) '~~~~~~~~~~~~~~~' 555 WRITE(numout,*) '~~~~~~~~~~~~~~~' 569 556 ENDIF 570 557 … … 572 559 zsumx=0.0_wp 573 560 zsumx2=0.0_wp 574 numgoodobs=0561 inumgoodobs=0 575 562 DO jo = 1, fbdata%nobs 576 563 DO jk = 1, fbdata%nlev … … 578 565 & ( fbdata%pdep(jk,jo) < 9999.0 ) .AND. & 579 566 & ( fbdata%padd(jk,jo,1,jvar) < 9999.0 ) ) THEN 580 581 567 568 zomb=fbdata%pob(jk, jo, jvar)-fbdata%padd(jk, jo, 1, jvar) 582 569 zsumx=zsumx+zomb 583 570 zsumx2=zsumx2+zomb**2 584 numgoodobs=numgoodobs+1585 571 inumgoodobs=inumgoodobs+1 572 ENDIF 586 573 ENDDO 587 574 ENDDO 588 575 589 CALL obs_mpp_sum_integer( numgoodobs,numgoodobsmpp )576 CALL obs_mpp_sum_integer( inumgoodobs, inumgoodobsmpp ) 590 577 CALL mpp_sum(zsumx) 591 578 CALL mpp_sum(zsumx2) 592 579 593 580 IF (lwp) THEN 594 WRITE(numout,*) 'Type: ',fbdata%cname(jvar),' Total number of good observations: ',numgoodobsmpp595 WRITE(numout,*) 'Overall mean obs minus model of the good observations: ',zsumx/numgoodobsmpp596 WRITE(numout,*) 'Overall RMS obs minus model of the good observations: ',sqrt( zsumx2/ numgoodobsmpp )597 581 WRITE(numout,*) 'Type: ',fbdata%cname(jvar),' Total number of good observations: ',inumgoodobsmpp 582 WRITE(numout,*) 'Overall mean obs minus model of the good observations: ',zsumx/inumgoodobsmpp 583 WRITE(numout,*) 'Overall RMS obs minus model of the good observations: ',sqrt( zsumx2/inumgoodobsmpp ) 584 WRITE(numout,*) '' 598 585 ENDIF 599 586 600 587 ENDDO 601 588
Note: See TracChangeset
for help on using the changeset viewer.