*IF DEF,OCEAN @DYALLOC.4056
C ******************************COPYRIGHT****************************** GTS3F400.88
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS3F400.89
C GTS3F400.90
C Use, duplication or disclosure of this code is subject to the GTS3F400.91
C restrictions as set forth in the contract. GTS3F400.92
C GTS3F400.93
C Meteorological Office GTS3F400.94
C London Road GTS3F400.95
C BRACKNELL GTS3F400.96
C Berkshire UK GTS3F400.97
C RG12 2SZ GTS3F400.98
C GTS3F400.99
C If no contract has been raised with this copy of the code, the use, GTS3F400.100
C duplication or disclosure of it is strictly prohibited. Permission GTS3F400.101
C to do so must first be obtained in writing from the Head of Numerical GTS3F400.102
C Modelling at the above address. GTS3F400.103
C ******************************COPYRIGHT****************************** GTS3F400.104
C ****************************ACKNOWLEDGMENT*************************** GTS3F400.105
C This code is derived from Public Domain code (the Cox 1984 Ocean GTS3F400.106
C Model) distributed by the Geophysical Fluid Dynamics Laboratory. GTS3F400.107
C NOAA GTS3F400.108
C PO Box 308 GTS3F400.109
C Princeton GTS3F400.110
C New Jersey USA GTS3F400.111
C If you wish to obtain a copy of the original code that does not have GTS3F400.112
C Crown Copyright use, duplication or disclosure restrictions, please GTS3F400.113
C contact them at the above address. GTS3F400.114
C ****************************ACKNOWLEDGMENT*************************** GTS3F400.115
C GTS3F400.116
SUBROUTINE RELAX( 1,10RELAX.2
*CALL ARGSIZE
@DYALLOC.4057
*CALL ARGOCALL
@DYALLOC.4058
*CALL ARGOINDX
ORH7F402.105
& P,PB,PTD,PTDB ORH3F405.84
&,ZTD RELAX.5
& ) RELAX.6
! ORH8F404.1
! MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.4 ORH8F404.2
! VERSION DATE ORH8F404.3
! 3.4 25/10/94 :REPLACES CRAY-SPECIFIC CVMGZ CALL WITH IF STATEMENT ORH8F404.4
! (N FARNON) ORH8F404.5
! 4.4 11/08/97 Remove non-chequerboarding option since this will ORH8F404.6
! not work in mpp mode and nobody requires it anyway. ORH8F404.7
! Also tidy up the code generally to help readability ORH8F404.8
! and maintenance. ORH8F404.9
! R. Hill ORH8F404.10
C======================================================================= RELAX.8
C === RELAX.9
C RELAX TAKES AS INPUT THE VORTICITY DRIVING FUNCTION COMPUTED IN === RELAX.10
C "CLINIC" (ZTD) AND, USING SEQUENTIAL OVER-RELAXATION, === RELAX.11
C SOLVES THE LAPLACIAN EQUATION FOR THE EXTERNAL MODE OF === RELAX.12
C VELOCITY IN TERMS OF A MASS TRANSPORT STREAM FUNCTION (P). === RELAX.13
C === RELAX.14
C======================================================================= RELAX.15
C RELAX.16
IMPLICIT NONE RH011293.200
C--------------------------------------------------------------------- RELAX.17
C DEFINE GLOBAL DATA RELAX.18
C--------------------------------------------------------------------- RELAX.19
C RELAX.20
*CALL OARRYSIZ
ORH6F401.27
*CALL TYPSIZE
@DYALLOC.4059
*CALL TYPOINDX
PXORDER.44
*CALL TYPOCALL
@DYALLOC.4060
*CALL UMSCALAR
RELAX.23
*CALL CNTLOCN
ORH1F305.2629
*CALL OTIMER
ORH1F305.2631
C----------------------------------------------------------------------- RELAX.26
C DEFINE ARGUMENT LIST RELAX.27
C----------------------------------------------------------------------- RELAX.28
C RELAX.29
REAL P(IMT_STREAM,0:JMT_STREAM+1),PB(IMT_STREAM,0:JMT_STREAM+1) ORH3F405.85
&,PTD(IMT_STREAM,JMT_STREAM),PTDB(IMT_STREAM,JMT_STREAM) ORH1F305.2633
&,ZTD(IMT_STREAM,JMT_STREAM), ! Vorticity change across timesteps ORH1F305.2634
& FX, ! Temporary value RH011293.202
& FXA, ! Temporary value RH011293.203
& FXB, ! Temporary value RH011293.204
& FXC, ! Temporary value RH011293.205
& CRTP, ! Altered val of CRIT (convergence criteria) RH011293.206
& ! for computational efficiency RH011293.207
& RESMAX ! Max of residuals at all grid points RH011293.208
C RH011293.209
C RH011293.210
C RH011293.211
C DECLARE INTEGER VARIABLES RH011293.212
C RH011293.213
INTEGER ORH3F405.86
& I, ! Grid point index (Zonal) RH011293.215
& J, ! Grid point index (Meridonal) RH011293.216
& L, ! Loop control for ocean segment RH011293.217
& IE, ! End index for I loop RH011293.218
& IS ! Start index for I loop RH011293.219
INTEGER INFO ! Dummy variable for message passing use ORH2F403.1
INTEGER GID,ISTAT ORH2F403.2
C RH011293.220
C RELAX.34
C RELAX.35
C--------------------------------------------------------------------- RELAX.36
C DIMENSION LOCAL DATA RELAX.37
C--------------------------------------------------------------------- RELAX.38
C RELAX.39
ORH1F305.2635
REAL RELAX.41
& FXD, ! Temporary value RH011293.221
& RESIS_ROW(JMT,NISLE), ORH2F403.3
& RESIS(NISLE), ! Residual of relaxation of island ORH2F403.4
& TEST1, ! Product of reciprocals of 4 surrounding depths RH011293.223
& TEST2, ! Sum of reciprocals of 4 surrounding depths RH011293.224
& COF(IMT,JMT),COFIS(NISLE) ORH1F305.2636
&,COFIS_ROW(JMT) ORH2F403.5
ORH1F305.2637
REAL RELAX.44
& CFN(IMT,JMT),CFS(IMT,JMT),CFE(IMT,JMT),CFW(IMT,JMT) RELAX.45
&,RES(IMT,JMT),CPF(IMT) RELAX.46
&,WORKP(IMT,JMT),H(IMT,JMT) RELAX.47
ORH1F305.2638
INTEGER RELAX.49
& ISLE, ! Do loop index indicates current island RH011293.225
& JE, ! End index for J loop RH011293.226
& JS, ! Start index for J loop RH011293.227
& N, ! Do loop index for island segments RH011293.228
& NSEG, ! End index for island segment DO loops RH011293.229
& ISMASK(IMT,JMT) ORH1F305.2639
ORH1F305.2640
C--------------------------------------------------------------- RELAX.53
C Define local variables used solely for red-black SOR RELAX.54
C--------------------------------------------------------------- RELAX.55
C RELAX.56
INTEGER NWCNT,NWMAX,IHOP,ISTART RELAX.57
REAL REMASK(IMT,JMT),SOR1,SORP,MUMSQR ORH3F405.87
LOGICAL EX1,EX2 RELAX.59
ORH1F305.2643
C RELAX.61
C--------------------------------------------------------------------- RELAX.62
C BEGIN EXECUTABLE CODE RELAX.63
C--------------------------------------------------------------------- RELAX.64
IF (L_OTIMER) CALL TIMER
('RELAX ',3) ORH1F305.2644
C RELAX.68
C======================================================================= RELAX.69
C BEGIN INTRODUCTORY SECTION TO PREPARE FOR THE RELAXATION =========== RELAX.70
C======================================================================= RELAX.71
C RELAX.72
GID=0 ! temporary should use GC_ALL_GROUP really ORH2F403.6
C--------------------------------------------------------------------- RELAX.73
C INITIALIZE THE WORK AREA RELAX.74
C--------------------------------------------------------------------- RELAX.75
C RELAX.76
FX=0.0 RELAX.77
DO J=J_1,J_JMT ORH8F404.11
DO I=1,IMT ORH8F404.12
CFN(I,J)=FX ORH8F404.13
CFS(I,J)=FX ORH8F404.14
CFE(I,J)=FX ORH8F404.15
CFW(I,J)=FX ORH8F404.16
IF (L_OISLANDS) THEN ORH8F404.17
COF(I,J)=FX ORH8F404.18
ISMASK(I,J)=0 ORH8F404.19
ENDIF ORH8F404.20
ORH8F404.21
REMASK(I,J) = FX ORH8F404.22
ENDDO ! Over I ORH8F404.23
ENDDO ! Over J ORH8F404.24
ORH8F404.25
ORH8F404.26
IF (L_OISLANDS) THEN ORH1F305.2652
C--------------------------------------------------------------------- RELAX.94
C FORM ISLAND MASK (ISMASK=0 OVER INTERIOR OCEAN POINTS RELAX.95
C ISMASK=1 OVER PERIMETER OCEAN POINTS RELAX.96
C ISMASK=2 OVER LAND POINTS) RELAX.97
C--------------------------------------------------------------------- RELAX.98
C RELAX.99
DO I=2,IMU ORH8F404.27
DO J=J_2,J_JMTM1 ORH8F404.28
TEST1=HR(I,J)*HR(I-1,J)*HR(I,J-1)*HR(I-1,J-1) ORH8F404.29
TEST2=HR(I,J)+HR(I-1,J)+HR(I,J-1)+HR(I-1,J-1) ORH8F404.30
IF(TEST1.EQ.0.0) ISMASK(I,J)=1 ORH8F404.31
IF(TEST2.EQ.0.0) ISMASK(I,J)=2 ORH8F404.32
ENDDO ORH8F404.33
ENDDO ORH8F404.34
ORH8F404.35
C RELAX.119
ENDIF ORH1F305.2660
C--------------------------------------------------------------------- RELAX.121
C CALCULATE DEPTH FIELD FROM ITS RECIPROCAL RELAX.122
C--------------------------------------------------------------------- RELAX.123
C RELAX.124
C COMPUTE RECIPROCALS WITH AN EPSILON ADDED TO AVOID ZERO DIVIDE RELAX.125
C RELAX.126
FXA=1.0 RELAX.127
FXB=1.E-20 RELAX.128
DO J=J_2,J_JMTM1 ORH8F404.36
DO I=1,IMT ORH8F404.37
H(I,J)=FXA/(HR(I,J)+FXB) ORH8F404.38
ENDDO ORH8F404.39
ENDDO ORH8F404.40
ORH1F305.2661
IF (L_OISLANDS) THEN ORH1F305.2662
C RELAX.134
C THEN RESET H OVER LAND TO ZERO RELAX.135
C RELAX.136
FX=0.0 ORH8F404.41
DO J=J_1,J_JMT ORH8F404.42
DO I=1,IMT ORH8F404.43
IF(HR(I,J).EQ.FX)H(I,J)=FX ORH8F404.44
ENDDO ORH8F404.45
ENDDO ORH8F404.46
ORH1F305.2663
ENDIF ORH1F305.2664
ORH1F305.2665
IF (L_OCYCLIC) THEN ORH1F305.2666
C RELAX.144
C THEN SET CYCLIC BOUNDARY CONDITIONS ON H RELAX.145
C RELAX.146
DO J=J_1,J_JMT ORH8F404.47
H(1,J)=H(IMUM1,J) ORH1F305.2668
ENDDO ORH8F404.48
ORH1F305.2670
ENDIF ORH1F305.2671
*IF DEF,MPP ORH4F402.67
C===================================================================== ORH4F402.68
C CALL TO SWAPBOUNDS FOR HALO UPDATE IN MPP VERSION ORH4F402.69
C===================================================================== ORH4F402.70
ORH4F402.71
*IF DEF,T3E ORH2F403.12
CALL SWAP_1D
(H,IMT,JMT,O_EW_HALO,O_NS_HALO,1) ORH2F403.13
*ELSE ORH2F403.14
CALL SWAPBOUNDS
(H,IMT,JMT,O_EW_HALO,O_NS_HALO,1) ORH2F403.15
*ENDIF ORH2F403.16
ORH4F402.73
*ENDIF ORH4F402.74
ORH4F402.75
C RELAX.151
C--------------------------------------------------------------------- RELAX.152
C GENERATE ARRAYS OF COEFFICIENTS FOR RELAXATION RELAX.153
C--------------------------------------------------------------------- RELAX.154
C RELAX.155
C 1ST, COMPUTE COEFFICIENTS OF THE LAPLACIAN STAR RELAX.156
C (HOLD NON-INTERIOR POINTS TO ZERO USING START AND END INDICES) RELAX.157
C RELAX.158
DO J=J_3,J_JMTM1 ORH8F404.49
DO L=1,LSEG ORH8F404.50
IS=ISZ(J,L) ORH8F404.51
IF(IS.EQ.0) GO TO 130 ORH8F404.52
IE=IEZ(J,L) ORH8F404.53
FXA=2.0*CSTR(J)*CSTR(J) ORH8F404.54
FXB=2.0*CS(J )*CSTR(J)*DYTR(J)*DYUR(J ) ORH8F404.55
FXC=2.0*CS(J-1)*CSTR(J)*DYTR(J)*DYUR(J-1) ORH8F404.56
FX=1.0 ORH8F404.57
DO I=IS,IE ORH8F404.58
CFN(I,J)=FXB/(H(I-1,J)+H(I,J)) ORH8F404.59
CFS(I,J)=FXC/(H(I-1,J-1)+H(I,J-1)) ORH8F404.60
CFE(I,J)=FXA*DXUR(I)*DXTR(I)/(H(I,J)+H(I,J-1)) ORH8F404.61
CFW(I,J)=FXA*DXUR(I-1)*DXTR(I)/(H(I-1,J)+H(I-1,J-1)) ORH8F404.62
CPF(I)=FX/(CFN(I,J)+CFS(I,J)+CFE(I,J)+CFW(I,J)) ORH8F404.63
ORH8F404.64
REMASK(I,J) = FX ORH8F404.65
ENDDO ORH8F404.66
ORH8F404.67
C RELAX.178
C 2ND, AUGMENT COEFFICIENTS FOR IMPLICIT TREATMENT OF CORIOLIS TERM RELAX.179
C RELAX.180
IF (ACOR.NE.0.0) THEN ORH8F404.68
ORH1F305.2675
IF (L_OROTATE) THEN ORH8F404.69
FX=-0.5*C2DTSF*ACOR*CSTR(J)*DYTR(J) ORH8F404.70
DO I=IS,IE ORH8F404.71
CFN(I,J)=CFN(I,J) ORH8F404.72
& +(HR(I,J)*CORIOLIS(I,J)-HR(I-1,J)* ORH8F404.73
& CORIOLIS(I-1,J))*FX*DXTR(I) ORH8F404.74
CFS(I,J)=CFS(I,J) ORH8F404.75
& -(HR(I,J-1)*CORIOLIS(I,J-1)-HR(I-1,J-1)* ORH8F404.76
& CORIOLIS(I-1,J-1))*FX*DXTR(I) ORH8F404.77
CFE(I,J)=CFE(I,J) ORH8F404.78
& -(HR(I,J)*CORIOLIS(I,J)-HR(I,J-1)* ORH8F404.79
& CORIOLIS(I,J-1))*FX*DXTR(I) ORH8F404.80
CFW(I,J)=CFW(I,J) ORH8F404.81
& +(HR(I-1,J)*CORIOLIS(I-1,J)-HR(I-1,J-1)* ORH8F404.82
& CORIOLIS(I-1,J-1))*FX*DXTR(I) ORH8F404.83
ENDDO ! over I ORH8F404.84
ELSE ORH8F404.85
FX=-C2DTSF*ACOR*CSTR(J)*DYTR(J)*OMEGA ORH8F404.86
DO I=IS,IE ORH8F404.87
ORH1F305.2693
CFN(I,J)=CFN(I,J)+(HR(I,J )-HR(I-1,J ))*SINE(J ) ORH8F404.88
& *FX*DXTR(I) ORH8F404.89
CFS(I,J)=CFS(I,J)-(HR(I,J-1)-HR(I-1,J-1))*SINE(J-1) ORH8F404.90
& *FX*DXTR(I) ORH8F404.91
CFE(I,J)=CFE(I,J)-(HR(I ,J)*SINE(J)-HR(I ,J-1)* ORH8F404.92
& SINE(J-1))*FX*DXTR(I) ORH8F404.93
CFW(I,J)=CFW(I,J)+(HR(I-1,J)*SINE(J)-HR(I-1,J-1)* ORH8F404.94
& SINE(J-1))*FX*DXTR(I) ORH8F404.95
ENDDO ! over I ORH8F404.96
ENDIF ! L_OROTATE = false ORH8F404.97
ORH1F305.2700
ENDIF ORH8F404.98
C RELAX.223
C 3RD, NORMALIZE COEFFICIENTS AND FORCING TERM FOR EFFICIENCY RELAX.224
C RELAX.225
DO I=IS,IE ORH8F404.99
CFN(I,J)=CFN(I,J)*CPF(I) ORH8F404.100
CFS(I,J)=CFS(I,J)*CPF(I) ORH8F404.101
CFE(I,J)=CFE(I,J)*CPF(I) ORH8F404.102
CFW(I,J)=CFW(I,J)*CPF(I) ORH8F404.103
ZTD(I,J)=ZTD(I,J)*CPF(I) ORH8F404.104
ENDDO ORH8F404.105
130 CONTINUE ORH8F404.106
ENDDO ! Over L ORH8F404.107
ENDDO ! Over J ORH8F404.108
ORH8F404.109
IF (L_OISLANDS) THEN ORH1F305.2701
C RELAX.235
C 4TH, COMPUTE COEFFICIENTS ON ISLAND PERIMETER POINTS RELAX.236
C RELAX.237
DO ISLE=1,NISLE ORH8F404.110
DO J=J_1,J_JMT ORH8F404.111
COFIS_ROW(J)=0.0 ORH8F404.112
ENDDO ORH8F404.113
COFIS(ISLE)=0.0 ORH8F404.114
NSEG=ISEG(ISLE) ORH8F404.115
DO N=1,NSEG ORH8F404.116
IS=ISIS(ISLE,N) ORH8F404.117
IE=IEIS(ISLE,N) ORH8F404.118
JS=JSIS(ISLE,N) ORH8F404.119
JE=JEIS(ISLE,N) ORH8F404.120
*IF DEF,MPP ORH2F403.21
c Adjust J indices to be relative to local values for each PE ORH2F403.22
IF ((JST.GT.JE).OR.(JFIN.LT.JS)) THEN ORH8F404.121
c Make sure the J loop doesn't get executed ORH2F403.24
JS = 1 ORH8F404.122
JE = 0 ORH8F404.123
ORH2F403.27
ELSE ORH8F404.124
ORH2F403.29
IF (JST.GT.JS) THEN ORH8F404.125
JS = JST ORH8F404.126
ENDIF ORH8F404.127
IF (JFIN.LT.JE) THEN ORH8F404.128
JE = JFIN ORH8F404.129
ENDIF ORH8F404.130
c Adjust to local versions of indices. ORH2F403.36
JS = JS - J_OFFSET ORH8F404.131
JE = JE - J_OFFSET ORH8F404.132
ENDIF ORH8F404.133
*ENDIF ORH2F403.40
DO J=JS,JE ORH8F404.134
FXA=2.0*CSTR(J)*CSTR(J) ORH8F404.135
FXB=2.0*CS(J )*DYUR(J )*DYTR(J)*CSTR(J) ORH8F404.136
FXC=2.0*CS(J-1)*DYUR(J-1)*DYTR(J)*CSTR(J) ORH8F404.137
IF (L_OROTATE) THEN ORH8F404.138
FXD=-0.5*C2DTSF*ACOR*CSTR(J)*DYTR(J) ORH8F404.139
ELSE ORH8F404.140
FXD=-C2DTSF*ACOR*CSTR(J)*DYTR(J)*OMEGA ORH8F404.141
ENDIF ORH8F404.142
ORH1F305.2707
DO I=IS,IE ORH8F404.143
IF(ISMASK(I,J).NE.1) GO TO 175 ORH8F404.144
ORH1F305.2708
IF (L_OROTATE) THEN ORH8F404.145
ORH1F305.2710
IF(HR(I-1,J ).NE.0.0 .OR. HR(I ,J ).NE.0.0) ORH8F404.146
& CFN(I,J)=FXB/(H(I-1,J)+H(I,J)) ORH8F404.147
& +FXD*DXTR(I)*(HR(I,J)* ORH8F404.148
& CORIOLIS(I,J)-HR(I-1,J)* ORH8F404.149
& CORIOLIS(I-1,J)) ORH8F404.150
ORH1F305.2714
IF(HR(I-1,J-1).NE.0.0 .OR. HR(I ,J-1).NE.0.0) ORH8F404.151
& CFS(I,J)=FXC/(H(I-1,J-1)+H(I,J-1)) ORH8F404.152
& -FXD*DXTR(I) ORH8F404.153
& *(HR(I,J-1)*CORIOLIS(I,J-1)- ORH8F404.154
& HR(I-1,J-1)*CORIOLIS(I-1,J-1)) ORH8F404.155
ORH1F305.2719
IF(HR(I ,J ).NE.0.0 .OR. HR(I ,J-1).NE.0.0) ORH8F404.156
& CFE(I,J)=FXA*DXTR(I)*DXUR(I)/(H(I,J)+H(I,J-1)) ORH8F404.157
& -FXD*DXTR(I) ORH8F404.158
& *(HR(I,J)*CORIOLIS(I,J)-HR(I,J-1)* ORH8F404.159
& CORIOLIS(I,J-1)) ORH8F404.160
ORH1F305.2724
IF(HR(I-1,J ).NE.0.0 .OR. HR(I-1,J-1).NE.0.0) ORH8F404.161
& CFW(I,J)=FXA*DXTR(I)*DXUR(I-1)/(H(I-1,J)+ ORH8F404.162
& H(I-1,J-1)) ORH8F404.163
& +FXD*DXTR(I) ORH8F404.164
& *(HR(I-1,J)*CORIOLIS(I-1,J)- ORH8F404.165
& HR(I-1,J-1)*CORIOLIS(I-1,J-1)) ORH8F404.166
ELSE ORH8F404.167
ORH1F305.2730
IF(HR(I-1,J ).NE.0.0 .OR. HR(I ,J ).NE.0.0) ORH8F404.168
& CFN(I,J)=FXB/(H(I-1,J)+H(I,J)) ORH8F404.169
& +FXD*DXTR(I)*(HR(I,J)-HR(I-1,J))* ORH8F404.170
& SINE(J) ORH8F404.171
ORH1F305.2733
IF(HR(I-1,J-1).NE.0.0 .OR. HR(I ,J-1).NE.0.0) ORH8F404.172
& CFS(I,J)=FXC/(H(I-1,J-1)+H(I,J-1)) ORH8F404.173
& -FXD*DXTR(I)*(HR(I,J-1)-HR(I-1,J-1))* ORH8F404.174
& SINE(J-1) ORH8F404.175
ORH1F305.2736
IF(HR(I ,J ).NE.0.0 .OR. HR(I ,J-1).NE.0.0) ORH8F404.176
& CFE(I,J)=FXA*DXTR(I)*DXUR(I)/(H(I,J)+H(I,J-1)) ORH8F404.177
& -FXD*DXTR(I)*(HR(I,J)*SINE(J)- ORH8F404.178
& HR(I,J-1)*SINE(J-1)) ORH8F404.179
ORH1F305.2739
IF(HR(I-1,J ).NE.0.0 .OR. HR(I-1,J-1).NE.0.0) ORH8F404.180
& CFW(I,J)=FXA*DXTR(I)*DXUR(I-1)/ ORH8F404.181
& (H(I-1,J)+H(I-1,J-1)) ORH8F404.182
& +FXD*DXTR(I)*(HR(I-1,J)*SINE(J)- ORH8F404.183
& HR(I-1,J-1)*SINE(J-1)) ORH8F404.184
ENDIF ORH8F404.185
ORH1F305.2743
ORH1F305.2744
COF(I,J)=1.0/(CFN(I,J)+CFS(I,J)+CFE(I,J)+CFW(I,J)) ORH8F404.186
CFN(I,J)=CFN(I,J)*COF(I,J) ORH8F404.187
CFS(I,J)=CFS(I,J)*COF(I,J) ORH8F404.188
CFE(I,J)=CFE(I,J)*COF(I,J) ORH8F404.189
CFW(I,J)=CFW(I,J)*COF(I,J) ORH8F404.190
ZTD(I,J)=ZTD(I,J)*COF(I,J) ORH8F404.191
COF(I,J)=CST(J)*DXT(I)*DYT(J)/COF(I,J) ORH8F404.192
COFIS_ROW(J)=COFIS_ROW(J)+COF(I,J) ORH8F404.193
175 CONTINUE ORH8F404.194
ENDDO ! Over I ORH8F404.195
ENDDO ! Over J ORH8F404.196
ENDDO ! Over N ORH8F404.197
*IF DEF,MPP ORH2F403.42
! Now we must add all COFIS values for this island ORH2F403.43
! in a manner which will allow bit comparison. ORH2F403.44
CALL OISLESUMA
(COFIS_ROW,JMT,COFIS(ISLE)) ORH8F404.198
*ELSE ORH2F403.46
DO J = J_1, J_JMT ORH8F404.199
COFIS(ISLE) = COFIS(ISLE) + COFIS_ROW(J) ORH8F404.200
ENDDO ORH8F404.201
*ENDIF ORH2F403.50
COFIS(ISLE)=1./COFIS(ISLE) ORH8F404.202
ENDDO ! Over ISLE ORH8F404.203
ORH1F305.2745
ENDIF ! L_OISLANDS = true ORH1F305.2746
C RELAX.315
C--------------------------------------------------------------------- RELAX.328
C COMPUTE A FIRST GUESS FOR THE RELAXATION BY EXTRAPOLATING THE TWO RELAX.329
C PREVIOUS SOLUTIONS FORWARD IN TIME. RELAX.330
C--------------------------------------------------------------------- RELAX.331
C RELAX.332
C 1ST, SAVE VALUES IN PTD IN ARRAY WORKP RELAX.333
C RELAX.334
DO J=J_1,J_JMT ORH8F404.204
DO I=1,IMT ORH8F404.205
WORKP(I,J)=PTD(I,J) ORH8F404.206
ENDDO ORH8F404.207
ENDDO ORH8F404.208
C RELAX.339
C 2ND, PERFORM TIME EXTRAPOLATION (ACCOUNTING FOR MIXING TIMESTEP) RELAX.340
C RELAX.341
FXA=1.0 RELAX.342
FXB=2.0 RELAX.343
IF(MIX.EQ.1) FXA=0.5 RELAX.344
DO J=J_1,J_JMT ORH8F404.209
DO I=1,IMT ORH8F404.210
PTD(I,J)=FXA*(FXB*PTD(I,J)-PTDB(I,J)) ORH8F404.211
ENDDO ORH8F404.212
ENDDO ORH8F404.213
C RELAX.349
C 3RD, NOW COPY ORIGINAL VALUES FROM PTD (NOW IN WORKP) INTO PTDB RELAX.350
C RELAX.351
DO J=J_1,J_JMT ORH8F404.214
DO I=1,IMT ORH8F404.215
PTDB(I,J)=WORKP(I,J) ORH8F404.216
ENDDO ORH8F404.217
ENDDO ORH8F404.218
C RELAX.356
C DETERMINE MAX PTD OVER ALL POINTS AND USE THIS ORH8F404.219
C TO COMPUTE CRITERION FOR CONVERGENCE ORH8F404.220
CRTP = 0.0 ORH8F404.221
DO I=1,IMT ORH8F404.222
DO J=J_1,J_JMT ORH8F404.223
CRTP = MAX(ABS(PTD(I,J)),CRTP) ORH1F305.2755
ENDDO ORH8F404.224
ENDDO ORH8F404.225
ORH8F404.226
*IF DEF,MPP ORH2F403.56
CALL GC_RMAX (
1,O_NPROC,INFO,CRTP) ORH8F404.227
*ENDIF ORH2F403.58
CRTP=CRTP*CRIT ORH8F404.228
C RELAX.370
FX=0.0 RELAX.371
DO J=J_1,J_JMT ORH8F404.229
DO I=1,IMT ORH8F404.230
RES(I,J)=FX ORH8F404.231
ENDDO ORH8F404.232
ENDDO ORH8F404.233
C RELAX.376
C======================================================================= RELAX.377
C END INTRODUCTORY SECTION =========================================== RELAX.378
C======================================================================= RELAX.379
C RELAX.380
C======================================================================= RELAX.381
C BEGIN SECTION TO DO THE RELAXATION ================================= RELAX.382
C======================================================================= RELAX.383
C RELAX.384
MSCAN=0 RELAX.385
SORP=1.0 ORH2F403.153
MUMSQR=1.0-(2.0/SOR-1.0)*(2.0/SOR-1.0) ! max eigenval**2 ORH2F403.154
EX1 = .FALSE. ORH8F404.234
EX2 = .FALSE. ORH8F404.235
NWCNT = 0 ORH8F404.236
NWMAX = MXSCAN ORH8F404.237
C Use a mask to set residuals to zero over land ORH8F404.238
ORH1F305.2765
300 MSCAN=MSCAN+1 RELAX.394
ORH1F305.2766
DO IHOP = 1,2 ORH8F404.239
*IF DEF,MPP ORH2F403.60
C===================================================================== ORH2F403.61
C CALL TO SWAPBOUNDS FOR HALO UPDATE IN MPP VERSION ORH2F403.62
C===================================================================== ORH2F403.63
*IF DEF,T3E ORH2F403.64
CALL SWAP_1D
(PTD,IMT,JMT,O_EW_HALO,O_NS_HALO,1) ORH2F403.65
*ELSE ORH2F403.66
CALL SWAPBOUNDS
(PTD,IMT,JMT,O_EW_HALO,O_NS_HALO,1) ORH2F403.67
*ENDIF ORH2F403.68
*ENDIF ORH2F403.69
C RELAX.398
C--------------------------------------------------------------------- RELAX.399
C COMPUTE ENTIRE FIELD OF RESIDUALS AS IN SIMULTANEOUS RELAXATION RELAX.400
C (..NOTE.. RESIDUALS WILL REMAIN 0 OVER NON-INTERIOR POINTS) RELAX.402
C WHEN L_OISLANDS = false. ORH1F305.2769
C--------------------------------------------------------------------- RELAX.404
C RELAX.405
DO J =J_3,JSCAN ORH8F404.240
ISTART=3-MOD(IHOP+J+J_OFFSET,2) ORH2F403.71
ORH1F305.2770
DO I=ISTART,IMTM1,2 ORH8F404.241
RES(I,J) = REMASK(I,J)*(CFN(I,J)*PTD(I,J+1) ORH1F305.2771
* +CFS(I,J)*PTD(I,J-1) RELAX.425
* +CFE(I,J)*PTD(I+1,J) RELAX.426
* +CFW(I,J)*PTD(I-1,J) RELAX.427
& -PTD(I,J)-ZTD(I,J)) ORH8F404.242
ENDDO ORH8F404.243
ORH8F404.244
IF (L_OCYCLIC) THEN ORH8F404.245
C ORH1F305.2775
C--------------------------------------------------------------------- ORH1F305.2776
C SET CYCLIC BOUNDARY CONDITIONS ON THE RESIDUALS ORH1F305.2777
C--------------------------------------------------------------------- ORH1F305.2778
C ORH1F305.2779
RES(1,J)=RES(IMUM1,J) ORH1F305.2780
RES(IMT,J)=RES(2,J) ORH1F305.2781
ORH1F305.2782
ENDIF ORH8F404.246
C ORH1F305.2784
C--------------------------------------------------------------------- ORH1F305.2785
C MAKE A CORRECTION TO PTD BASED ON THE RESIDUALS ORH1F305.2786
C--------------------------------------------------------------------- ORH1F305.2787
C ORH1F305.2788
ISTART=1+MOD(IHOP+J+J_OFFSET,2) ORH2F403.72
DO I=ISTART,IMT,2 ORH8F404.247
PTD(I,J) = PTD(I,J)+SORP*RES(I,J) ORH8F404.248
ENDDO ORH8F404.249
ORH1F305.2793
ENDDO ! Over J ORH8F404.250
ORH1F305.2796
ENDDO ! Over IHOP ORH8F404.251
ORH1F305.2813
ORH1F305.2857
C--------------------------------------------------------------------- RELAX.554
C FIND THE MAXIMUM ABSOLUTE RESIDUAL TO DETERMINE CONVERGENCE RELAX.555
C--------------------------------------------------------------------- RELAX.556
C RELAX.557
RESMAX=0.0 RELAX.558
DO J=J_3,JSCAN ORH8F404.252
DO I=2,IMTM1 ORH8F404.253
RESMAX=MAX(ABS(RES(I,J)),RESMAX) ORH8F404.254
ENDDO ORH8F404.255
ENDDO ORH8F404.256
ORH1F305.2858
IF (L_OISLANDS) THEN ORH1F305.2859
C RELAX.564
C--------------------------------------------------------------------- RELAX.565
C DO HOLE RELAXATION FOR EACH ISLAND RELAX.566
C--------------------------------------------------------------------- RELAX.567
C RELAX.568
*IF DEF,MPP ORH2F403.74
C===================================================================== ORH2F403.75
C CALL TO SWAPBOUNDS FOR HALO UPDATE IN MPP VERSION ORH2F403.76
C===================================================================== ORH2F403.77
*IF DEF,T3E ORH2F403.78
CALL SWAP_1D
(PTD,IMT,JMT,O_EW_HALO,O_NS_HALO,1) ORH2F403.79
*ELSE ORH2F403.80
CALL SWAPBOUNDS
(PTD,IMT,JMT,O_EW_HALO,O_NS_HALO,1) ORH2F403.81
*ENDIF ORH2F403.82
*ENDIF ORH2F403.83
FX=0.0 RELAX.569
DO ISLE=1,NISLE ORH2F403.84
DO J = J_1, J_JMT ORH2F403.85
RESIS_ROW(J,ISLE)=FX ORH2F403.86
ENDDO ORH2F403.87
NSEG=ISEG(ISLE) ORH8F404.257
DO N=1,NSEG ORH8F404.258
IS=ISIS(ISLE,N) ORH8F404.259
IE=IEIS(ISLE,N) ORH8F404.260
JS=JSIS(ISLE,N) ORH8F404.261
JE=JEIS(ISLE,N) ORH8F404.262
*IF DEF,MPP ORH2F403.88
c Adjust J indices to be relative to local values for each PE ORH2F403.89
IF ((JST.GT.JE).OR.(JFIN.LT.JS)) THEN ORH8F404.263
c Make sure the J loop doesn't get executed ORH2F403.91
JS = 1 ORH8F404.264
JE = 0 ORH8F404.265
ELSE ORH8F404.266
IF (JST.GT.JS) THEN ORH8F404.267
JS = JST ORH8F404.268
ENDIF ORH8F404.269
IF (JFIN.LT.JE) THEN ORH8F404.270
JE = JFIN ORH8F404.271
ENDIF ORH8F404.272
c Adjust to local versions of indices. ORH2F403.101
JS = JS - J_OFFSET ORH8F404.273
JE = JE - J_OFFSET ORH8F404.274
ENDIF ORH8F404.275
*ENDIF ORH2F403.105
DO J=JS,JE ORH1F305.2861
DO I=IS,IE ORH1F305.2862
IF(ISMASK(I,J).EQ.1) THEN ORH1F305.2863
RESIS_ROW(J,ISLE)=RESIS_ROW(J,ISLE) ORH2F403.106
& +(CFN(I,J)*PTD(I ,J+1) ORH2F403.107
& +CFS(I,J)*PTD(I ,J-1) ORH1F305.2865
& +CFE(I,J)*PTD(I+1,J ) ORH1F305.2866
& +CFW(I,J)*PTD(I-1,J ) ORH1F305.2867
& -(PTD(I,J)+ZTD(I,J)))*COF(I,J) ORH1F305.2868
ENDIF ORH1F305.2869
ENDDO ! over I ORH1F305.2870
ENDDO ! over J ORH1F305.2871
ENDDO ! Over N ORH8F404.276
ENDDO ! over ISLE ORH2F403.111
ORH2F403.112
C RELAX.596
C NORMALIZE THE ISLAND RESIDUAL AND UPDATE THE MAXIMUM RELAX.597
C ABSOLUTE RESIDUAL OF THE RELAXATION IF NECESSARY RELAX.598
C RELAX.599
! We now need global sums for RESIS(ISLE) ORH2F403.113
! (we could use REVECSUMR here - buth this is slow, ORH2F403.114
! so we use our own version of the summation). ORH2F403.115
ORH2F403.116
! Perform island sums on RESIS_ROW and max of RESMAX ORH2F403.117
CALL OISLESUM
(RESIS_ROW,JMT,NISLE,RESIS,RESMAX) ORH2F403.118
ORH2F403.119
DO ISLE=1,NISLE ORH2F403.120
RESIS(ISLE)=RESIS(ISLE)*COFIS(ISLE) ORH2F403.121
RESMAX=MAX(ABS(RESIS(ISLE)),RESMAX) ORH2F403.122
RESIS(ISLE)=RESIS(ISLE)*SORP ORH8F404.277
ENDDO ORH2F403.124
ORH2F403.125
C RELAX.607
C MAKE A CORRECTION TO PTD OVER THE ISLAND AND ITS PERIMETER POINTS RELAX.608
C RELAX.609
DO ISLE=1,NISLE ORH2F403.126
NSEG=ISEG(ISLE) ORH2F403.127
DO N=1,NSEG ORH8F404.278
IS=ISIS(ISLE,N) ORH8F404.279
IE=IEIS(ISLE,N) ORH8F404.280
JS=JSIS(ISLE,N) ORH8F404.281
JE=JEIS(ISLE,N) ORH8F404.282
*IF DEF,MPP ORH2F403.128
c Adjust J indices to be relative to local values for each PE ORH2F403.129
IF ((JST.GT.JE).OR.(JFIN.LT.JS)) THEN ORH8F404.283
c Make sure the J loop doesn't get executed ORH2F403.131
JS = 1 ORH8F404.284
JE = 0 ORH8F404.285
ELSE ORH8F404.286
IF (JST.GT.JS) THEN ORH8F404.287
JS = JST ORH8F404.288
ENDIF ORH8F404.289
IF (JFIN.LT.JE) THEN ORH8F404.290
JE = JFIN ORH8F404.291
ENDIF ORH8F404.292
c Adjust to local versions of indices. ORH2F403.141
JS = JS - J_OFFSET ORH8F404.293
JE = JE - J_OFFSET ORH8F404.294
ENDIF ORH8F404.295
*ENDIF ORH2F403.145
DO J=JS,JE ORH8F404.296
DO I=IS,IE ORH8F404.297
IF (ISMASK(I,J).GE.1) THEN ORH8F404.298
PTD(I,J)=PTD(I,J)+RESIS(ISLE) ORH8F404.299
ENDIF ORH8F404.300
ENDDO ORH8F404.301
ENDDO ORH8F404.302
ENDDO ! Over N ORH8F404.303
ENDDO ! over ISLE ORH2F403.147
ORH1F305.2886
*IF DEF,MPP ORH0F405.7
ELSE ORH0F405.8
! No islands, but we still need the global value ORH0F405.9
! of RESMAX. ORH0F405.10
CALL GC_RMAX(
1,O_NPROC,INFO,RESMAX) ORH0F405.11
*ENDIF ORH0F405.12
ENDIF ! L_OISLANDS = true ORH1F305.2887
ORH1F305.2888
IF (L_OSYMM) THEN ORH1F305.2889
C RELAX.625
C--------------------------------------------------------------------- RELAX.626
C SET SYMMETRY BOUNDARY CONDITION RELAX.627
C--------------------------------------------------------------------- RELAX.628
C RELAX.629
DO I=1,IMT ORH8F404.304
PTD(I,JMT)=-PTD(I,JMTM1) ORH1F305.2891
ENDDO ORH8F404.305
ENDIF ORH1F305.2893
ORH1F305.2894
IF (L_OCYCLIC) THEN ORH1F305.2895
C RELAX.635
C--------------------------------------------------------------------- RELAX.636
C SET CYCLIC BOUNDARY CONDITION RELAX.637
C--------------------------------------------------------------------- RELAX.638
C RELAX.639
DO J=J_1,J_JMT ORH8F404.306
PTD(1,J)=PTD(IMUM1,J) ORH1F305.2897
PTD(IMU,J)=PTD(2,J) ORH1F305.2898
ENDDO ORH8F404.307
ENDIF ORH1F305.2900
C RELAX.645
C--------------------------------------------------------------------- RELAX.646
C TEST MAXIMUM RESIDUAL FOR CONVERGENCE OF THE RELAXATION. RELAX.647
C IF NOT CONVERGED, PROCEED WITH ANOTHER SCAN. RELAX.648
C (..NOTE.. IF THE NUMBER OF SCANS REACHES MXSCAN, LEAVE THE LOOP) RELAX.649
C--------------------------------------------------------------------- RELAX.650
C RELAX.651
IF (MSCAN.EQ.1) THEN ORH2F403.158
SORP=1.0/(1.0-0.5*SORP*MUMSQR) ORH2F403.159
ELSE ORH2F403.160
SORP=1.0/(1.0-0.25*SORP*MUMSQR) ORH2F403.161
ENDIF ORH2F403.162
ORH8F404.308
IF (.NOT.EX1) EX1=(RESMAX.LT.CRTP.OR.MSCAN.GT.MXSCAN) ORH8F404.309
ORH8F404.310
IF (.NOT.EX1) GOTO 300 ORH8F404.311
ORH8F404.312
IF (NWCNT.EQ.0) THEN ORH8F404.313
SOR1=SOR ORH8F404.314
C SOR=1.0 ! This probably slows convergence so remove it ORH8F404.315
ENDIF ORH8F404.316
ORH8F404.317
NWCNT=NWCNT+1 ORH8F404.318
ORH8F404.319
IF (NWCNT.GT.NWMAX.OR.RESMAX.EQ.0.OR. ORH8F404.320
* (NWCNT.GT.10.AND.RESMAX.LT.0.8*CRTP)) EX2=.TRUE. RELAX.665
ORH8F404.321
IF (.NOT.EX2) GO TO 300 ORH8F404.322
ORH8F404.323
IF (SOR.EQ.1.0) SOR=SOR1 ORH8F404.324
C RELAX.669
C======================================================================= RELAX.670
C END OF THE RELAXATION ============================================== RELAX.671
C======================================================================= RELAX.672
C RELAX.673
C--------------------------------------------------------------------- RELAX.674
C UPDATE THE STREAM FUNCTION BASED UPON THE RELAXATION SOLUTION RELAX.675
C TIME FILTERING THE STREAMFUNCTION AT TIME LEVEL TAU RELAX.676
C THE UNFILTERED FIELD HELD ON 'DISK' IS OVERWRITTEN WITH THE RELAX.677
C VALUES FROM THE FILTERED FIELD PB RELAX.678
C--------------------------------------------------------------------- RELAX.679
C RELAX.680
DO J=J_1,J_JMT ORH8F404.325
DO I=1,IMT ORH8F404.326
WORKP(I,J)=PB(I,J)+PTD(I,J) ORH8F404.327
PB(I,J)=PNU2M*P(I,J)+PNU*(PB(I,J)+WORKP(I,J)) ORH8F404.328
P(I,J)=WORKP(I,J) ORH8F404.329
ENDDO ORH8F404.330
ENDDO ORH8F404.331
C RELAX.687
C--------------------------------------------------------------------- RELAX.688
C ON A MIXING TIMESTEP, ALTER PTD TO BE CONSISTENT WITH RELAX.689
C NORMAL, LEAP-FROG STEPPING RELAX.690
C--------------------------------------------------------------------- RELAX.691
C RELAX.692
IF(MIX.NE.0) THEN RELAX.693
FX=2.0 RELAX.694
DO J=J_1,J_JMT ORH8F404.332
DO I=1,IMT ORH8F404.333
PTD(I,J)=FX*PTD(I,J) ORH8F404.334
ENDDO ORH8F404.335
ENDDO ORH8F404.336
ENDIF RELAX.699
ORH1F305.2905
IF (L_OTIMER) CALL TIMER
('RELAX ',4) ORH1F305.2906
ORH1F305.2907
RETURN RELAX.704
END RELAX.705
*ENDIF @DYALLOC.4062