C $Header: /u/gcmpack/MITgcm/pkg/ecco/cost_gencost_glbmean.F,v 1.1 2017/04/05 04:55:02 ou.wang Exp $ C $Name: $ #include "ECCO_OPTIONS.h" subroutine COST_GENCOST_GLBMEAN( I mythid & ) c ================================================================== c SUBROUTINE cost_gencost_glbmean c ================================================================== c c o Evaluate cost function contribution of global mean time series c of OBP and SSH c c started: Ou Wang Nov-2015 c c ================================================================== c SUBROUTINE cost_gencost_glbmean c ================================================================== implicit none c == global variables == #include "EEPARAMS.h" #include "SIZE.h" #include "PARAMS.h" #include "GRID.h" #include "DYNVARS.h" #ifdef ALLOW_ECCO # include "ecco.h" #endif c == routine arguments == integer mythid #ifdef ALLOW_ECCO #ifdef ALLOW_GENCOST_CONTRIBUTION #ifdef ALLOW_GENCOST_1D c == local variables == integer bi,bj integer i,j integer itlo,ithi integer jtlo,jthi integer irec integer il logical doglobalread logical ladinit _RL locbar(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) _RL locw _RL locbarmean ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) _RL locbaranom ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) _RL loccount ( 1-olx:snx+olx, 1-oly:sny+oly, nsx, nsy ) _RL junk, junkweight character*(80) fname _RL fac _RL locbarglbmean _RL locbarglbmean_sum integer k, kgen integer locnrec integer ilo, ihi integer locunit _RL dataglbmean ( N1DDATA ) _RL meandataglbmean, meandataglbmeannu _RL locmask ( N1DDATA ) character*(max_len_mbuf) msgbuf c == external functions == integer ilnblnk, ifnblnk external , ifnblnk LOGICAL MASTER_CPU_THREAD EXTERNAL c == end of interface == jtlo = mybylo(mythid) jthi = mybyhi(mythid) itlo = mybxlo(mythid) ithi = mybxhi(mythid) do k=1,NGENCOST kgen=0 if (((gencost_name(k).EQ.'gmbp') .OR. & (gencost_name(k).EQ.'gmsl')) & .AND.( gencost_is1d(k) ) & .AND.(using_gencost(k)) ) kgen=k if (kgen.GT.0) then locw = gencost_wei1d(kgen) if(locw .NE. 0. _d 0) then c-- initialise local variables fac = 1. _d 0 c convert phibot from m2/s2 to cm if(gencost_name(k).EQ.'gmbp') fac = 1. _d 2 * recip_gravity do bj = jtlo,jthi do bi = itlo,ithi do j = 1,sny do i = 1,snx locbarmean(i,j,bi,bj) = 0. _d 0 locbaranom(i,j,bi,bj) = 0. _d 0 loccount(i,j,bi,bj) = 0. _d 0 locbar(i,j,bi,bj) = 0. _d 0 enddo enddo enddo enddo doglobalread = .false. ladinit = .false. c-- map global variable to local variables locnrec = gencost_nrec(kgen) meandataglbmean = 0. _d 0 meandataglbmeannu = 0. _d 0 do irec = 1, N1DDATA dataglbmean(irec) = 0. _d 0 locmask(irec) = 0. _d 0 enddo do irec = 1, locnrec dataglbmean(irec) = gencost_1DDATA(irec,kgen) if ( gencost_1DDATA(irec,kgen).gt.gencost_spmin(kgen) .and. & gencost_1DDATA(irec,kgen).lt.gencost_spmax(kgen) .and. & gencost_1DDATA(irec,kgen).ne.gencost_spzero(kgen) ) then locmask(irec) = 1. _d 0 meandataglbmean = meandataglbmean + dataglbmean(irec) meandataglbmeannu = meandataglbmeannu + 1. _d 0 endif enddo if(meandataglbmeannu.NE.0. _d 0) & meandataglbmean = meandataglbmean / meandataglbmeannu C now remove the time-mean from the data do irec = 1, locnrec if(locmask(irec).EQ.1. _d 0) then dataglbmean(irec) = dataglbmean(irec) & - meandataglbmean endif enddo c-- #ifdef ALLOW_CTRL write(fname(1:80),'(80a)') ' ' il=ilnblnk( gencost_barfile(kgen) ) write(fname(1:80),'(2a,i10.10)') & gencost_barfile(kgen)(1:il),'.',eccoiter #endif c-- ============ c-- Mean values. c-- ============ do irec = 1, locnrec if(locmask(irec) .NE. 0. _d 0) then c-- Compute the mean over all bpdat records. call ACTIVE_READ_XY( fname, locbar, irec, doglobalread, & ladinit, eccoiter, mythid, & gencost_dummy(kgen) ) do bj = jtlo,jthi do bi = itlo,ithi do j = 1,sny do i = 1,snx if ( maskc(i,j,1,bi,bj).NE. 0. _d 0 ) then locbarmean(i,j,bi,bj) = locbarmean(i,j,bi,bj) + & fac*locbar(i,j,bi,bj) loccount(i,j,bi,bj) = loccount(i,j,bi,bj) + 1. _d 0 endif enddo enddo enddo enddo endif enddo do bj = jtlo,jthi do bi = itlo,ithi do j = 1,sny do i = 1,snx if (loccount(i,j,bi,bj).GT. 0. _d 0) then locbarmean(i,j,bi,bj) = & locbarmean(i,j,bi,bj)/loccount(i,j,bi,bj) endif enddo enddo enddo enddo c-- ========== c-- Anomalies. c-- ========== c-- Loop over records for the second time. do irec = 1, locnrec if(locmask(irec) .NE. 0. _d 0) then call ACTIVE_READ_XY( fname, locbar, irec, doglobalread, & ladinit, eccoiter, mythid, & gencost_dummy(kgen) ) c-- Compute field of anomalies do bj = jtlo,jthi do bi = itlo,ithi do j = 1,sny do i = 1,snx if ( maskc(i,j,1,bi,bj).NE. 0. _d 0) then locbaranom(i,j,bi,bj) = & fac*locbar(i,j,bi,bj) - locbarmean(i,j,bi,bj) else locbaranom(i,j,bi,bj) = 0. _d 0 endif enddo enddo enddo enddo c-- Remove global mean value locbarglbmean = 0. _d 0 locbarglbmean_sum = 0. _d 0 do bj = jtlo,jthi do bi = itlo,ithi do j = 1,sny do i = 1,snx if ( maskc(i,j,1,bi,bj).NE. 0. _d 0) then locbarglbmean = locbarglbmean + & RA(i,j,bi,bj)*locbaranom(i,j,bi,bj) locbarglbmean_sum = locbarglbmean_sum + RA(i,j,bi,bj) endif enddo enddo enddo enddo _GLOBAL_SUM_RL( locbarglbmean , mythid ) _GLOBAL_SUM_RL( locbarglbmean_sum , mythid ) IF ( MASTER_CPU_THREAD(myThid) .AND. & ( locmask(irec) .NE. 0. _d 0 ) .AND. & ( locbarglbmean_sum .NE. 0. _d 0 ) ) THEN junk=locbarglbmean/locbarglbmean_sum - dataglbmean(irec) junkweight=locw objf_gencost(1,1,kgen) = objf_gencost(1,1,kgen) & + junk*junk*junkweight num_gencost(1,1,kgen) = num_gencost(1,1,kgen) & + 1. _d 0 WRITE(msgBuf,'(A,i6,2e16.5)') gencost_name(kgen)(1:10),irec, & locbarglbmean/locbarglbmean_sum, dataglbmean(irec) CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT , 1) ENDIF endif ! if(locmask .ne. 0. _d 0) enddo endif !if(locw .NE. 0. _d 0) then endif !if (kgen.GT.0) then enddo !do k=1,NGENCOST #endif /* ifdef ALLOW_GENCOST_1D */ #endif /* ifdef ALLOW_GENCOST_CONTRIBUTION */ #endif /* ifdef ALLOW_ECCO */ end