!----------------------------------------------------------------------! ! This POM code has wetting and drying (WAD) capability ! ! ! ! Set nwad=1 for WAD,set =0 to turn off WAD ! ! Set BOTH nwad=0 & nsmolar=0 to recover the original non-WAD POM ! ! ! ! For details see: ! ! ! ! O2005 = Oey [2005; OceanModelling, 9, 133-150] ! ! O2006 = Oey [2006; OceanModelling, 13, 176-195] ! ! O2007 = Oey, Ezer et al [2007; Ocean Dynamics, 57, 205-221] ! ! ! ! or, http://www.aos.princeton.edu/WWWPUBLIC/PROFS/ ! ! also, .../WWWPUBLIC/PROFS/pom98_wad_release_descriptions.html ! ! ! ! For changes that I made, search for the following keyword: ! ! ! !lyo:!wad: or simply "wad:" ! ! !tne:!wad: (changes by T. Ezer to run pom98 seamount case) ! ! ! ! I recommed using "DOUBLE PRECISION (i.e. REAL*8)" option to ! ! compile, with or without WAD; e.g. w/Intel ifort, we use -r8: ! ! ! ! ifort pom98_wad.f -o a.out -r8 ! ! ! ! The -r8 option is the same as specifying -real_size 64 or ! ! -auto_double. However, the code works with or without -r8 ! ! ! ! NOTE: for nsmolar=1, the PARAMETER (IM=???,JM=???) in subroutines! ! advt2d & smol_adif must match that specified in comblk*.h ! ! ! ! Send bugs and/or improvements to: lyo@princeton.edu ! ! ! ! ... l.oey (May/02/2007) ! ! (Jul/24,30/2007) ! ! ! !----------------------------------------------------------------------! C*********************************************************************** C pom98.f for island/seamount problem with eastward flow C (Set SEAMT=.TRUE.) or user provided problem (Set SEAMT= C .FALSE.). C This code contains two versions of S.R. BCOND. Check C the subroutines for details. C --------------------------------------------------------- C --------------------------------------------------------- PROGRAM MAIN C************************************************************************ C TEST WITH SIMPLE FLAT BOTTOMED BASIN * C * C THIS IS A VERSION OF THE THREE DIMENSIONAL, TIME DEPENDENT, * C PRIMITIVE EQUATION, OCEAN MODEL DEVELOPED BY ALLAN BLUMBERG AND ME * C WITH SUBSEQUENT CONTRIBUTIONS BY LEO OEY AND OTHERS. TWO REFERENCES * C ARE: * C * C BLUMBERG, A.F. AND G.L. MELLOR, DIAGNOSTIC AND PROGNOSTIC * C NUMERICAL CIRCULATION STUDIES OF THE SOUTH ATLANTIC BIGHT * C J. GEOPHYS. RES. 88, 4579-4592, 1983. * C * C BLUMBERG, A.F. AND G.L. MELLOR, A DESCRIPTION OF A THREE * C COASTAL OCEAN CIRCULATION MODEL, THREE DIMENSIONAL SHELF * C MODELS, COASTAL AND ESTUARINE SCIENCES, 5, N.HEAPS, ED., * C AMERICAN GEOPHYSICAL UNION, 1987. * C * C IN SUBROUTINE PROFQ THE MODEL MAKES USE OF THE TURBULENCE CLOSURE * C SUB-MODEL MOST RECENTLY DESCRIBED IN: * C * C MELLOR, G.L. AND T. YAMADA, DEVELOPMENT OF A TURBULENCE CLOSURE * C MODEL FOR GEOPHYSICAL FLUID PROBLEMS, REV. GEOPHYS. SPACE PHYS., * C 851-879, 1982. * C * C GEORGE MELLOR, 03/87 * C * C IN THIS VERSION THE HORIZONTAL COORDINATES ARE GENERALIZED CURVI- * C LINEAR ORTHOGANAL COORDINATES AND THE MODEL HAS BEEN CONFIGURED * C TO RUN IN HALF PRECISION (32 BITS ) ON THE CYBER 205. * C TO REDUCE ROUNDOFF ERROR, SALINTIES AND TEMPERATURES ARE REDUCED * C BY 35. AND 10. RESPECTIVELY. 64 BIT PRECISION IS USED LOCALLY * C IN SUBROUTINES DENS (WHEREIN THE T AND S OFFSET HAS BEEN TAKEN * C INTO ACCOUNT) AND PROFT. * C GM, 09/87 * C * C THIS VERSION HAS BEEN CONVERTED TO STANDARD FORTRAN 77 BY STEVE * C BRENNER WITH SOME ADDITIONAL CHANGES BY ME IN PROFQ WHICH IS NOW * C SOMEWHAT SIMPLER. CODE RESTORED TO SINGLE PRECISION. * C A USER'S GUIDE IS AVAILABLE: * C * C MELLOR, G.L., A USER'S GUIDE FOR A THREE-DIMENSIONAL, * C NUMERICAL OCEAN MODEL. PRINCETON UNIVERSITY REPORT, 1990. * C GM, 04/90 * C * C Previous to this date the code was called pmod.f and all changes * C were recorded in pmod.change. Henceforth, the code will be called * C pom.f and changes will be recorded in pom.change. * C GM, 11/92 * C * C THE LAST CODE CHANGE, as recorded in pom.change, was on Sep 12, 2001 * C * C * C Copyright 1996 The Trustees of Princeton University * C * C This program is free software; you can redistribute it and/or * C modify it under the terms of the GNU General Public License * C as published by the Free Software Foundation, either version 2 * C of the License, or (at your option) any later version. * C * C This program is distributed in the hope that it will be useful, * C but WITHOUT ANY WARRANTY; without even the implied warranty of * C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * C GNU General Public License for more details. * C * C A copy of the GNU General Public License is available at * C http://www.gnu.org/copyleft/gpl.html#SEC3 * C or by writing to The Free Software Foundation, Inc., 59 Temple Place * C Suite 330, Boston, MA 02111-1307, USA. * C * C************************************************************************ C !lyo:!wad:Add WAD variables in comblk98_wad.h INCLUDE 'comblk98_wad.h' LOGICAL SEAMT DIMENSION UTB(IM,JM),VTB(IM,JM),UTF(IM,JM),VTF(IM,JM), 1 ADVX(IM,JM,KB),ADVY(IM,JM,KB),ADVUA(IM,JM),ADVVA(IM,JM), 2 TSURF(IM,JM),SSURF(IM,JM), 2 DRHOX(IM,JM,KB),DRHOY(IM,JM,KB),DRX2D(IM,JM),DRY2D(IM,JM), 3 TCLIM(IM,JM,KB),SCLIM(IM,JM,KB),ADX2D(IM,JM),ADY2D(IM,JM), 4 SWRAD(IM,JM) C-------------------------------------------------------------------- REAL ISPI,ISP2I,KAPPA DATA PI/3.141592654/,SMALL/1.E-10/,KAPPA/0.4/ GRAV=9.806 TBIAS=0. SBIAS=0. RHOREF=1025. IINT=0 TIME=0. C SEAMT=.TRUE. !----------------------------------------------------------------------! ! ! !lyo:!wad:For 3-d runs w/rivers (strong stratification) ! ! strong currents can (and physically they should) develop ! ! in thin film of water over nearly dry cells, so dte and ! ! isplit (below) may need to be smaller. For dx~dy~1km, ! ! I have used values as small as DTE=3.0 and ISPLIT=5. ! ! ! ! Note#1: Since alpha=0 when nwad=1 (see below), the corresponding ! ! DTE needs to be smaller than the DTE used for nwad=0. ! ! Note#2: ISPLIT should also be smaller than its value for no WAD; ! ! see Appendix A of Oey [2006; Ocean Modell. 13, 176-195]. ! ! ! ! For example, for the seamount problem that Tal Ezer has tested ! ! (this version), he found that DTE=60 & ISPLIT=30 worked for ! ! nwad=0 but blew up for nwad=1. However, by decreasing ISPLIT ! ! =5->10, the model with nwad=1 works for DTE=20->60, except that ! ! isolated cells w/thin fluid layers (~5cm) appear, surrounded by ! ! cells which are mostly dry; this probably is to be expected for ! ! the relatively large dx&dy >~4km used here. Using smaller DTE=15! ! & ISPLIT=5, or DTE=6 & ISPLIT=10, or DTE=10 & ISPLIT=5 (as used ! ! below) can remove the isolated thin-fluid cells. ! !----------------------------------------------------------------------! DTE=10. ISPLIT=5 c DTE=24. ! works with nowad & HMAX=200m c ISPLIT=30 DAYS=3.0 PRTD1=0.125 ! 3h interval print ISPADV=5 SMOTH=0.10 HORCON=0.2 C N.B.: TPRNI=0. yields zero horizontal diffusivity !! TPRNI=.0 UMOL=2.E-5 MODE=3 NREAD=0 C ISWTCH=100000 IPRTD2=1 C One can create a 'params' file in a runscript to overwrite parameters. C INCLUDE 'params' ! ! !----------------------------------------------------------------------! !lyo:!wad:set nwad=1 for WAD run, =0 to recover non-WAD run with min ! ! depths set at say 10m ! ! ! nwad=1 ! ! !lyo:!wad:set nsmolar=1 if water depth is to be solved by Smolarkiewicz! ! See O2005 or O2006. ! ! NOTE: nwad=1 w/nsmolar=1 may require finer grid AND even a larger! ! hc, below, say hc=0.1 instead of default hc=0.05 ! ! ! nsmolar=0; !nsmolar=nsmolar*nwad ! ! WRITE(6,'('' nwad,nsmolar ='',2i5,/)') nwad,nsmolar !----------------------------------------------------------------------! !lyo:!wad: ! ! ! ! HHI, HMIN & HC (all +ve) are defined as: ! ! ! ! HHI = HIghest water [above MSL] ever expected, this should ! ! be the observed_highest + say 1 meter to make sure; ! ! H = hmin ---> absolute land area [never flooded], FSM=0.0; ! ! H >= hc ---> water depth wrt High water level, FSM=1.0; ! ! ! ! Choose hhi=20 (below) assuming that the highest tide or surge ! ! is not expected to rise above 20m wrt MSL ! ! ! hhi=20.0*float(nwad) hmin=0.01; hc=0.05; hco=hc !hco is used to avoid round- ! hc=hc*1.0001 !off in initial elevation hc=hc*1.01 !tne:!wad:- using a larger ! multiplying factor, "1.01" instead of "1.0001", ! ! can help eliminate singular wet spots due to roundoff! ! ! WRITE(6,'('' hhi,hmin,hc,hco ='',1p4e13.4,/)') hhi,hmin,hc,hco ! ! !----------------------------------------------------------------------! ! ! C-------------------------------------------------------------------------- C Herewith is a list of parameters that are user discretionary. C-------------------------------------------------------------------------- C In comblk98_wad.h C IM, JM, KB = grid dimension C C In MAIN C SEAMT=.T. The ready-to-run seamount probelem will be executed. C SEAMT=.F. Code expects user prepared input for READ(40) which C will overwrite seamount problem. C MODE = 2; 2-D CALCULATION (BOTTOM STRESS CALCULATED IN ADVAVE) C 3; 3-D CALCULATION (BOTTOM STRESS CALCULATED IN PROFU,V) C 4; 3-D CALCULATION WITH T AND S HELD FIXED C DTE = EXTERNAL TIME STEP C DTI = INTERNAL TIME STEP C ISPLIT = DTI/DTE C DAYS = LENGTH OF RUN IN DAYS C PRTD1 = PRINT INTERVAL IN DAYS; AFTER ISWTCH DAYS, PRINT C INTERVAL = IPRTD2 C NREAD=0, NO RESTART INPUT FILE; NREAD=1, RESTART C ISPADV = STEP INTERVAL WHEREIN EXTERNAL MODE ADVECTIVE TERMS ARE C NOT UPDATED C HORCON = CONSTANT IN SMAGORINSKY HORIZONTAL VISCOSITY C TPRNI = HORIZONTAL DIFFUSIVITY/VISCOSITY, INVERSE PRANDTL NUMBER C (see S.R. ADVT) C UMOL = Background viscosity used in S.R. PROFT, PROFU and PROFV. C SMOTH = CONSTANT IN TIME SMOOTHER TO PREVENT SOLUTION SPLITTING C TBIAS, SBIAS = Bias value subtracted from T and S. For 32 bit C arithmetic, setting S=35. and T=10. will reduce C round-off error. C RHOREF=Reference density. For ocean aplications recommended value C is 1025; for fresh water, 1000. C RAMP = Device to slowly ramp up wind stress and baroclinic forcing. C It can be used to eliminate initial inertial oscillations. C However, RAMP is set to a constant 1.0 below and is C therefor disabled. C Z0B = bottom roughness parameter = (Nikuradse equivalent C roughness)/30. Should not be larger than the vertical grid C spacing at the bottom C C In BCOND C HMAX = maximum depth C C In DEPTH C KL1, KL2 = # of logarithmic grid points in surface and bottom C respectively C C In PROFT C NBC = choice of surface boundary conditions C NTP = choice of radiative penetration parameter. C C In SLPMIN C SLMIN = see subroutine C-------------------------------------------------------------------------- DTI=DTE*FLOAT(ISPLIT) DTE2=DTE*2 DTI2=DTI*2 IEND=DAYS*24*3600/DTI+2 IPRINT=PRTD1*24*3600/DTI ISWTCH=ISWTCH*24*3600/INT(DTI) write(6,'(''DAYS ='',F10.2)') DAYS WRITE(6,7030) MODE,DTE,DTI,IEND,ISPLIT,ISPADV,IPRINT,SMOTH, 1 HORCON,TPRNI 7030 FORMAT(//,' MODE =',I3, 1 ' DTE =',F7.2,' DTI =',F9.1,' IEND =',I6, 2 ' ISPLIT =',I6,' ISPADV =',I6,' IPRINT =',I6,/, 3 ' SMOTH =',F7.2,' HORCON =',F7.3,' TPRNI =',F7.3,/) WRITE(6,'('' NREAD ='',I5,//)') NREAD C ISPI=1.E0/FLOAT(ISPLIT) ISP2I=1.E0/(2.E0*FLOAT(ISPLIT)) ! !lyo:!wad:dry-cell T/S relaxation using leapfrog-trapezoidal: dtrat=dti/(0.5*86400.) !1/2 day relaxation time-scale cwetrlx1=(1.-dtrat)/(1.+dtrat); cwetrlx2=2.*dtrat/(1.+dtrat) ! C---------------------------------------------------------------------- C ESTABLISH PROBLEM CHARACTERISTICS C ****** ALL UNITS IN M.K.S. SYSTEM ****** C F,BLANK AND B REFERS TO FORWARD,CENTRAL AND BACKWARD TIME LEVELS. C---------------------------------------------------------------------- IP=IM ISK=2 JSK=2 C C READ IN GRID DATA AND INITIAL AND LATERAL BOUNDARY CONDITIONS C------------------------------------------------------------------------ IF(SEAMT) THEN CALL SEAMOUNT(TSURF,SSURF,TCLIM,SCLIM) write(6,'(''DO SEAMOUNT'')') ELSE REWIND(40) READ(40) KBB,Z,ZZ,DZ,DZZ,IMM,JMM,ALON,ALAT,DX,DY,H,FSM, 1 DUM,DVM,ART,ARU,ARV,COR,TB,SB,UAB,VAB,ELB,ETB,UB,VB, 2 TCLIM,SCLIM,RMEAN,TBE,TBW,TBN,TBS,SBE,SBW,SBN,SBS, 3 UABE,UABW,VABN,VABS,RFE,RFW,RFN,RFS ENDIF TIME0=0. c !lyo:!wad: ! c hkeep(:,:)=h(:,:) !Keep original for plots etc do j=1,jm; do i=1,im hkeep(i,j)=h(i,j) !Keep original for plots etc enddo; enddo ! ! if (nwad.eq.1) then ! ! !lyo:!wad: ! ! The above "H" is wrt MSL at which level H=0, and H<0 for depth ! ! below the MSL, and H>0 for land above the MSL (i.e. for hills ! ! and mountains etc. We now first reverse the sign of H, then ! ! change the reference from MSL to ALB, the Absolute Land Boundary,! ! according to O2006, Fig.1: ! ! ! do j=1,jm; do i=1,im h(i,j)=-h(i,j)+hhi c FSM(I,J)=1.; DUM(I,J)=1.; DVM(I,J)=1. IF(H(I,J).LT.0.0)THEN !Define absolute land areas (never flood): ! temporarily set H=-1.0 (some -ve number) H(I,J)=-1.0; FSM(I,J)=0.; DUM(I,J)=0.; DVM(I,J)=0. ENDIF c enddo; enddo c DO J=1,JM-1; DO I=1,IM IF(FSM(I,J).EQ.0..AND.FSM(I,J+1).NE.0.)DVM(I,J+1)=0. enddo; enddo DO J=1,JM; DO I=1,IM-1 IF(FSM(I,J).EQ.0..AND.FSM(I+1,J).NE.0.)DUM(I+1,J)=0. enddo; enddo ! ! ! The above yields the following definitions for H: ! ! ! H=-1, absolute land areas [never flooded], FSM=0.0, always ! ! H>=0, wet but potentially dry areas, FSM also=1.0, always ! ! ! ! We now define a wetmask, assuming that at t=0, the free surface ! ! is at the MSL (i.e. elevation=0 wrt MSL). If this run does not ! ! begin with time=0 (or if other special free-surface distribution ! ! is desired), then wetmask needs to be redefined or read in e.g. ! ! from a RESTART file, as in below when NREAD.ne.0 ! ! ! do j=1,jm; do i=1,im wetmask(i,j)=fsm(i,j) if (h(i,j).lt.hhi) wetmask(i,j)=0.0 enddo; enddo ! ! ! Finalize definitions of "H": ! ! ! ! H=hmin, absolute land areas [never flooded], FSM=0.0, always ! ! H>=hc, wet but potentially dry areas, FSM also=1.0, always ! ! but wetmask can be 0 or 1 ! ! ! do j=1,jm; do i=1,im if (h(i,j).lt.0.0) then h(i,j)=hmin else h(i,j)=h(i,j)+hc endif enddo; enddo ! ! !lyo:!wad: else !nwad.eq.0 C DO J=1,JM DO I=1,IM H(I,J)=-H(I,J) !MAKE SEA-DEPTH POSITIVE VALUE IF(H(I,J).LE.0.) H(I,J)=0.1 ENDDO ENDDO C DO J=1,JM DO I=1,IM IF(H(I,J).GT.0.1.and.H(I,J).LT.10.0) then H(I,J)=10. !In order to avoid exposure of intertidal flats ENDIF ENDDO ENDDO c C---- If the Depth H(I,J).GT.0.1, then Sea DO J=1,JM DO I=1,IM C DT(I,J)=H(I,J) FSM(I,J)=0.E0 DUM(I,J)=0.E0 DVM(I,J)=0.E0 c IF(H(I,J).GT.0.1) FSM(I,J)=1. c ENDDO ENDDO C DO J=2,JM DO I=2,IM DUM(I,J)=FSM(I,J)*FSM(I-1,J) DVM(I,J)=FSM(I,J)*FSM(I,J-1) ENDDO ENDDO C C !lyo:!wad: ! do j=1,jm; do i=1,im wetmask(i,j)=fsm(i,j) enddo; enddo ! endif !if (nwad.eq.1) then... ! ! !lyo:!wad: ! ! Print to check: ! CALL PRXY(' Read-in H ',TIME, Hkeep(1,1),IM,1,JM,1,0.0) CALL PRXY(' H ',TIME, H(1,1),IM,1,JM,1,0.0) CALL PRXY(' FSM ',TIME, FSM(1,1),IM,1,JM,1,1.0) CALL PRXY(' WETMASK ',TIME, WETMASK(1,1),IM,1,JM,1,1.0) do j=1,jm; do i=1,im tps(i,j)=FSM(i,j)-WETMASK(i,j) enddo; enddo CALL PRXY('FSM-WETMASK',TIME,tps(1,1),IM,1,JM,1,1.0) c if (nwad.eq.0) then do j=1,jm; do i=1,im if (fsm(i,j).ne.wetmask(i,j)) then WRITE(6,'('' Stopped, nwad ='',i4)') nwad WRITE(6,'('' fsm.ne.wetmask @ (i,j) ='',2i4,/)') i,j c stop c endif enddo; enddo endif !----------------------------------------------------------------------! DO 51 J=1,JM DO 51 I=1,IM ELB(I,J)=0.0 ETB(I,J)=0.0 ! ! !----------------------------------------------------------------------! !lyo:!wad:Note elevation is always <=0, measured downward from ALB ! ! ! ! Set initial elevation to be flat MSL in wet regions, but set ! ! initial elevation s.t. total water depth = H+ELB=HC in regions ! ! where wetmask indicates dry but not land ! ! ! ELB(I,J)=-hhi*fsm(i,j) !lyo:!wad:note:The following "if" is not satisfied if nwad=0 since ! ! then fsm=wetmask at all cells ! ! if (fsm(i,j).ne.0.0.and.wetmask(i,j).eq.0.0) ! dry but not land if (fsm(i,j).ne.wetmask(i,j)) ! dry but not land &elb(i,j)=-h(i,j)+hco !note slightly smaller hco U* E U E U E . . U E U E U E . . U E U E U E +--V--+--V--+--V-- . +--V--+--V--+--V-- . +--V--+--V--+--V- +--V--+--V--+--V-- . +--V--+--V--+--V-- . +--V--+--V--+--V- U* E U E U E . . U E U E U E . . U E U E U E +--V*-+--V*-+--V*- . +--V*-+--V*-+--V*- . +--V*-+--V*-+--V* >> C THIS WRITES A 2-D FIELD C TIME=TIME IN DAYS C A = ARRAY(IM,JM) TO BE PRINTED C ISKP=PRINT SKIP FOR I C JSKP=PRINT SKIP FOR J C SCALE=DIVISOR FOR VALUES OF A C C IMPLICIT HALF PRECISION (A-H,O-Z) DIMENSION A(IM,JM),NUM(150),LINE(150) CHARACTER LABEL*(*) DATA ZERO /1.E-12/ C SCALE=SCALA IF (SCALE.GT.ZERO) GO TO 160 AMX=ZERO DO 150 J=1,JM,JSKP DO 150 I=1,IM,ISKP AMX=MAX(ABS(A(I,J)),AMX) 150 CONTINUE IF(AMX.EQ.0.) THEN SCALEI=0. GOTO 165 ENDIF SCALE=10.E0**(INT(LOG10(AMX)+1.E2)-103) 160 CONTINUE SCALEI=1.E0/SCALE 165 CONTINUE WRITE(6,170) LABEL 170 FORMAT(1X,A40) WRITE(6,180) TIME,SCALE 180 FORMAT(' TIME =',F9.4,' DAYS MULTIPLY ALL VALUES BY',1PE9.2) DO 190 I=1,IM 190 NUM(I)=I IB=1 C 200 CONTINUE IE=IB+23*ISKP IF(IE.GT.IM) IE=IM WRITE(6,210) (NUM(I),I=IB,IE,ISKP) 210 FORMAT(/,2X,24I5,/) DO 260 J=1,JM,JSKP JWR=JM+1-J DO 220 I=IB,IE,ISKP 220 LINE(I)=INT(SCALEI*A(I,JWR)) WRITE(6,240) JWR,(LINE(I),I=IB,IE,ISKP) 240 FORMAT(1X,I3,24I5) 260 CONTINUE WRITE(6,280) 280 FORMAT(//) IF(IE.GE.IM) RETURN IB=IB+24*ISKP GO TO 200 END SUBROUTINE PRXYZ (LABEL,TIME,A,IM,ISKP,JM,JSKP,KB,SCALA) C >>> C C THIS WRITES HORIZONTAL LAYERS OF A 3-D FIELD C TIME=TIME IN DAYS C A = ARRAY(IM,JM,KB) TO BE PRINTED C ISKP=PRINT SKIP FOR I C JSKP=PRINT SKIP FOR J C SCALE=DIVISOR FOR VALUES OF A C PARAMETER (KE=4) DIMENSION A(IM,JM,KB),NUM(150),LINE(150),KP(KE) CHARACTER LABEL*(*) DATA KP /1,2,7,14/ DATA ZERO /1.E-10/ KP(3)=KB/2 KP(4)=KB-1 C SCALE=SCALA IF (SCALE.GT.ZERO) GO TO 150 AMX=ZERO DO 140 KM=1,KE K=KP(KM) DO 140 J=1,JM,JSKP DO 140 I=1,IM,ISKP AMX=MAX(ABS(A(I,J,K)),AMX) 140 CONTINUE IF(AMX.EQ.0.) THEN SCALEI=0. GOTO 165 ENDIF SCALE=10.E0**(INT(LOG10(AMX)+1.E2)-103) 150 CONTINUE SCALEI=1.E0/SCALE 165 CONTINUE WRITE(6,160) LABEL 160 FORMAT(1X,A40) WRITE(6,170) TIME,SCALE 170 FORMAT(' TIME = ',F9.4,' DAYS MULTIPLY ALL VALUES BY',1PE10.3) DO 180 I=1,IM 180 NUM(I)=I C DO 500 KM=1,KE K=KP(KM) WRITE(6,190) K 190 FORMAT(3X,/7H LAYER ,I2) IB=1 C 200 CONTINUE IE=IB+23*ISKP IF(IE.GT.IM) IE=IM WRITE(6,220) (NUM(I),I=IB,IE,ISKP) 220 FORMAT(/,2X,24I5,/) DO 260 J=1,JM,JSKP JWR=JM+1-J DO 230 I=IB,IE,ISKP 230 LINE(I)=INT(SCALEI*A(I,JWR,K)) WRITE(6,240) JWR,(LINE(I),I=IB,IE,ISKP) 240 FORMAT(1X,I3,24I5) 260 CONTINUE WRITE(6,280) 280 FORMAT(//) IF(IE.GE.IM) GO TO 500 IB=IB+24*ISKP GO TO 200 500 CONTINUE RETURN END C SUBROUTINE SLPMIN(H,IM,JM,FSM,SL) DIMENSION H(IM,JM),FSM(IM,JM) DIMENSION SL(IM,JM) C This subroutine limits the maximum difference in H divided C by twice the average of H of adjacent cells. C The maximum possible value is unity. C SLMIN=0.2 C DO 100 LOOP=1,10 C sweep right DO 3 J=2,JM-1 DO 1 I=2,IM-1 IF(FSM(I,J).EQ.0..OR.FSM(I+1,J).EQ.0.) GOTO 1 SL(I,J)=ABS(H(I+1,J)-H(I,J))/(H(I,J)+H(I+1,J)) IF(SL(I,J).LT.SLMIN) GOTO 1 DH=0.5*(SL(I,J)-SLMIN)*(H(I,J)+H(I+1,J)) SN=-1. IF(H(I+1,J).GT.H(I,J)) SN=1. H(I+1,J)=H(I+1,J)-SN*DH H(I,J)=H(I,J)+SN*DH 1 CONTINUE C sweep left DO 2 I=IM-1,2,-1 IF(FSM(I,J).EQ.0..OR.FSM(I+1,J).EQ.0.) GOTO 2 SL(I,J)=ABS(H(I+1,J)-H(I,J))/(H(I,J)+H(I+1,J)) IF(SL(I,J).LT.SLMIN) GOTO 2 DH=0.5*(SL(I,J)-SLMIN)*(H(I,J)+H(I+1,J)) SN=-1. IF(H(I+1,J).GT.H(I,J)) SN=1. H(I+1,J)=H(I+1,J)-SN*DH H(I,J)=H(I,J)+SN*DH 2 CONTINUE 3 CONTINUE C sweep up DO 13 I=2,IM-1 DO 11 J=2,JM-1 IF(FSM(I,J).EQ.0..OR.FSM(I,J+1).EQ.0.) GOTO 11 SL(I,J)=ABS(H(I,J+1)-H(I,J))/(H(I,J)+H(I,J+1)) IF(SL(I,J).LT.SLMIN) GOTO 11 DH=0.5*(SL(I,J)-SLMIN)*(H(I,J)+H(I,J+1)) SN=-1. IF(H(I,J+1).GT.H(I,J)) SN=1. H(I,J+1)=H(I,J+1)-SN*DH H(I,J)=H(I,J)+SN*DH 11 CONTINUE C sweep down DO 12 J=JM-1,2,-1 IF(FSM(I,J).EQ.0..OR.FSM(I,J+1).EQ.0.) GOTO 12 SL(I,J)=ABS(H(I,J+1)-H(I,J))/(H(I,J)+H(I,J+1)) IF(SL(I,J).LT.SLMIN) GOTO 12 DH=0.5*(SL(I,J)-SLMIN)*(H(I,J)+H(I,J+1)) SN=-1. IF(H(I,J+1).GT.H(I,J)) SN=1. H(I,J+1)=H(I,J+1)-SN*DH H(I,J)=H(I,J)+SN*DH 12 CONTINUE 13 CONTINUE C 100 CONTINUE RETURN END C SUBROUTINE PRXZ(LABEL,TIME,A,IM,ISKP,JM,J1,J2,KB,SCALA,DT,ZZ) DIMENSION A(IM,JM,KB),NUM(100),LINE(100),IDT(100), 1 ZZ(KB),DT(IM,JM) CHARACTER LABEL*(*) DATA ZERO/1.E-10/ C C THIS SUBROUTINE WRITES VERTICAL SECTIONS OF A 3-D FIELD C C TIME=TIME IN DAYS C A= ARRAY(IM,JM,KB) TO BE PRINTED C ISPL=PRINT SKIP FOR I C JSPL=PRINT SKIP FOR J C SCALE=DIVISOR FOR VALUES OF A C SCALE=SCALA IF (SCALE.GT.ZERO) GO TO 150 AMX=ZERO DO 140 K=1,KB DO 140 J=1,JM DO 140 I=1,IM,ISKP AMX=MAX(ABS(A(I,J,K)),AMX) 140 CONTINUE IF(AMX.EQ.0.) THEN SCALEI=0. GOTO 165 ENDIF SCALE=10.E0**(INT(LOG10(AMX)+1.E2)-103) 150 CONTINUE SCALEI=1./SCALE 165 CONTINUE WRITE(6,9980) LABEL 9980 FORMAT(' ',A30) WRITE(6,9981) TIME,SCALE 9981 FORMAT(' TIME = ',F9.3,' DAYS MULTIPLY ALL VALUES BY ',1PE8.2) C23456 | | | | | | | xxxxxxx| DO 10 JPP=1,2 J=J1 IF(JPP.EQ.2) J=J2 IF(J.EQ.0) RETURN WRITE(6,30) J 30 FORMAT(3X,/' SECTION J =',I3) IB=1 IE=IB+23*ISKP 50 CONTINUE IF(IE.GT.IM) IE=IM DO 100 I=IB,IE,ISKP IDT(I)=DT(I,J) 100 NUM(I)=I WRITE(6,9990) (NUM(I),I=IB,IE,ISKP) 9990 FORMAT(/,' I = ',24I5,/) WRITE(6,9991) (IDT(I),I=IB,IE,ISKP) 9991 FORMAT(8X,'D =',24I5.0,/,' ZZ ') DO 200 K=1,KB DO 190 I=IB,IE,ISKP 190 LINE(I)=SCALEI*A(I,J,K) WRITE(6,9966) K,ZZ(K),(LINE(I),I=IB,IE,ISKP) 9966 FORMAT(1X,I2,2X,F6.3,24I5) 200 CONTINUE WRITE(6,9984) IF(IE.EQ.IM) GO TO 10 IB=IB+24*ISKP IE=IB+23*ISKP GO TO 50 9984 FORMAT(//) 10 CONTINUE RETURN END C SUBROUTINE PRYZ(LABEL,TIME,A,IM,ISKP,JM,JSKP,KB,SCALA,DT,ZZ) DIMENSION A(IM,JM,KB),NUM(200),PLINE(200),DT(IM,JM),ZZ(KB) DIMENSION IP(2) CHARACTER LABEL*(*) DATA ZERO/1.E-10/ IP(1)=IM/2 IP(2)=IM-3 C C THIS SUBROUTINE WRITES VERTICAL SECTIONS OF A 3-D FIELD C C TIME=TIME IN DAYS C A= ARRAY(IM,JM,KB) TO BE PRINTED C ISPL=PRINT SKIP FOR I C JSPL=PRINT SKIP FOR J C SCALE=DIVISOR FOR VALUES OF A C SCALE=SCALA IF (SCALE.GT.ZERO) GO TO 150 AMX=ZERO DO 140 K=1,KB DO 140 J=1,JM,JSKP DO 140 I=1,IM,ISKP AMX=MAX(ABS(A(I,J,K)),AMX) 140 CONTINUE IF(AMX.EQ.0.) THEN SCALEI=0. GOTO 165 ENDIF SCALE=10.E0**(INT( LOG10(AMX)+1.E2)-103) 150 CONTINUE SCALEI=1./SCALE 165 CONTINUE WRITE(6,9980) LABEL 9980 FORMAT(' ',A30) WRITE(6,9981) TIME,SCALE 9981 FORMAT(' TIME = ',F8.2,' MULTIPLY ALL VALUES BY',E8.2) DO 10 IPP=1,2 I=IP(IPP) WRITE(6,30) I 30 FORMAT(3X,/' SECTION I =',I3) JB=1 JE=JB+23*JSKP 50 CONTINUE IF(JE.GT.JM) JE=JM DO 100 J=JB,JE,JSKP 100 NUM(J)=J WRITE(6,9990) (NUM(J),J=JB,JE,JSKP) 9990 FORMAT(/,' J = ',24I5,/) WRITE(6,9991) (DT(I,J),J=JB,JE,JSKP) 9991 FORMAT(7X,'D =',24F5.0,/,' ZZ ') DO 200 K=1,KB DO 190 J=JB,JE,JSKP 190 PLINE(J)=SCALEI*A(I,J,K) WRITE(6,9966) K,ZZ(K),(PLINE(J),J=JB,JE,JSKP) 9966 FORMAT(1X,I2,2X,F6.3,24(F5.1)) 200 CONTINUE WRITE(6,9984) IF(JE.EQ.JM) GO TO 10 JB=JB+24*JSKP JE=JB+23*JSKP GO TO 50 9984 FORMAT(//) 10 CONTINUE RETURN END SUBROUTINE SEAMOUNT(TSURF,SSURF,TCLIM,SCLIM) INCLUDE 'comblk98_wad.h' DIMENSION X(IM),Y(JM) DIMENSION TSURF(IM,JM),SSURF(IM,JM), 1 TCLIM(IM,JM,KB),SCLIM(IM,JM,KB) DATA PI/3.141592654/,SMALL/1.E-10/ C SET UP GRID AND INITIAL CONDITIONS FOR STAND-ALONE TEST RUN C For an island, DELH > 1.0; for a seamount DELH < 1.0. !lyo:!wad:Use finer grid for nsmolar=1 DELX=8.0E3 !=4.E3 nvar=1 !=1 for variable grid; =0 otherwise if (nvar.eq.0) delx=delx*0.5 ! c DELH=0.9 ! seamount DELH=1.15 ! island (for wad) c RA=25.E3 ! narrow RA=50.E3 ! wideer (for wad) c H0=4500. ! deep open ocean H0= 50. ! shallow (for wad) - update HMAX in BCOND C Flow magnitude VEL=0.2 CALL DEPTH(Z,ZZ,DZ,DZZ,KB) DO 12 J=1,JM DO 12 I=1,IM C Constant DX, DY. C C Variable DX, DY. DX(I,J)=DELX-DELX/2.*SIN(PI*FLOAT(I)/FLOAT(IM))*float(nvar) DY(I,J)=DELX-DELX/2.*SIN(PI*FLOAT(J)/FLOAT(JM))*float(nvar) ART(I,J)=DX(I,J)*DY(I,J) COR(I,J)=1.E-4 12 CONTINUE X(1)=0. DO I=2,IM X(I)=X(I-1)+DX(I-1,1) ENDDO Y(1)=0. DO J=2,JM Y(J)=Y(J-1)+DY(1,J-1) ENDDO C C Define depth: C !tne:!wad:!lyo:!wad: ! Note that unlike original seamount, H<0 is now water below MSL, and ! H>0 is above the MSL and is either land (if h>hland, see below) ! or is potential wet-and-dry region ! (MAIN will reverse these to make "h" comparible w/POM) ! hland=5.e0 !note all pnts are potential WAD if we set !hland >= -h0*(1.e0-delh) (=7.5m) ! DO I=1,IM DO J=1,JM H(I,J)=(-1.)*H0*(1.-DELH*EXP(- 1 ((X(I)-X((IM+1)/2))**2+(Y(J)-Y((JM+1)/2))**2)/RA**2) ) c !lyo:!wad:!slpmin: CALL SLPMIN, here before WAD redefinitions ! !lyo:!wad:Make region near top of seamount absolute land region: if(h(i,j).gt.hland) h(i,j)=hhi+1.e0 ! ENDDO !tne:!wad: Close the north and south boundaries to form a channel. H(I,1)=1.+hhi H(I,JM)=1.+hhi ENDDO DO 13 J=2,JM DO 13 I=2,IM ARU(I,J)=.25*(DX(I,J)+DX(I-1,J))*(DY(I,J)+DY(I-1,J)) 13 ARV(I,J)=.25*(DX(I,J)+DX(I,J-1))*(DY(I,J)+DY(I,J-1)) DO 121 J=1,JM ARU(1,J)=ARU(2,J) ARV(1,J)=ARV(2,J) 121 CONTINUE DO 122 I=1,IM ARU(I,1)=ARU(I,2) ARV(I,1)=ARV(I,2) 122 CONTINUE C C IP=IM ISK=2 JSK=2 C CALL PRXY(' TOPOGRAPHY 1 ',TIME, H,IP,ISK,JM,JSK,10.) C DO J=1,JM DO I=1,IM !lyo:wad:DT is not used, so delete/comment-out the following line: !lyo:wad: DT(I,J)=abs(H(I,J)) !tne:!wad: FSM(I,J)=0. DUM(I,J)=0. DVM(I,J)=0. !lyo:wad:we define absolute land grid-cells fsm=0.0 above and also ! potential WAD cells fsm=1.0 below to "go-along" with ! this old seamount subroutine; the correct masks together ! with wet/dry mask will be defined later in MAIN !lyo:wad: IF(abs(H(I,J)).GT.1.) FSM(I,J)=1. !tne:!wad: IF(H(I,J).LT.hhi) FSM(I,J)=1. ENDDO ENDDO DO J=2,JM DO I=2,IM DUM(I,J)=FSM(I,J)*FSM(I-1,J) DVM(I,J)=FSM(I,J)*FSM(I,J-1) ENDDO ENDDO ! ! !----------------------------------------------------------------------! !lyo:!wad:Note that if it is necessary to adjust "H" with SLPMIN ! ! then better do the adjustments above right after the bathymetry ! ! is defined (search backward !slpmin:), BUT before the subsequent ! ! WAD definitions ! !----------------------------------------------------------------------! ! ! C C Adjust bottom topography so that cell to cell variations C in H do not exceed parameter that is set in SLPMIN C C CALL SLPMIN (H,IM,JM,FSM,TPS) C C--------------------------------------------------------------------- C Set initial conditions for seamount problem. C--------------------------------------------------------------------- DO 15 K=1,KBM1 DO 15 J=1,JM DO 15 I=1,IM !lyo:wad: ! TB(I,J,K)=5.+15.*EXP(ZZ(K)*H(I,J)/1000.)-TBIAS !original code if (h(i,j).le.0.0) then !lyo:wad:stratified water below MSL: TB(I,J,K)=5.+15.*EXP(ZZ(K)*(-H(I,J))/1000.) else !lyo:wad:well-mixed water above MSL: TB(I,J,K)=5.+15. endif TB(I,J,K)=TB(I,J,K)-TBIAS ! SB(I,J,K)=35.0-SBIAS TCLIM(I,J,K)=TB(I,J,K) SCLIM(I,J,K)=SB(I,J,K) UB(I,J,K)=VEL*DUM(I,J) VB(I,J,K)=0. AAM(I,J,K)=500. 15 CONTINUE C CALL DENS(SB,TB,RHO) C C In this application, the initial condition for density is C a function of z (cartesian). When this is not so, make sure C that RMEAN has been area averaged before transfer to sigma C coordinates. DO 50 K=1,KBM1 DO 50 J=1,JM DO 50 I=1,IM 50 RMEAN(I,J,K)=RHO(I,J,K) DO 16 J=1,JM DO 16 I=1,IM TSURF(I,J)=TB(I,J,1) 16 SSURF(I,J)=SB(I,J,1) DO 51 J=1,JM DO 51 I=1,IM UAB(I,J)=VEL*DUM(I,J) VAB(I,J)=0. ELB(I,J)=0.0 ETB(I,J)=0.0 AAM2D(I,J)=AAM(I,J,1) 51 CONTINUE C------------------------------------------------ C Set lateral boundary conditions for use in S.R.BCOND. C In the seamount problem the east and west BCs are open C whereas the south and north BCs are closed through specification C of the masks, FSM, DUM and DVM. C------------------------------------------------ RFE=1. ! =0 for no radiation BC only UA RFW=1. RFN=0. RFS=0. ELE(1)=0. ELW(1)=0. DO 60 J=2,JMM1 UABW(J)=UAB(2,J) UABE(J)=UAB(IMM1,J) C Set geostrophically conditioned elevations at the boundaries. ELE(J)=ELE(J-1)-COR(IMM1,J)*UAB(IMM1,J)/GRAV*DY(IMM1,J-1) ELW(J)=ELW(J-1)-COR(2,J)*UAB(2,J)/GRAV*DY(2,J-1) 60 CONTINUE C Adjust boundary elevations so they are zero in the middle C of the channel. ELEJMID=ELE(JMM1/2) ELWJMID=ELW(JMM1/2) DO 61 J=2,JMM1 ELE(J)=(ELE(J)-ELEJMID)*FSM(IM,J) ELW(J)=(ELW(J)-ELWJMID)*FSM(2,J) 61 CONTINUE !tne:!wad:- for wad DO 62 I=1,IM ELN(I)=0.-hhi ELS(I)=0.-hhi 62 CONTINUE !tne:!wad:- for wad DO 63 J=1,JM ELE(J)=(ELE(J)-hhi)*FSM(IM,J) ELW(J)=(ELW(J)-hhi)*FSM(2,J) 63 CONTINUE C C******************************************************************** C For the seamount and (other possible applications) lateral C thermodynamic boundary conditions are set equal to the initial conditions C and are held constant thereafter. Users can of course create varable C boundary conditions. C******************************************************************** DO K=1,KBM1 DO J=1,JM TBE(J,K)=TB(IM,J,K) TBW(J,K)=TB(1,J,K) SBE(J,K)=SB(IM,J,K) SBW(J,K)=SB(1,J,K) ENDDO DO I=1,IM TBN(I,K)=TB(I,JM,K) TBS(I,K)=TB(I,1 ,K) SBN(I,K)=SB(I,JM,K) SBS(I,K)=SB(I,1 ,K) ENDDO ENDDO RETURN END c SUBROUTINE VERTVL(DTI2) INCLUDE 'comblk98_wad.h' DIMENSION XFLUX(IM,JM,KB),YFLUX(IM,JM,KB) EQUIVALENCE (XFLUX,A),(YFLUX,C) C C C CALCULATE NEW VERTICAL VELOCITY C C REESTABLISH BOUNDARY CONDITIONS DO 100 K=1,KBM1 DO 100 J=2,JM DO 100 I=2,IM 100 XFLUX(I,J,K) 1 =.25E0*(DY(I,J)+DY(I-1,J))*(DT(I,J)+DT(I-1,J))*U(I,J,K) DO 120 K=1,KBM1 DO 120 J=2,JM DO 120 I=1,IM 120 YFLUX(I,J,K) 1 =.25E0*(DX(I,J)+DX(I,J-1))*(DT(I,J)+DT(I,J-1))*V(I,J,K) C DO 125 J=1,JM DO 125 I=1,IM 125 W(I,J,1)=0.E0 DO 710 K=1,KBM1 DO 710 J=2,JMM1 DO 710 I=2,IMM1 710 W(I,J,K+1)=W(I,J,K) 1 +DZ(K)*((XFLUX(I+1,J,K)-XFLUX(I,J,K) 2 +YFLUX(I,J+1,K)-YFLUX(I,J,K))/(DX(I,J)*DY(I,J)) 3 +(ETF(I,J)-ETB(I,J))/DTI2 ) RETURN END !----------------------------------------------------------------------! !lyo:!wad:Additional subroutines used by WAD: ! ! ! cwetdry391d_dam02:2-d version of Smolarkiewicz from /home/lyo/pom/pom2k/ c pom2k.f's subroutine advt2 c This version gets rid of common block [i.e. the routine is now c self-contained] and also 2-d calculation [solve for D]: c c d(D)/dt + d(UD)/dx + d(VD)/dy = Diffusion_of_(D) c cwetdry391d_dam02: c-- subroutine advt2(fb,f,fclim,ff,xflux,yflux,nitera,sw) subroutine advt2d(fb,f,ff,nitera,sw,dx,dy,u,v,art,aru,arv, 1 fsm,dum,dvm,aam,dti2) c 1 fsm,dum,dvm,aam,dti2,im,jm) C ********************************************************************** C * * C * FUNCTION : Integrates conservative scalar equations. * C * * C * This is a first-order upstream scheme, which * C * reduces implicit diffusion using the Smolarkiewicz * C * iterative upstream scheme with an antidiffusive * C * velocity. * C * * C * It is based on the subroutines of Gianmaria Sannino * C * (Inter-university Computing Consortium, Rome, Italy)* C * and Vincenzo Artale (Italian National Agency for * C * New Technology and Environment, Rome, Italy), * C * downloaded from the POM FTP site on 1 Nov. 2001. * C * The calculations have been simplified by removing * C * the shock switch option. It should be noted that * C * this implementation does not include cross-terms * C * which are in the original formulation. * C * * C * fb,f,fclim,ff . as used in subroutine advt1 * C * xflux,yflux ... working arrays used to save memory * C * nitera ........ number of iterations. This should * C * be in the range 1 - 4. 1 is * C * standard upstream differencing; * C * 3 adds 50% CPU time to POM. * C * sw ............ smoothing parameter. This should * C * preferably be 1, but 0 < sw < 1 * C * gives smoother solutions with less * C * overshoot when nitera > 1. * C * * C * Reference: * C * * C * Smolarkiewicz, P.K.; A fully multidimensional * C * positive definite advection transport algorithm * C * with small implicit diffusion, Journal of * C * Computational Physics, 54, 325-362, 1984. * C * * C ********************************************************************** C implicit none C real sw,dti2 integer nitera,im,jm c !lyo:!wad:Use finer grid for nsmolar=1 PARAMETER (IM=65,JM=49) !dx=0.1 ! PARAMETER (IM=131,JM=99) c real fb(im,jm),f(im,jm),ff(im,jm) real dx(im,jm),dy(im,jm),u(im,jm),v(im,jm),aam(im,jm) real fsm(im,jm),dum(im,jm),dvm(im,jm) real art(im,jm),aru(im,jm),arv(im,jm) c integer ix,jx c PARAMETER (IX=62,JX=18) real xflux(im,jm),yflux(im,jm) real fbmem(im,jm) real xmassflux(im,jm),ymassflux(im,jm) integer i,j,k,itera,imm1,jmm1 C C Calculate horizontal mass fluxes: C imm1=im-1; jmm1=jm-1 c do j=1,jm do i=1,im xmassflux(i,j)=0.e0 ymassflux(i,j)=0.e0 end do end do C do j=2,jmm1 do i=2,im xmassflux(i,j)=0.5e0*(dy(i-1,j)+dy(i,j))*u(i,j) end do end do C do j=2,jm do i=2,imm1 ymassflux(i,j)=0.5e0*(dx(i,j-1)+dx(i,j))*v(i,j) end do end do C do j=1,jm do i=1,im fbmem(i,j)=fb(i,j) end do end do C C Start Smolarkiewicz scheme: C do itera=1,nitera C C Upwind advection scheme: C do j=2,jm do i=2,im xflux(i,j)=0.5e0 $ *((xmassflux(i,j)+abs(xmassflux(i,j))) $ *fbmem(i-1,j)+ $ (xmassflux(i,j)-abs(xmassflux(i,j))) $ *fbmem(i,j)) C yflux(i,j)=0.5e0 $ *((ymassflux(i,j)+abs(ymassflux(i,j))) $ *fbmem(i,j-1)+ $ (ymassflux(i,j)-abs(ymassflux(i,j))) $ *fbmem(i,j)) end do end do C C Add net advective fluxes and step forward in time: C do j=2,jmm1 do i=2,imm1 ff(i,j)=xflux(i+1,j)-xflux(i,j) $ +yflux(i,j+1)-yflux(i,j) ff(i,j)=(fbmem(i,j)*art(i,j) $ -dti2*ff(i,j))/(art(i,j)) end do end do C C Calculate antidiffusion velocity: C call smol_adif(xmassflux,ymassflux,ff,sw,fsm,aru,arv,dti2) c call smol_adif(xmassflux,ymassflux,ff,sw,fsm,aru,arv,dti2,im,jm) C do j=1,jm do i=1,im fbmem(i,j)=ff(i,j) end do end do C C End of Smolarkiewicz scheme C end do C C Add horizontal diffusive fluxes: C do j=2,jm do i=2,im xmassflux(i,j)=0.5e0*(aam(i,j)+aam(i-1,j)) ymassflux(i,j)=0.5e0*(aam(i,j)+aam(i,j-1)) end do end do C do j=2,jm do i=2,im xflux(i,j)=-xmassflux(i,j) $ *(fb(i,j)-fb(i-1,j))*dum(i,j) $ *(dy(i,j)+dy(i-1,j))/(dx(i,j)+dx(i-1,j)) yflux(i,j)=-ymassflux(i,j) $ *(fb(i,j)-fb(i,j-1))*dvm(i,j) $ *(dx(i,j)+dx(i,j-1))/(dy(i,j)+dy(i,j-1)) end do end do C C Add net horizontal fluxes and step forward in time: C do j=2,jmm1 do i=2,imm1 ff(i,j)=ff(i,j)-dti2*(xflux(i+1,j)-xflux(i,j) $ +yflux(i,j+1)-yflux(i,j)) $ /(art(i,j)) end do end do C return C end C C subroutine smol_adif(xmassflux,ymassflux,ff,sw,fsm,aru,arv,dti2) c subroutine smol_adif(xmassflux,ymassflux,ff,sw,fsm,aru,arv,dti2, c 1 im,jm) C ********************************************************************** C * * C * FUNCTION : Calculates the antidiffusive velocity used to * C * reduce the numerical diffusion associated with the * C * upstream differencing scheme. * C * * C * This is based on a subroutine of Gianmaria Sannino * C * (Inter-university Computing Consortium, Rome, Italy)* C * and Vincenzo Artale (Italian National Agency for * C * New Technology and Environment, Rome, Italy), * C * downloaded from the POM FTP site on 1 Nov. 2001. * C * The calculations have been simplified by removing * C * the shock switch option. * C * * C ********************************************************************** C implicit none C integer im,jm c !lyo:!wad:Use finer grid for nsmolar=1 PARAMETER (IM=65,JM=49) !dx=0.1 ! PARAMETER (IM=131,JM=99) c real ff(im,jm) real xmassflux(im,jm),ymassflux(im,jm) real fsm(im,jm),aru(im,jm),arv(im,jm) real sw,dti2 real mol,abs_1,abs_2 real value_min,epsilon real udx,u2dt,vdy,v2dt,wdz,w2dt integer i,j,k,imm1,jmm1 C parameter (value_min=1.e-9,epsilon=1.0e-14) C c imm1=im-1; jmm1=jm-1 c C Apply temperature and salinity mask: C do i=1,im do j=1,jm ff(i,j)=ff(i,j)*fsm(i,j) end do end do C C Recalculate mass fluxes with antidiffusion velocity: C do j=2,jmm1 do i=2,im if(ff(i,j).lt.value_min.or. $ ff(i-1,j).lt.value_min) then xmassflux(i,j)=0.e0 else udx=abs(xmassflux(i,j)) u2dt=dti2*xmassflux(i,j)*xmassflux(i,j) $ /(aru(i,j)) mol=(ff(i,j)-ff(i-1,j)) $ /(ff(i-1,j)+ff(i,j)+epsilon) xmassflux(i,j)=(udx-u2dt)*mol*sw abs_1=abs(udx) abs_2=abs(u2dt) if(abs_1.lt.abs_2) xmassflux(i,j)=0.e0 end if end do end do C do j=2,jm do i=2,imm1 if(ff(i,j).lt.value_min.or. $ ff(i,j-1).lt.value_min) then ymassflux(i,j)=0.e0 else vdy=abs(ymassflux(i,j)) v2dt=dti2*ymassflux(i,j)*ymassflux(i,j) $ /(arv(i,j)) mol=(ff(i,j)-ff(i,j-1)) $ /(ff(i,j-1)+ff(i,j)+epsilon) ymassflux(i,j)=(vdy-v2dt)*mol*sw abs_1=abs(vdy) abs_2=abs(v2dt) if(abs_1.lt.abs_2) ymassflux(i,j)=0.e0 end if end do end do C return C end ! ! !lyo:!wad:END of Additional subroutines used by WAD. ! !----------------------------------------------------------------------! ! !