[3] | 1 | !!---------------------------------------------------------------------- |
---|
| 2 | !! *** domzgr.s.h90 *** |
---|
| 3 | !!---------------------------------------------------------------------- |
---|
| 4 | |
---|
| 5 | #if defined key_s_coord |
---|
| 6 | !!---------------------------------------------------------------------- |
---|
| 7 | !! 'key_s_coord' : s-coordinate |
---|
| 8 | !!---------------------------------------------------------------------- |
---|
| 9 | |
---|
| 10 | SUBROUTINE zgr_s |
---|
| 11 | !!---------------------------------------------------------------------- |
---|
| 12 | !! *** ROUTINE zgr_s *** |
---|
| 13 | !! |
---|
| 14 | !! ** Purpose : define the s-coordinate system |
---|
| 15 | !! |
---|
| 16 | !! ** Method : s-coordinate |
---|
| 17 | !! The depth of model levels is defined as the product of an |
---|
| 18 | !! analytical function by the local bathymetry, while the vertical |
---|
| 19 | !! scale factors are defined as the product of the first derivative |
---|
| 20 | !! of the analytical function by the bathymetry. |
---|
| 21 | !! (this solution save memory as depth and scale factors are not |
---|
| 22 | !! 3d fields) |
---|
| 23 | !! - Read bathymetry (in meters) at t-point and compute the |
---|
| 24 | !! bathymetry at u-, v-, and f-points. |
---|
| 25 | !! hbatu = mi( hbatt ) |
---|
| 26 | !! hbatv = mj( hbatt ) |
---|
| 27 | !! hbatf = mi( mj( hbatt ) ) |
---|
| 28 | !! - Compute gsigt, gsigw, esigt, esigw from an analytical |
---|
| 29 | !! function and its derivative given as statement function. |
---|
| 30 | !! gsigt(k) = fssig (k+0.5) |
---|
| 31 | !! gsigw(k) = fssig (k ) |
---|
| 32 | !! esigt(k) = fsdsig(k+0.5) |
---|
| 33 | !! esigw(k) = fsdsig(k ) |
---|
| 34 | !! This routine is given as an example, it must be modified |
---|
| 35 | !! following the user s desiderata. nevertheless, the output as |
---|
| 36 | !! well as the way to compute the model levels and scale factors |
---|
| 37 | !! must be respected in order to insure second order a!!uracy |
---|
| 38 | !! schemes. |
---|
| 39 | !! |
---|
| 40 | !! Reference : |
---|
| 41 | !! Madec, Lott, Delecluse and Crepon, 1996. JPO, 26, 1393-1408. |
---|
| 42 | !! |
---|
| 43 | !! History : |
---|
| 44 | !! ! 95-12 (G. Madec) Original code : s vertical coordinate |
---|
| 45 | !! ! 97-07 (G. Madec) lbc_lnk call |
---|
| 46 | !! ! 97-04 (J.-O. Beismann) |
---|
| 47 | !! 8.5 ! 02-06 (G. Madec) F90: Free form and module |
---|
| 48 | !!---------------------------------------------------------------------- |
---|
| 49 | !! * Local declarations |
---|
| 50 | INTEGER :: in |
---|
| 51 | INTEGER :: ji, jj, jk |
---|
| 52 | REAL(wp) :: fssig, fsdsig, pfkk |
---|
| 53 | REAL(wp) :: zh0, zdz1, zdzn, zd, za, zb, zc, zdepmi |
---|
| 54 | |
---|
| 55 | !!---------------------------------------------------------------------- |
---|
| 56 | !! OPA 8.5, LODYC-IPSL (2002) |
---|
| 57 | !!---------------------------------------------------------------------- |
---|
| 58 | |
---|
| 59 | ! a. Sigma stretching coefficient |
---|
| 60 | ! hyperbolic stretching sigma= za(in-jk)^3+zb(in-jk)^2+zc(in-jk)+zd |
---|
| 61 | ! hyperbolic stretching sigma= za(jk)^3+zb(jk)^2+zc(jk)+zd |
---|
| 62 | ! calculate stretching coefficients (to ensure |
---|
| 63 | ! ss(sigma) =1 at sigma=1, and -1 at sigma=-1) |
---|
| 64 | ! sigma =1 at the surface (k=1) and =-1 at the bottom (k=jpk) |
---|
| 65 | ! the only free parameters are the depths of the first level |
---|
| 66 | ! dz1 and of the last level(zdzn) in meters (given as a positive |
---|
| 67 | ! quantity). |
---|
| 68 | |
---|
| 69 | fssig(pfkk) =-0.5* ( ( ( za*(pfkk-1.) + zb ) * (pfkk-1.) + zc ) * (pfkk-1.) + zd -1. ) |
---|
| 70 | |
---|
| 71 | ! b. Vertical derivative of sigma stretching coefficient |
---|
| 72 | |
---|
| 73 | fsdsig(pfkk)= 0.5*( ( 3.*za*(pfkk-1.) + 2.*zb )* (pfkk-1.) + zc ) |
---|
| 74 | |
---|
| 75 | ! ------------------ stretching polynomial ------------------------ |
---|
| 76 | |
---|
| 77 | ! SPEM coefficients |
---|
| 78 | ! spem opa: kopa= jpk-kspem |
---|
| 79 | ! pfkk =in-jk (spem) <==> pfkk=in-jk-jpk=-jk-1 (opa) |
---|
| 80 | |
---|
| 81 | zh0 = 5500. |
---|
| 82 | zdz1 = 800. |
---|
| 83 | zdzn = 17.5 |
---|
| 84 | in = 19 |
---|
| 85 | |
---|
| 86 | IF(lwp) THEN |
---|
| 87 | WRITE(numout,*) ' stretching with a third order polynamial' |
---|
| 88 | WRITE(numout,*) ' h0 = ',zh0 |
---|
| 89 | WRITE(numout,*) ' at ',zh0,' dz(1)= z(1)-z(0) = ',zdz1 |
---|
| 90 | WRITE(numout,*) ' dz(n)= z(n)-z(n-1) = ',zdzn |
---|
| 91 | ENDIF |
---|
| 92 | |
---|
| 93 | za = - 2.*(zdz1+zdzn)/zh0/float(in-1)/float(in-2) & |
---|
| 94 | + 4./float(in)/float(in-1)/float(in-2) |
---|
| 95 | |
---|
| 96 | zb = - 6./float(in-1)/float(in-2) & |
---|
| 97 | + 2.*(zdz1*float(in+1)+ zdzn*float(2*in-1)) & |
---|
| 98 | /zh0/float(in-2)/float(in-1) |
---|
| 99 | |
---|
| 100 | zc = -2.*zdzn*float(in)/zh0/float(in-2) & |
---|
| 101 | -2.*zdz1*float(in)/zh0/float(in-1)/float(in-2) & |
---|
| 102 | +(6.* float(in) - 4.)/float(in)/float(in-1)/float(in-2) |
---|
| 103 | |
---|
| 104 | zd = 1. |
---|
| 105 | |
---|
| 106 | !!---------------------------------------------------------------------- |
---|
| 107 | !! OPA 8.5, LODYC-IPSL (2002) |
---|
| 108 | !!---------------------------------------------------------------------- |
---|
| 109 | |
---|
| 110 | |
---|
| 111 | ! 1. Lecture and computation of hbat fields |
---|
| 112 | ! ----------------------------------------- |
---|
| 113 | |
---|
| 114 | ! 1.1 Read hbatt (in meters) |
---|
| 115 | ! 1.2 Set the hbatt to negative value ??? |
---|
| 116 | |
---|
| 117 | hbatt(:,:) = - bathy(:,:) |
---|
| 118 | |
---|
| 119 | |
---|
| 120 | ! 1.3 Set a minimum depth (zdepmi) |
---|
| 121 | |
---|
| 122 | zdepmi = -50. |
---|
| 123 | IF( zdepmi >= 0. ) THEN |
---|
| 124 | IF(lwp) WRITE(numout,*)'domzgr: the minimum depth must be < 0' |
---|
| 125 | STOP 'domzgr' |
---|
| 126 | ENDIF |
---|
| 127 | DO jj = 1, jpj |
---|
| 128 | DO ji = 1, jpi |
---|
| 129 | hbatt(ji,jj) = MIN( hbatt(ji,jj), zdepmi ) |
---|
| 130 | hbatu(ji,jj) = zdepmi |
---|
| 131 | hbatv(ji,jj) = zdepmi |
---|
| 132 | hbatf(ji,jj) = zdepmi |
---|
| 133 | END DO |
---|
| 134 | END DO |
---|
| 135 | |
---|
| 136 | CALL lbc_lnk( hbatt, 'T', 1. ) |
---|
| 137 | |
---|
| 138 | IF(lwp) THEN |
---|
| 139 | WRITE(numout,*) |
---|
| 140 | WRITE(numout,*) ' domzgr: minimum depth set to : ',zdepmi |
---|
| 141 | WRITE(numout,*) |
---|
| 142 | ENDIF |
---|
| 143 | |
---|
| 144 | ! 1.4 Control print |
---|
| 145 | |
---|
| 146 | IF(lwp) THEN |
---|
| 147 | WRITE(numout,*) |
---|
| 148 | WRITE(numout,*) ' domzgr: hbatt field; ocean depth in meters' |
---|
| 149 | WRITE(numout,*) |
---|
| 150 | CALL prihre(hbatt(1,1),jpi,jpj,1,jpi,1,1,jpj,1,0.,numout) |
---|
| 151 | ENDIF |
---|
| 152 | |
---|
| 153 | ! 1.5 Compute hbat fields at u-, v-, f-points |
---|
| 154 | |
---|
| 155 | DO jj = 1, jpjm1 |
---|
| 156 | DO ji = 1, jpim1 |
---|
| 157 | hbatu(ji,jj)= 0.5 *( hbatt(ji ,jj)+hbatt(ji+1,jj ) ) * umask(ji,jj,1) |
---|
| 158 | hbatv(ji,jj)= 0.5 *( hbatt(ji ,jj)+hbatt(ji ,jj+1) ) * vmask(ji,jj,1) |
---|
| 159 | hbatf(ji,jj)= 0.25*( hbatt(ji ,jj)+hbatt(ji ,jj+1) & |
---|
| 160 | +hbatt(ji+1,jj)+hbatt(ji+1,jj+1) ) * fmask(ji,jj,1) |
---|
| 161 | END DO |
---|
| 162 | END DO |
---|
| 163 | |
---|
| 164 | CALL lbc_lnk( hbatu, 'U', 1. ) |
---|
| 165 | CALL lbc_lnk( hbatv, 'V', 1. ) |
---|
| 166 | CALL lbc_lnk( hbatf, 'F', 1. ) |
---|
| 167 | |
---|
| 168 | |
---|
| 169 | ! 2. Computation of gsig and esig fields |
---|
| 170 | ! -------------------------------------- |
---|
| 171 | |
---|
| 172 | ! 2.1 Coefficients for model level depth at w- and t-levels |
---|
| 173 | |
---|
| 174 | DO jk = 1, jpk |
---|
| 175 | gsigw(jk) = -fssig ( float(jk) ) |
---|
| 176 | gsigt(jk) = -fssig ( float(jk)+0.5) |
---|
| 177 | END DO |
---|
| 178 | |
---|
| 179 | ! 2.2 Coefficients for vertical scale factors at w-, t- levels |
---|
| 180 | |
---|
| 181 | DO jk = 1, jpk |
---|
| 182 | esigw(jk)=fsdsig( float(jk) ) |
---|
| 183 | esigt(jk)=fsdsig( float(jk)+0.5) |
---|
| 184 | END DO |
---|
| 185 | |
---|
| 186 | ! 2.3 Coefficients for vertical depth as the sum of e3w scale factors |
---|
| 187 | |
---|
| 188 | gsi3w(1) = 0.5 * esigw(1) |
---|
| 189 | DO jk = 2, jpk |
---|
| 190 | gsi3w(jk) = gsi3w(jk-1)+ esigw(jk) |
---|
| 191 | END DO |
---|
| 192 | |
---|
| 193 | ! 2.4 Control print |
---|
| 194 | |
---|
| 195 | IF(lwp) THEN |
---|
| 196 | WRITE(numout,*) |
---|
| 197 | WRITE(numout,*) ' domzgr: vertical coefficients for model level' |
---|
| 198 | WRITE(numout,9400) |
---|
| 199 | WRITE(numout,9410) (jk,gsigt(jk),gsigw(jk),esigt(jk),esigw(jk),gsi3w(jk),jk=1,jpk) |
---|
| 200 | ENDIF |
---|
| 201 | 9400 FORMAT(9x,' level gsigt gsigw esigt esigw gsi3w') |
---|
| 202 | 9410 FORMAT(10x,i4,5f9.2) |
---|
| 203 | |
---|
| 204 | IF(lwp) THEN |
---|
| 205 | WRITE(numout,*) |
---|
| 206 | WRITE(numout,*) ' domzgr: vertical coordinates : point (10,10,k)' |
---|
| 207 | WRITE(numout,*) ' ~~~~~~ --------------------' |
---|
| 208 | WRITE(numout,9420) |
---|
| 209 | WRITE(numout,9430) (jk,fsdept(10,10,jk),fsdepw(10,10,jk), & |
---|
| 210 | fse3t (10,10,jk),fse3w (10,10,jk),jk=1,jpk) |
---|
| 211 | ENDIF |
---|
| 212 | |
---|
| 213 | 9420 FORMAT(9x,' level gdept gdepw gde3w e3t e3w ') |
---|
| 214 | 9430 FORMAT(10x,i4,4f9.2) |
---|
| 215 | |
---|
| 216 | DO jk = 1, jpk |
---|
| 217 | DO jj = 1, jpj |
---|
| 218 | DO ji = 1, jpi |
---|
| 219 | IF( fse3w(ji,jj,jk) <= 0. .OR. fse3t(ji,jj,jk) <= 0. ) THEN |
---|
| 220 | IF(lwp) THEN |
---|
| 221 | WRITE(numout,*) |
---|
| 222 | WRITE(numout,*) ' e r r o r : e3w or e3t =< 0 ' |
---|
| 223 | WRITE(numout,*) ' ========= --------------- ' |
---|
| 224 | WRITE(numout,*) |
---|
| 225 | WRITE(numout,*) ' point (i,j,k)= ',ji,jj,jk |
---|
| 226 | WRITE(numout,*) |
---|
| 227 | ENDIF |
---|
| 228 | STOP 'domzgr' |
---|
| 229 | ENDIF |
---|
| 230 | IF( fsdepw(ji,jj,jk) < 0. .OR. fsdept(ji,jj,jk) < 0. ) THEN |
---|
| 231 | IF(lwp) THEN |
---|
| 232 | WRITE(numout,*) |
---|
| 233 | WRITE(numout,*) ' e r r o r : gdepw or gdept < 0 ' |
---|
| 234 | WRITE(numout,*) ' ========= ------------------ ' |
---|
| 235 | WRITE(numout,*) |
---|
| 236 | WRITE(numout,*) ' point (i,j,k)= ',ji,jj,jk |
---|
| 237 | WRITE(numout,*) |
---|
| 238 | ENDIF |
---|
| 239 | STOP 'domzgr' |
---|
| 240 | ENDIF |
---|
| 241 | END DO |
---|
| 242 | END DO |
---|
| 243 | END DO |
---|
| 244 | |
---|
| 245 | END SUBROUTINE zgr_s |
---|
| 246 | |
---|
| 247 | #else |
---|
| 248 | !!---------------------------------------------------------------------- |
---|
| 249 | !! Default option : Empty routine |
---|
| 250 | !!---------------------------------------------------------------------- |
---|
| 251 | SUBROUTINE zgr_s |
---|
| 252 | END SUBROUTINE zgr_s |
---|
| 253 | #endif |
---|