C $Header: /u/gcmpack/MITgcm/verification/tutorial_global_oce_optim/code_oad/cost_weights.F,v 1.2 2014/09/11 19:54:57 jmc Exp $ C $Name: $ #include "COST_OPTIONS.h" #ifdef ALLOW_CTRL # include "CTRL_OPTIONS.h" #endif SUBROUTINE COST_WEIGHTS( myThid ) C ================================================================== C SUBROUTINE COST_WEIGHTS C ================================================================== C C o Set weights used in the cost function and in the C normalization of the sensitivities when ALLOW_NON_DIMENSIONAL IMPLICIT NONE C == global variables == #include "EEPARAMS.h" #include "SIZE.h" #include "PARAMS.h" #include "GRID.h" #include "ctrl.h" #include "ctrl_weights.h" #include "cost.h" C == routine arguments == INTEGER myThid C == Functions == INTEGER MDS_RECLEN EXTERNAL C == local variables == INTEGER bi,bj INTEGER i,j,k INTEGER itlo,ithi,jtlo,jthi INTEGER jMin,jMax,iMin,iMax INTEGER iUnit, length_of_rec _RL dummy _RL wti(Nr) REAL*8 tmpwti(Nr) CHARACTER*(MAX_LEN_MBUF) msgBuf C == end of interface == jtlo = myByLo(myThid) jthi = myByHi(myThid) itlo = myBxLo(myThid) ithi = myBxHi(myThid) iMin = 1-OLx iMax = sNx+OLx jMin = 1-OLy jMax = sNy+OLy C-- Initialize variance (weight) fields. DO k = 1,Nr wti(k) = 0. _d 0 ENDDO DO bj = jtlo,jthi DO bi = itlo,ithi DO j = jMin,jMax DO i = iMin,iMax whfluxm(i,j,bi,bj)= 0. _d 0 ENDDO ENDDO DO k = 1,Nr wunit(k,bi,bj) = 1. _d 0 wtheta(k,bi,bj) = 0. _d 0 wsalt(k,bi,bj) = 0. _d 0 ENDDO ENDDO ENDDO C-- Read error information and set up weight matrices. #ifdef ALLOW_COST_TEMP C Temperature weights for cost function _BEGIN_MASTER(myThid) CALL MDSFINDUNIT( iUnit, myThid ) length_of_rec = MDS_RECLEN( precFloat64, Nr, myThid ) OPEN( iUnit, FILE='Err_levitus_15layer.bin', STATUS='OLD', & FORM='UNFORMATTED',ACCESS='DIRECT',RECL=length_of_rec ) READ(iUnit,rec=1) tmpwti CLOSE(iUnit) #ifdef _BYTESWAPIO CALL MDS_BYTESWAPR8( Nr, tmpwti ) #endif _END_MASTER(myThid) _BARRIER DO k=1,Nr wti(k) = tmpwti(k) ENDDO WRITE(msgBuf,'(3A)') 'S/R COST_WEIGHTS:', & ' Temperature weights loaded from: ','Err_levitus_15layer.bin' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT , myThid ) c print*,'Weights for temperature: wti', (wti(k),k=1,nr) DO bj = jtlo,jthi DO bi = itlo,ithi DO k = 1, Nr wtheta(k,bi,bj) = 1. _d 0/wti(k)/wti(k) ENDDO ENDDO ENDDO #endif /* ALLOW_COST_TEMP */ C-- Then the hflux weights : #if (defined (ALLOW_COST_HFLUXM) defined (ALLOW_HFLUXM_CONTROL)) CALL READ_REC_3D_RL( 'Err_hflux.bin', precFloat64, 1, & whfluxm, 1, 0, myThid ) _EXCH_XY_RL(whfluxm , myThid ) DO bj = jtlo,jthi DO bi = itlo,ithi DO j = jMin,jMax DO i = iMin,iMax c print*,'Uncertainties for Heat Flux',i,j,whfluxm(i,j,bi,bj) IF (whfluxm(i,j,bi,bj) .NE. 0. _d 0) THEN whfluxm(i,j,bi,bj) = 1. _d 0 /whfluxm(i,j,bi,bj) & /whfluxm(i,j,bi,bj) ELSE whfluxm(i,j,bi,bj) = 1. _d 0 ENDIF ENDDO ENDDO ENDDO ENDDO #ifdef ALLOW_NONDIMENSIONAL_CONTROL_IO CALL ACTIVE_WRITE_XY('whfluxm',whfluxm,1,0,myThid,dummy) #endif #endif /* ALLOW_COST_HFLUXM or ALLOW_HFLUXM_CONTROL */ RETURN END