Changeset 434
- Timestamp:
- 2006-04-10T17:46:12+02:00 (18 years ago)
- Location:
- trunk/NEMO/OPA_SRC
- Files:
-
- 1 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMO/OPA_SRC/DOM/domcfg.F90
r247 r434 145 145 WRITE(numout,25) (mi1(ji),ji = 1,jpidta) 146 146 WRITE(numout,*) 147 WRITE(numout,*) ' conversion local ==> data i-index domain'147 WRITE(numout,*) ' conversion local ==> data j-index domain' 148 148 WRITE(numout,25) (mjg(jj),jj = 1,jpj) 149 149 WRITE(numout,*) 150 WRITE(numout,*) ' conversion data ==> local i-index domain'150 WRITE(numout,*) ' conversion data ==> local j-index domain' 151 151 WRITE(numout,*) ' starting index' 152 152 WRITE(numout,25) (mj0(jj),jj = 1,jpjdta) -
trunk/NEMO/OPA_SRC/DOM/domhgr.F90
r418 r434 13 13 USE phycst ! physical constants 14 14 USE in_out_manager ! I/O manager 15 USE lib_mpp 15 16 16 17 IMPLICIT NONE … … 106 107 ztj, zuj, zvj, zfj, & ! 107 108 zphi0, zbeta, znorme, & ! 108 zarg, zf0 109 zarg, zf0, zminff, zmaxff 109 110 REAL(wp) :: & 110 111 zlam1, zcos_alpha, zim1 , zjm1 , ze1, ze1deg, & … … 442 443 443 444 IF(lwp) WRITE(numout,*) 444 IF(lwp) WRITE(numout,*) ' Beta-plane: Beta parameter = constant = ', ff(1,1) 445 IF(lwp) WRITE(numout,*) ' Coriolis parameter varies from ', ff(1,1),' to ', ff(1,jpj) 446 447 CASE ( 5 ) ! beta-plane and rotated domain 445 IF(lwp) WRITE(numout,*) ' Beta-plane: Beta parameter = constant = ', ff(nldi,nldj) 446 IF(lwp) WRITE(numout,*) ' Coriolis parameter varies from ', ff(nldi,nldj),' to ', ff(nldi,nlej) 447 IF( lk_mpp ) THEN 448 zminff=ff(nldi,nldj) 449 zmaxff=ff(nldi,nlej) 450 CALL mpp_min( zminff ) ! min over the global domain 451 CALL mpp_max( zmaxff ) ! max over the global domain 452 IF(lwp) WRITE(numout,*) ' Coriolis parameter varies globally from ', zminff,' to ', zmaxff 453 END IF 454 455 CASE ( 5 ) ! beta-plane and rotated domain (gyre configuration) 448 456 449 457 zbeta = 2. * omega * COS( rad * ppgphi0 ) / ra ! beta at latitude ppgphi0 … … 453 461 ff(:,:) = ( zf0 + zbeta * ABS( gphif(:,:) - zphi0 ) * rad * ra ) ! f = f0 +beta* y ( y=0 at south) 454 462 455 IF(lwp) WRITE(numout,*) ' Beta-plane: Beta parameter = constant = ', ff(1,1) 456 IF(lwp) WRITE(numout,*) ' Coriolis parameter varies from ', ff(1,1),' to ', ff(1,jpj) 463 IF(lwp) WRITE(numout,*) ' Beta-plane and rotated domain : ' 464 IF(lwp) WRITE(numout,*) ' Coriolis parameter varies in this processor from ', ff(nldi,nldj),' to ', ff(nldi,nlej) 465 IF( lk_mpp ) THEN 466 zminff=ff(nldi,nldj) 467 zmaxff=ff(nldi,nlej) 468 CALL mpp_min( zminff ) ! min over the global domain 469 CALL mpp_max( zmaxff ) ! max over the global domain 470 IF(lwp) WRITE(numout,*) ' Coriolis parameter varies globally from ', zminff,' to ', zmaxff 471 END IF 457 472 458 473 END SELECT -
trunk/NEMO/OPA_SRC/DTA/dtasal.F90
r392 r434 79 79 imois, iman, ik, i15, & ! temporary integers 80 80 ipi, ipj, ipk, itime ! " " 81 # 81 #if defined key_tradmp 82 82 INTEGER :: & 83 83 jk, il0, il1, & ! temporary integers 84 84 ii0, ii1, ij0, ij1 ! " " 85 # 85 #endif 86 86 INTEGER, DIMENSION(jpmois) :: istep 87 87 REAL(wp) :: & … … 91 91 !!---------------------------------------------------------------------- 92 92 93 94 ! 0. Initialization 95 ! ----------------- 96 97 iman = jpmois 98 i15 = nday / 16 99 100 imois = nmonth + i15 - 1 101 IF( imois == 0 ) imois = iman 102 103 itime = jpmois 104 ipi=jpiglo 105 ipj=jpjglo 106 ipk = jpk 107 108 ! 1. First call kt=nit000 109 ! ----------------------- 110 111 IF( kt == nit000 .AND. nlecsa == 0 ) THEN 112 nsal1 = 0 113 IF(lwp) THEN 114 WRITE(numout,*) 115 WRITE(numout,*) ' dta_sal : monthly salinity data in NetCDF file' 116 WRITE(numout,*) ' ~~~~~~~' 117 WRITE(numout,*) 93 IF( cp_cfg /= 'gyre' ) THEN 94 95 ! 0. Initialization 96 ! ----------------- 97 98 iman = jpmois 99 i15 = nday / 16 100 101 imois = nmonth + i15 - 1 102 IF( imois == 0 ) imois = iman 103 104 itime = jpmois 105 ipi=jpiglo 106 ipj=jpjglo 107 ipk = jpk 108 109 ! 1. First call kt=nit000 110 ! ----------------------- 111 112 IF( kt == nit000 .AND. nlecsa == 0 ) THEN 113 nsal1 = 0 114 IF(lwp) THEN 115 WRITE(numout,*) 116 WRITE(numout,*) ' dta_sal : monthly salinity data in NetCDF file' 117 WRITE(numout,*) ' ~~~~~~~' 118 WRITE(numout,*) 119 ENDIF 120 121 ! open file 122 123 clname = 'data_1m_salinity_nomask' 124 #if defined key_agrif 125 if ( .NOT. Agrif_Root() ) then 126 clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname) 127 endif 128 #endif 129 CALL flinopen(TRIM(clname),mig(1),nlci,mjg(1),nlcj,.FALSE. & 130 ,ipi,ipj,ipk,zlon,zlat,zlev,itime,istep,zdate0,rdt,numsdt) 131 132 ! title, dimensions and tests 133 134 IF( itime /= jpmois ) THEN 135 IF(lwp) THEN 136 WRITE(numout,*) 137 WRITE(numout,*) 'problem with time coordinates' 138 WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois 139 ENDIF 140 STOP 'dta_sal' 141 ENDIF 142 IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN 143 IF(lwp) THEN 144 WRITE(numout,*) 145 WRITE(numout,*) 'problem with dimensions' 146 WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta 147 WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta 148 WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk 149 ENDIF 150 STOP 'dta_sal' 151 ENDIF 152 IF(lwp)WRITE(numout,*) itime,istep,zdate0,rdt,numsdt 153 118 154 ENDIF 119 155 120 ! open file 121 122 clname = 'data_1m_salinity_nomask' 123 #if defined key_agrif 124 if ( .NOT. Agrif_Root() ) then 125 clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname) 126 endif 127 #endif 128 CALL flinopen(TRIM(clname),mig(1),nlci,mjg(1),nlcj,.FALSE. & 129 ,ipi,ipj,ipk,zlon,zlat,zlev,itime,istep,zdate0,rdt,numsdt) 130 131 ! title, dimensions and tests 132 133 IF( itime /= jpmois ) THEN 156 157 ! 2. Read monthly file 158 ! ------------------- 159 160 IF( ( kt == nit000 .AND. nlecsa == 0) .OR. imois /= nsal1 ) THEN 161 nlecsa = 1 162 163 ! 2.1 Calendar computation 164 165 nsal1 = imois ! first file record used 166 nsal2 = nsal1 + 1 ! last file record used 167 nsal1 = MOD( nsal1, iman ) 168 IF( nsal1 == 0 ) nsal1 = iman 169 nsal2 = MOD( nsal2, iman ) 170 IF( nsal2 == 0 ) nsal2 = iman 171 IF(lwp) WRITE(numout,*) 'first record file used nsal1 ', nsal1 172 IF(lwp) WRITE(numout,*) 'last record file used nsal2 ', nsal2 173 174 ! 2.3 Read monthly salinity data Levitus 175 176 CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal1, & 177 nsal1,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,1)) 178 179 CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal2, & 180 nsal2,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,2)) 181 182 134 183 IF(lwp) THEN 135 184 WRITE(numout,*) 136 WRITE(numout,*) 'problem with time coordinates' 137 WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois 138 ENDIF 139 STOP 'dta_sal' 140 ENDIF 141 IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN 185 WRITE(numout,*) ' read Levitus salinity ok' 186 WRITE(numout,*) 187 ENDIF 188 189 #if defined key_tradmp 190 IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN 191 192 ! ! ======================= 193 ! ! ORCA_R2 configuration 194 ! ! ======================= 195 ij0 = 101 ; ij1 = 109 196 ii0 = 141 ; ii1 = 155 197 DO jj = mj0(ij0), mj1(ij1) ! Reduced salinity in the Alboran Sea 198 DO ji = mi0(ii0), mi1(ii1) 199 DO jk = 13, 13 200 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.15 201 END DO 202 DO jk = 14, 15 203 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.25 204 END DO 205 DO jk = 16, 17 206 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.30 207 END DO 208 DO jk = 18, 25 209 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.35 210 END DO 211 END DO 212 END DO 213 IF( n_cla == 1 ) THEN 214 ! ! New salinity profile at Gibraltar 215 il0 = 138 ; il1 = 138 216 ij0 = 101 ; ij1 = 101 217 ii0 = 139 ; ii1 = 139 218 saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) = & 219 & saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : ) 220 ij0 = 101 ; ij1 = 101 221 saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) = & 222 & saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : ) 223 il0 = 138 ; il1 = 138 224 ij0 = 101 ; ij1 = 102 225 ii0 = 139 ; ii1 = 139 226 DO jl = mi0(il0), mi1(il1) ! New salinity profile at Gibraltar 227 DO jj = mj0(ij0), mj1(ij1) 228 DO ji = mi0(ii0), mi1(ii1) 229 saldta(ji,jj,:,:) = saldta(jl,jj,:,:) 230 END DO 231 END DO 232 END DO 233 234 il0 = 164 ; il1 = 164 235 ij0 = 88 ; ij1 = 88 236 ii0 = 161 ; ii1 = 163 237 DO jl = mi0(il0), mi1(il1) ! New salinity profile at Bab el Mandeb 238 DO jj = mj0(ij0), mj1(ij1) 239 DO ji = mi0(ii0), mi1(ii1) 240 saldta(ji,jj,:,:) = saldta(jl,jj,:,:) 241 END DO 242 END DO 243 ij0 = 87 ; ij1 = 87 244 DO jj = mj0(ij0), mj1(ij1) 245 DO ji = mi0(ii0), mi1(ii1) 246 saldta(ji,jj,:,:) = saldta(jl,jj,:,:) 247 END DO 248 END DO 249 END DO 250 251 ENDIF 252 253 ENDIF 254 #endif 255 256 ! ! Mask 257 DO jl = 1, 2 258 saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:) 259 saldta(:,:,jpk,jl) = 0. 260 IF( lk_zps ) THEN ! z-coord. partial steps 261 DO jj = 1, jpj ! interpolation of salinity at the last ocean level (i.e. the partial step) 262 DO ji = 1, jpi 263 ik = mbathy(ji,jj) - 1 264 IF( ik > 2 ) THEN 265 zl = ( gdept(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) ) 266 saldta(ji,jj,ik,jl) = (1.-zl) * saldta(ji,jj,ik,jl) +zl * saldta(ji,jj,ik-1,jl) 267 ENDIF 268 END DO 269 END DO 270 ENDIF 271 END DO 272 273 142 274 IF(lwp) THEN 143 WRITE(numout,*) 144 WRITE(numout,*) 'problem with dimensions' 145 WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta 146 WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta 147 WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk 148 ENDIF 149 STOP 'dta_sal' 150 ENDIF 151 IF(lwp)WRITE(numout,*) itime,istep,zdate0,rdt,numsdt 152 153 ENDIF 154 155 156 ! 2. Read monthly file 157 ! ------------------- 158 159 IF( ( kt == nit000 .AND. nlecsa == 0) .OR. imois /= nsal1 ) THEN 160 nlecsa = 1 161 162 ! 2.1 Calendar computation 163 164 nsal1 = imois ! first file record used 165 nsal2 = nsal1 + 1 ! last file record used 166 nsal1 = MOD( nsal1, iman ) 167 IF( nsal1 == 0 ) nsal1 = iman 168 nsal2 = MOD( nsal2, iman ) 169 IF( nsal2 == 0 ) nsal2 = iman 170 IF(lwp) WRITE(numout,*) 'first record file used nsal1 ', nsal1 171 IF(lwp) WRITE(numout,*) 'last record file used nsal2 ', nsal2 172 173 ! 2.3 Read monthly salinity data Levitus 174 175 CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal1, & 176 nsal1,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,1)) 177 178 CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal2, & 179 nsal2,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,2)) 180 181 182 IF(lwp) THEN 183 WRITE(numout,*) 184 WRITE(numout,*) ' read Levitus salinity ok' 185 WRITE(numout,*) 275 WRITE(numout,*)' salinity Levitus month ',nsal1,nsal2 276 WRITE(numout,*) 277 WRITE(numout,*) ' Levitus month = ',nsal1,' level = 1' 278 CALL prihre(saldta(:,:,1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) 279 WRITE(numout,*) ' Levitus month = ',nsal1,' level = ',jpk/2 280 CALL prihre(saldta(:,:,jpk/2,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) 281 WRITE(numout,*) ' Levitus month = ',nsal1,' level = ',jpkm1 282 CALL prihre(saldta(:,:,jpkm1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) 283 ENDIF 186 284 ENDIF 187 285 188 # if defined key_tradmp 189 IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN 190 191 ! ! ======================= 192 ! ! ORCA_R2 configuration 193 ! ! ======================= 194 ij0 = 101 ; ij1 = 109 195 ii0 = 141 ; ii1 = 155 196 DO jj = mj0(ij0), mj1(ij1) ! Reduced salinity in the Alboran Sea 197 DO ji = mi0(ii0), mi1(ii1) 198 DO jk = 13, 13 199 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.15 200 END DO 201 DO jk = 14, 15 202 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.25 203 END DO 204 DO jk = 16, 17 205 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.30 206 END DO 207 DO jk = 18, 25 208 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.35 209 END DO 210 END DO 211 END DO 212 IF( n_cla == 1 ) THEN 213 ! ! New salinity profile at Gibraltar 214 il0 = 138 ; il1 = 138 215 ij0 = 101 ; ij1 = 101 216 ii0 = 139 ; ii1 = 139 217 saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) = & 218 & saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : ) 219 ij0 = 101 ; ij1 = 101 220 saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) = & 221 & saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : ) 222 il0 = 138 ; il1 = 138 223 ij0 = 101 ; ij1 = 102 224 ii0 = 139 ; ii1 = 139 225 DO jl = mi0(il0), mi1(il1) ! New salinity profile at Gibraltar 226 DO jj = mj0(ij0), mj1(ij1) 227 DO ji = mi0(ii0), mi1(ii1) 228 saldta(ji,jj,:,:) = saldta(jl,jj,:,:) 229 END DO 230 END DO 231 END DO 232 233 il0 = 164 ; il1 = 164 234 ij0 = 88 ; ij1 = 88 235 ii0 = 161 ; ii1 = 163 236 DO jl = mi0(il0), mi1(il1) ! New salinity profile at Bab el Mandeb 237 DO jj = mj0(ij0), mj1(ij1) 238 DO ji = mi0(ii0), mi1(ii1) 239 saldta(ji,jj,:,:) = saldta(jl,jj,:,:) 240 END DO 241 END DO 242 ij0 = 87 ; ij1 = 87 243 DO jj = mj0(ij0), mj1(ij1) 244 DO ji = mi0(ii0), mi1(ii1) 245 saldta(ji,jj,:,:) = saldta(jl,jj,:,:) 246 END DO 247 END DO 248 END DO 249 250 ENDIF 251 252 ENDIF 253 #endif 254 255 ! ! Mask 256 DO jl = 1, 2 257 saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:) 258 saldta(:,:,jpk,jl) = 0. 259 IF( lk_zps ) THEN ! z-coord. partial steps 260 DO jj = 1, jpj ! interpolation of salinity at the last ocean level (i.e. the partial step) 261 DO ji = 1, jpi 262 ik = mbathy(ji,jj) - 1 263 IF( ik > 2 ) THEN 264 zl = ( gdept(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) ) 265 saldta(ji,jj,ik,jl) = (1.-zl) * saldta(ji,jj,ik,jl) +zl * saldta(ji,jj,ik-1,jl) 266 ENDIF 267 END DO 268 END DO 269 ENDIF 270 END DO 271 272 273 IF(lwp) THEN 274 WRITE(numout,*)' salinity Levitus month ',nsal1,nsal2 275 WRITE(numout,*) 276 WRITE(numout,*) ' Levitus month = ',nsal1,' level = 1' 277 CALL prihre(saldta(:,:,1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) 278 WRITE(numout,*) ' Levitus month = ',nsal1,' level = ',jpk/2 279 CALL prihre(saldta(:,:,jpk/2,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) 280 WRITE(numout,*) ' Levitus month = ',nsal1,' level = ',jpkm1 281 CALL prihre(saldta(:,:,jpkm1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) 282 ENDIF 286 287 ! 3. At every time step compute salinity data 288 ! ------------------------------------------- 289 290 zxy = FLOAT(nday + 15 - 30*i15)/30. 291 s_dta(:,:,:) = ( 1.- zxy ) * saldta(:,:,:,1) + zxy * saldta(:,:,:,2) 292 283 293 ENDIF 284 285 286 ! 3. At every time step compute salinity data287 ! -------------------------------------------288 289 zxy = FLOAT(nday + 15 - 30*i15)/30.290 s_dta(:,:,:) = ( 1.- zxy ) * saldta(:,:,:,1) + zxy * saldta(:,:,:,2)291 294 292 295 END SUBROUTINE dta_sal -
trunk/NEMO/OPA_SRC/DTA/dtatem.F90
r392 r434 98 98 !!---------------------------------------------------------------------- 99 99 100 cl_tdata = 'data_1m_potential_temperature_nomask ' 101 100 IF( cp_cfg /= 'gyre' ) THEN 101 102 ! 0. Initialization 103 ! ----------------- 104 105 iman = jpmois 106 i15 = nday / 16 107 imois = nmonth + i15 - 1 108 IF( imois == 0 ) imois = iman 109 110 itime = jpmois 111 ipi = jpiglo 112 ipj = jpjglo 113 ipk = jpk 114 115 ! 1. First call kt=nit000 116 ! ----------------------- 117 118 IF( kt == nit000 .AND. nlecte == 0 ) THEN 119 ntem1 = 0 120 IF(lwp) WRITE(numout,*) 121 IF(lwp) WRITE(numout,*) ' dtatem : Levitus monthly fields' 122 IF(lwp) WRITE(numout,*) ' ~~~~~~' 123 IF(lwp) WRITE(numout,*) ' NetCDF FORMAT' 124 IF(lwp) WRITE(numout,*) 125 126 ! open file 127 128 cl_tdata = 'data_1m_potential_temperature_nomask ' 102 129 #if defined key_agrif 103 if ( .NOT. Agrif_Root() ) then 104 cl_tdata = TRIM(Agrif_CFixed())//'_'//TRIM(cl_tdata) 105 endif 106 #endif 107 108 ! 0. Initialization 109 ! ----------------- 110 111 iman = jpmois 112 i15 = nday / 16 113 imois = nmonth + i15 - 1 114 IF( imois == 0 ) imois = iman 115 116 itime = jpmois 117 ipi = jpiglo 118 ipj = jpjglo 119 ipk = jpk 120 121 ! 1. First call kt=nit000 122 ! ----------------------- 123 124 IF( kt == nit000 .AND. nlecte == 0 ) THEN 125 ntem1 = 0 126 IF(lwp) WRITE(numout,*) 127 IF(lwp) WRITE(numout,*) ' dtatem : Levitus monthly fields' 128 IF(lwp) WRITE(numout,*) ' ~~~~~~' 129 IF(lwp) WRITE(numout,*) ' NetCDF FORMAT' 130 IF(lwp) WRITE(numout,*) 130 if ( .NOT. Agrif_Root() ) then 131 cl_tdata = TRIM(Agrif_CFixed())//'_'//TRIM(cl_tdata) 132 endif 133 #endif 134 CALL flinopen( TRIM(cl_tdata), mig(1), nlci , mjg(1), nlcj & 135 & , .false. , ipi , ipj , ipk , zlon & 136 & , zlat , zlev , itime, istep , zdate0 & 137 & , rdt , numtdt ) 138 139 ! title, dimensions and tests 140 141 IF( itime /= jpmois ) THEN 142 IF(lwp) THEN 143 WRITE(numout,*) 144 WRITE(numout,*) 'problem with time coordinates' 145 WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois 146 ENDIF 147 STOP 'dtatem' 148 ENDIF 149 IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN 150 IF(lwp) THEN 151 WRITE(numout,*) 152 WRITE(numout,*) 'problem with dimensions' 153 WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta 154 WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta 155 WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk 156 ENDIF 157 STOP 'dtatem' 158 ENDIF 159 IF(lwp) WRITE(numout,*) itime,istep,zdate0,rdt,numtdt 160 161 ENDIF 162 163 164 ! 2. Read monthly file 165 ! ------------------- 166 167 IF( ( kt == nit000 .AND. nlecte == 0 ) .OR. imois /= ntem1 ) THEN 168 nlecte = 1 169 170 ! Calendar computation 171 172 ntem1 = imois ! first file record used 173 ntem2 = ntem1 + 1 ! last file record used 174 ntem1 = MOD( ntem1, iman ) 175 IF( ntem1 == 0 ) ntem1 = iman 176 ntem2 = MOD( ntem2, iman ) 177 IF( ntem2 == 0 ) ntem2 = iman 178 IF(lwp) WRITE(numout,*) 'first record file used ntem1 ', ntem1 179 IF(lwp) WRITE(numout,*) 'last record file used ntem2 ', ntem2 180 181 ! Read monthly temperature data Levitus 182 183 CALL flinget( numtdt, 'votemper', jpidta, jpjdta, jpk & 184 , jpmois, ntem1 , ntem1 , mig(1), nlci & 185 , mjg(1), nlcj , temdta(1:nlci,1:nlcj,1:jpk,1) ) 186 CALL flinget( numtdt, 'votemper', jpidta, jpjdta, jpk & 187 , jpmois, ntem2 , ntem2 , mig(1), nlci & 188 , mjg(1), nlcj , temdta(1:nlci,1:nlcj,1:jpk,2) ) 189 190 IF(lwp) WRITE(numout,*) 191 IF(lwp) WRITE(numout,*) ' read Levitus temperature ok' 192 IF(lwp) WRITE(numout,*) 193 194 #if defined key_tradmp 195 IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN 131 196 132 ! open file 133 134 CALL flinopen( TRIM(cl_tdata), mig(1), nlci , mjg(1), nlcj & 135 , .false. , ipi , ipj , ipk , zlon & 136 , zlat , zlev , itime, istep , zdate0 & 137 , rdt , numtdt ) 138 139 ! title, dimensions and tests 140 141 IF( itime /= jpmois ) THEN 142 IF(lwp) THEN 143 WRITE(numout,*) 144 WRITE(numout,*) 'problem with time coordinates' 145 WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois 146 ENDIF 147 STOP 'dtatem' 148 ENDIF 149 IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN 150 IF(lwp) THEN 151 WRITE(numout,*) 152 WRITE(numout,*) 'problem with dimensions' 153 WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta 154 WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta 155 WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk 156 ENDIF 157 STOP 'dtatem' 158 ENDIF 159 IF(lwp) WRITE(numout,*) itime,istep,zdate0,rdt,numtdt 160 161 ENDIF 162 163 164 ! 2. Read monthly file 165 ! ------------------- 166 167 IF( ( kt == nit000 .AND. nlecte == 0 ) .OR. imois /= ntem1 ) THEN 168 nlecte = 1 169 170 ! Calendar computation 171 172 ntem1 = imois ! first file record used 173 ntem2 = ntem1 + 1 ! last file record used 174 ntem1 = MOD( ntem1, iman ) 175 IF( ntem1 == 0 ) ntem1 = iman 176 ntem2 = MOD( ntem2, iman ) 177 IF( ntem2 == 0 ) ntem2 = iman 178 IF(lwp) WRITE(numout,*) 'first record file used ntem1 ', ntem1 179 IF(lwp) WRITE(numout,*) 'last record file used ntem2 ', ntem2 180 181 ! Read monthly temperature data Levitus 182 183 CALL flinget( numtdt, 'votemper', jpidta, jpjdta, jpk & 184 , jpmois, ntem1 , ntem1 , mig(1), nlci & 185 , mjg(1), nlcj , temdta(1:nlci,1:nlcj,1:jpk,1) ) 186 CALL flinget( numtdt, 'votemper', jpidta, jpjdta, jpk & 187 , jpmois, ntem2 , ntem2 , mig(1), nlci & 188 , mjg(1), nlcj , temdta(1:nlci,1:nlcj,1:jpk,2) ) 189 190 IF(lwp) WRITE(numout,*) 191 IF(lwp) WRITE(numout,*) ' read Levitus temperature ok' 192 IF(lwp) WRITE(numout,*) 193 194 # if defined key_tradmp 195 IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN 196 197 ! ! ======================= 198 ! ! ORCA_R2 configuration 199 ! ! ======================= 200 201 ij0 = 101 ; ij1 = 109 202 ii0 = 141 ; ii1 = 155 203 DO jj = mj0(ij0), mj1(ij1) ! Reduced temperature in the Alboran Sea 204 DO ji = mi0(ii0), mi1(ii1) 205 temdta(ji,jj, 13:13 ,:) = temdta(ji,jj, 13:13 ,:) - 0.20 206 temdta(ji,jj, 14:15 ,:) = temdta(ji,jj, 14:15 ,:) - 0.35 207 temdta(ji,jj, 16:25 ,:) = temdta(ji,jj, 16:25 ,:) - 0.40 197 ! ! ======================= 198 ! ! ORCA_R2 configuration 199 ! ! ======================= 200 201 ij0 = 101 ; ij1 = 109 202 ii0 = 141 ; ii1 = 155 203 DO jj = mj0(ij0), mj1(ij1) ! Reduced temperature in the Alboran Sea 204 DO ji = mi0(ii0), mi1(ii1) 205 temdta(ji,jj, 13:13 ,:) = temdta(ji,jj, 13:13 ,:) - 0.20 206 temdta(ji,jj, 14:15 ,:) = temdta(ji,jj, 14:15 ,:) - 0.35 207 temdta(ji,jj, 16:25 ,:) = temdta(ji,jj, 16:25 ,:) - 0.40 208 END DO 208 209 END DO 209 END DO210 211 IF( n_cla == 0 ) THEN212 ! ! Reduced temperature at Red Sea213 ij0 = 87 ; ij1 = 96214 ii0 = 148 ; ii1 = 160215 temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 4:10 , : ) = 7.0216 temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 11:13 , : ) = 6.5217 temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 14:20 , : ) = 6.0218 ELSE219 il0 = 138 ; il1 = 138220 ij0 = 101 ; ij1 = 102221 ii0 = 139 ; ii1 = 139222 DO jl = mi0(il0), mi1(il1) ! New temperature profile at Gibraltar223 DO jj = mj0(ij0), mj1(ij1)224 DO ji = mi0(ii0), mi1(ii1)225 temdta(ji,jj,:,:) = temdta(jl,jj,:,:)210 211 IF( n_cla == 0 ) THEN 212 ! ! Reduced temperature at Red Sea 213 ij0 = 87 ; ij1 = 96 214 ii0 = 148 ; ii1 = 160 215 temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 4:10 , : ) = 7.0 216 temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 11:13 , : ) = 6.5 217 temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 14:20 , : ) = 6.0 218 ELSE 219 il0 = 138 ; il1 = 138 220 ij0 = 101 ; ij1 = 102 221 ii0 = 139 ; ii1 = 139 222 DO jl = mi0(il0), mi1(il1) ! New temperature profile at Gibraltar 223 DO jj = mj0(ij0), mj1(ij1) 224 DO ji = mi0(ii0), mi1(ii1) 225 temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 226 END DO 226 227 END DO 227 228 END DO 228 END DO 229 il0 = 164 ; il1 = 164 230 ij0 = 88 ; ij1 = 88 231 ii0 = 161 ; ii1 = 163 232 DO jl = mi0(il0), mi1(il1) ! New temperature profile at Bab el Mandeb 233 DO jj = mj0(ij0), mj1(ij1) 234 DO ji = mi0(ii0), mi1(ii1) 235 temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 229 il0 = 164 ; il1 = 164 230 ij0 = 88 ; ij1 = 88 231 ii0 = 161 ; ii1 = 163 232 DO jl = mi0(il0), mi1(il1) ! New temperature profile at Bab el Mandeb 233 DO jj = mj0(ij0), mj1(ij1) 234 DO ji = mi0(ii0), mi1(ii1) 235 temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 236 END DO 237 END DO 238 ij0 = 87 ; ij1 = 87 239 DO jj = mj0(ij0), mj1(ij1) 240 DO ji = mi0(ii0), mi1(ii1) 241 temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 242 END DO 236 243 END DO 237 244 END DO 238 ij0 = 87 ; ij1 = 87 239 DO jj = mj0(ij0), mj1(ij1) 240 DO ji = mi0(ii0), mi1(ii1) 241 temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 245 ENDIF 246 247 ENDIF 248 #endif 249 250 ! ! Mask 251 DO jl = 1, 2 252 temdta(:,:,:,jl) = temdta(:,:,:,jl) * tmask(:,:,:) 253 temdta(:,:,jpk,jl) = 0. 254 IF( lk_zps ) THEN ! z-coord. with partial steps 255 DO jj = 1, jpj ! interpolation of temperature at the last level 256 DO ji = 1, jpi 257 ik = mbathy(ji,jj) - 1 258 IF( ik > 2 ) THEN 259 zl = ( gdept(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) ) 260 temdta(ji,jj,ik,jl) = (1.-zl) * temdta(ji,jj,ik,jl) + zl * temdta(ji,jj,ik-1,jl) 261 ENDIF 242 262 END DO 243 263 END DO 244 END DO 264 ENDIF 265 END DO 266 267 IF(lwp) THEN 268 WRITE(numout,*) ' temperature Levitus month ', ntem1, ntem2 269 WRITE(numout,*) 270 WRITE(numout,*) ' Levitus month = ', ntem1, ' level = 1' 271 CALL prihre( temdta(:,:,1,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 272 WRITE(numout,*) ' Levitus month = ', ntem1, ' level = ', jpk/2 273 CALL prihre( temdta(:,:,jpk/2,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 274 WRITE(numout,*) ' Levitus month = ',ntem1,' level = ', jpkm1 275 CALL prihre( temdta(:,:,jpkm1,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 245 276 ENDIF 246 247 277 ENDIF 248 # endif 249 250 ! ! Mask 251 DO jl = 1, 2 252 temdta(:,:,:,jl) = temdta(:,:,:,jl) * tmask(:,:,:) 253 temdta(:,:,jpk,jl) = 0. 254 IF( lk_zps ) THEN ! z-coord. with partial steps 255 DO jj = 1, jpj ! interpolation of temperature at the last level 256 DO ji = 1, jpi 257 ik = mbathy(ji,jj) - 1 258 IF( ik > 2 ) THEN 259 zl = ( gdept(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) ) 260 temdta(ji,jj,ik,jl) = (1.-zl) * temdta(ji,jj,ik,jl) + zl * temdta(ji,jj,ik-1,jl) 261 ENDIF 262 END DO 263 END DO 264 ENDIF 265 END DO 266 267 IF(lwp) THEN 268 WRITE(numout,*) ' temperature Levitus month ', ntem1, ntem2 269 WRITE(numout,*) 270 WRITE(numout,*) ' Levitus month = ', ntem1, ' level = 1' 271 CALL prihre( temdta(:,:,1,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 272 WRITE(numout,*) ' Levitus month = ', ntem1, ' level = ', jpk/2 273 CALL prihre( temdta(:,:,jpk/2,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 274 WRITE(numout,*) ' Levitus month = ',ntem1,' level = ', jpkm1 275 CALL prihre( temdta(:,:,jpkm1,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 276 ENDIF 278 279 280 ! 2. At every time step compute temperature data 281 ! ---------------------------------------------- 282 283 zxy = FLOAT( nday + 15 - 30 * i15 ) / 30. 284 t_dta(:,:,:) = (1.-zxy) * temdta(:,:,:,1) + zxy * temdta(:,:,:,2) 285 277 286 ENDIF 278 279 280 ! 2. At every time step compute temperature data281 ! ----------------------------------------------282 283 zxy = FLOAT( nday + 15 - 30 * i15 ) / 30.284 t_dta(:,:,:) = (1.-zxy) * temdta(:,:,:,1) + zxy * temdta(:,:,:,2)285 287 286 288 END SUBROUTINE dta_tem -
trunk/NEMO/OPA_SRC/SBC/ocesbc.F90
r359 r434 588 588 qsr0 = 0.e0, & ! solar heat flux 589 589 emp0 = 0.e0 ! net freshwater flux 590 REAL(wp) :: ztrp, zemp_S, zemp_N, zemp_sais, zTstar, zcos_sais , zconv590 REAL(wp) :: ztrp, zemp_S, zemp_N, zemp_sais, zTstar, zcos_sais1, zconv, zcos_sais2 591 591 REAL(wp) :: & 592 592 zsumemp, & ! tampon used for the emp sum 593 593 zsurf, & ! tampon used for the domain sum 594 594 ztime, & ! time in hour 595 ztimemax, ztimemin ! 21th june, and 21th december if date0 = 1st january 595 ztimemax1, ztimemin1, & ! 21th june, and 21th december if date0 = 1st january 596 ztimemax2, ztimemin2 ! 21th august, and 21th february if date0 = 1st january 596 597 REAL(wp), DIMENSION(jpi,jpj) :: t_star 597 INTEGER :: ji, jj , &! dummy loop indices598 js ! indice for months 598 INTEGER :: ji, jj ! dummy loop indices 599 599 600 INTEGER :: & 600 601 zyear0, & ! initial year 601 602 zmonth0, & ! initial month 602 603 zday0, & ! initial day 603 zday_year0, & ! initial day since january 1st 604 zdaymax 604 zday_year0 ! initial day since january 1st 605 605 606 606 NAMELIST/namflx/ q0, qsr0, emp0 … … 611 611 IF( cp_cfg == 'gyre' ) THEN 612 612 613 zyear0 = ndate0 / 10000 614 zmonth0 = ( ndate0 - zyear0 * 10000 ) / 100 615 zday0 = ndate0 - zyear0 * 10000 - zmonth0 * 100 616 !Calculates nday_year, day since january 1st 617 zday_year0 = zday0 618 !accumulates days of previous months of this year 619 620 DO js = 1, zmonth0 621 IF(nleapy > 1) THEN 622 zday_year0 = zday_year0 + nleapy 623 ELSE 624 IF( MOD(zyear0, 4 ) == 0 ) THEN 625 zday_year0 = zday_year0 + nbiss(js) 626 ELSE 627 zday_year0 = zday_year0 + nobis(js) 628 ENDIF 629 ENDIF 630 END DO 631 ! day (in hours) since january the 1st 632 ztime = FLOAT( kt ) * rdt / (rmmss * rhhmm) & ! incrementation in hour 633 & - (nyear - 1) * rjjhh * raajj & ! - nber of hours the precedent years 634 & + zday_year0 / 24 ! nber of hours initial date 635 ! day 21th counted since the 1st January 636 zdaymax = 21 ! 21th day of the month 637 DO js = 1, 5 ! count each day until end May 638 IF(nleapy > 1) THEN 639 zdaymax = zdaymax + nleapy 640 ELSE 641 IF( MOD(zyear0, 4 ) == 0 ) THEN 642 zdaymax = zdaymax + nbiss(js) 643 ELSE 644 zdaymax = zdaymax + nobis(js) 645 ENDIF 646 ENDIF 647 END DO 648 ! 21th june in hours 649 ztimemax = zdaymax * 24 650 ! 21th december day in hours 613 zyear0 = ndate0 / 10000 ! initial year 614 zmonth0 = ( ndate0 - zyear0 * 10000 ) / 100 ! initial month 615 zday0 = ndate0 - zyear0 * 10000 - zmonth0 * 100 ! initial day betwen 1 and 30 616 zday_year0= (zmonth0-1)*30.+zday0 ! initial day betwen 1 and 360 617 618 ! current day (in hours) since january the 1st of the current year 619 ztime = FLOAT( kt ) * rdt / (rmmss * rhhmm) & ! total incrementation (in hours) 620 & - (nyear - 1) * rjjhh * raajj ! minus years since beginning of experiment (in hours) 621 622 ! 21th june at 24h in hours 623 ztimemax1 = ((5.*30.)+21.)* 24. 624 ! 21th december in hours 651 625 ! rjjhh * raajj / 4 = 1 seasonal cycle in hours 652 ztimemin = ztimemax + rjjhh * raajj / 2 626 ztimemin1 = ztimemax1 + rjjhh * raajj / 2 627 ! 21th july at 24h in hours 628 ztimemax2 = ((6.*30.)+21.)* 24. 629 ! 21th january day in hours 630 ! rjjhh * raajj / 4 = 1 seasonal cycle in hours 631 ztimemin2 = ztimemax2 - rjjhh * raajj / 2 632 653 633 ! amplitudes 654 634 zemp_S = 0.7 ! intensity of COS in the South … … 656 636 zemp_sais= 0.1 657 637 zTstar = 28.3 ! intemsity from 28.3 a -5 deg 638 658 639 ! 1/2 period between 21th June and 21th December 659 zcos_sais = COS( (ztime - ztimemax) / (ztimemin - ztimemax) * rpi ) 640 zcos_sais1 = COS( (ztime - ztimemax1) / (ztimemin1 - ztimemax1) * rpi ) 641 642 ! 1/2 period between 21th July and 21th January 643 zcos_sais2 = COS( (ztime - ztimemax2) / (ztimemax2 - ztimemin2) * rpi ) 644 660 645 ztrp= - 40. ! retroaction term (W/m2/K) 661 646 zconv = 3.16e-5 ! convert 1m/yr->3.16e-5mm/s … … 665 650 ! and 13 degC at 50N 53.5 + or - 11 = 1/4 period : 666 651 ! 64.5 in summer, 42.5 in winter 667 t_star (ji,jj) = zTstar * ( 1 + 1. / 50. * zcos_sais ) &652 t_star (ji,jj) = zTstar * ( 1 + 1. / 50. * zcos_sais2 ) & 668 653 & * COS( rpi * (gphit(ji,jj) - 5.) & 669 & / (53.5 * ( 1 + 11 / 53.5 * zcos_sais ) * 2.) )654 & / (53.5 * ( 1 + 11 / 53.5 * zcos_sais2 ) * 2.) ) 670 655 qt (ji,jj) = ztrp * ( tb(ji,jj,1) - t_star(ji,jj) ) 671 656 IF( gphit(ji,jj) >= 14.845 .AND. 37.2 >= gphit(ji,jj)) THEN … … 673 658 emp (ji,jj) = zemp_S * zconv & 674 659 & * SIN( rpi / 2 * (gphit(ji,jj) - 37.2) / (24.6 - 37.2) ) & 675 & * ( 1 - zemp_sais / zemp_S * zcos_sais )660 & * ( 1 - zemp_sais / zemp_S * zcos_sais1) 676 661 emps (ji,jj) = emp (ji,jj) 677 662 ELSE … … 679 664 emp (ji,jj) = - zemp_N * zconv & 680 665 & * SIN( rpi / 2 * (gphit(ji,jj) - 37.2) / (46.8 - 37.2) ) & 681 & * ( 1 - zemp_sais / zemp_N * zcos_sais )682 666 & * ( 1 - zemp_sais / zemp_N * zcos_sais1 ) 667 emps (ji,jj) = emp (ji,jj) 683 668 ENDIF 684 669 ! 23.5 deg : tropics 685 qsr (ji,jj) = 230 * COS( 3.1415 * ( gphit(ji,jj) - 23.5 * zcos_sais ) / ( 0.9 * 180 ) )670 qsr (ji,jj) = 230 * COS( 3.1415 * ( gphit(ji,jj) - 23.5 * zcos_sais1 ) / ( 0.9 * 180 ) ) 686 671 END DO 687 672 END DO 673 688 674 ! compute the emp flux such as its integration on the whole domain and at each time be zero 689 zsumemp = 0. 690 zsurf = 0. 675 zsumemp = 0.e0 676 zsurf = 0.e0 691 677 DO jj = 1, jpj 692 DO ji = 1, jpi693 zsumemp = zsumemp + emp(ji, jj) * tmask(ji, jj, 1)694 zsurf = zsurf + tmask(ji, jj, 1)695 END DO678 DO ji = 1, jpi 679 zsumemp = zsumemp + emp(ji,jj) * tmask(ji,jj,1) * tmask_i(ji,jj) 680 zsurf = zsurf + tmask(ji,jj,1) * tmask_i(ji,jj) 681 END DO 696 682 END DO 697 683 … … 706 692 zsumemp = zsumemp / zsurf 707 693 ENDIF 694 695 !salinity terms 708 696 DO jj = 1, jpj 709 DO ji = 1, jpi 710 emp(ji, jj) = emp(ji, jj) - zsumemp * tmask(ji, jj, 1) 711 emps(ji, jj)= emp(ji, jj) 712 END DO 697 DO ji = 1, jpi 698 erp(ji,jj) = 0.e0 699 emp(ji, jj) = emp(ji,jj) - zsumemp * tmask(ji,jj,1) 700 emps(ji, jj)= emp(ji,jj) 701 END DO 713 702 END DO 703 704 IF( kt == nit000 .AND. lwp ) THEN 705 WRITE(numout,*)' ocesbc : analytical formulation for gyre' 706 WRITE(numout,*)' ~~~~~~~ ' 707 WRITE(numout,*)' nyear = ', nyear 708 WRITE(numout,*)' ztime = ',ztime 709 WRITE(numout,*)' ztimemax1 = ',ztimemax1 710 WRITE(numout,*)' ztimemin1 = ',ztimemin1 711 WRITE(numout,*)' ztimemax2 = ',ztimemax2 712 WRITE(numout,*)' ztimemin2 = ',ztimemin2 713 WRITE(numout,*)' zyear0 = ', zyear0 714 WRITE(numout,*)' zmonth0 = ', zmonth0 715 WRITE(numout,*)' zday0 = ', zday0 716 WRITE(numout,*)' zday_year0 = ',zday_year0 717 WRITE(numout,*)' raajj = ', raajj 718 WRITE(numout,*)' zemp_S = ',zemp_S 719 WRITE(numout,*)' zemp_N = ',zemp_N 720 WRITE(numout,*)' zemp_sais = ',zemp_sais 721 WRITE(numout,*)' zTstar = ',zTstar 722 WRITE(numout,*)' zsumemp = ',zsumemp 723 WRITE(numout,*)' zsurf = ',zsurf 724 WRITE(numout,*)' ztrp = ',ztrp 725 WRITE(numout,*)' zconv = ',zconv 726 ENDIF 714 727 715 728 ELSE -
trunk/NEMO/OPA_SRC/SBC/taumod.F90
r247 r434 105 105 ztimemax, ztimemin, & ! 21th June, and 21th decem. if date0 = 1st january 106 106 ztaun ! intensity 107 INTEGER :: ji, jj , &! dummy loop indices108 js ! indice for months 107 INTEGER :: ji, jj ! dummy loop indices 108 109 109 INTEGER :: & 110 110 zyear0, & ! initial year 111 111 zmonth0, & ! initial month 112 112 zday0, & ! initial day 113 zday_year0 , &! initial day since january 1st114 zdaymax113 zday_year0 ! initial day since january 1st 114 115 115 116 116 !! * Local declarations … … 122 122 IF( cp_cfg == 'gyre' ) THEN 123 123 124 ! same wind as in Wico 125 !test date0 : ndate0 = 010203 126 zyear0 = ndate0 / 10000 127 zmonth0 = ( ndate0 - zyear0 * 10000 ) / 100 128 zday0 = ndate0 - zyear0 * 10000 - zmonth0 * 100 129 !Calculates nday_year, day since january 1st 130 zday_year0 = zday0 131 !accumulates days of previous months of this year 132 133 DO js = 1, zmonth0 134 IF(nleapy > 1) THEN 135 zday_year0 = zday_year0 + nleapy 136 ELSE 137 IF( MOD(zyear0, 4 ) == 0 ) THEN 138 zday_year0 = zday_year0 + nbiss(js) 139 ELSE 140 zday_year0 = zday_year0 + nobis(js) 141 ENDIF 142 ENDIF 143 END DO 144 145 ! day (in hours) since january the 1st 146 ztime = FLOAT( kt ) * rdt / (rmmss * rhhmm) & ! incrementation in hour 147 & - (nyear - 1) * rjjhh * raajj & ! - nber of hours the precedent years 148 & + zday_year0 / 24 ! nber of hours initial date 149 ! day 21th counted since the 1st January 150 zdaymax = 21 ! 21th day of the month 151 DO js = 1, 5 ! count each day until end May 152 IF(nleapy > 1) THEN 153 zdaymax = zdaymax + nleapy 154 ELSE 155 IF( MOD(zyear0, 4 ) == 0 ) THEN 156 zdaymax = zdaymax + nbiss(js) 157 ELSE 158 zdaymax = zdaymax + nobis(js) 159 ENDIF 160 ENDIF 161 END DO 162 ! 21th june in hours 163 ztimemax = zdaymax * 24 124 zyear0 = ndate0 / 10000 ! initial year 125 zmonth0 = ( ndate0 - zyear0 * 10000 ) / 100 ! initial month 126 zday0 = ndate0 - zyear0 * 10000 - zmonth0 * 100 ! initial day betwen 1 and 30 127 128 zday_year0 = (zmonth0-1)*30.+zday0 ! initial day betwen 1 and 360 129 130 ! current day (in hours) since january the 1st of the current year 131 ztime = FLOAT( kt ) * rdt / (rmmss * rhhmm) & ! total incrementation (in hours) 132 & - (nyear - 1) * rjjhh * raajj ! minus years since beginning of experiment (in hours) 133 134 135 ! 21th june at 24h in hours 136 ztimemax = ((5.*30.)+21.)* 24. 164 137 ! 21th december day in hours 165 138 ! rjjhh * raajj / 4 = 1 seasonal cycle in hours 166 139 ztimemin = ztimemax + rjjhh * raajj / 2 167 140 168 ! mean intensity at 0.105 ;srqt(2) because projected with 45deg angle141 ! mean intensity at 0.105/srqt(2) because projected with 45deg angle 169 142 ztau = 0.105 / SQRT(2.) 170 143 ! seasonal oscillation intensity … … 180 153 END DO 181 154 182 IF( kt == nit000 ) THEN 183 IF(lwp) WRITE(numout,*)' tau : Constant surface wind stress read in namelist' 184 IF(lwp) WRITE(numout,*)' ~~~~~~~ ' 185 IF(lwp) WRITE(numout,*)'nyear = ', nyear 186 IF(lwp) WRITE(numout,*)'nmonth = ', nmonth 187 IF(lwp) WRITE(numout,*)'nday = ', nday 188 IF(lwp) WRITE(numout,*)'nday_year = ',nday_year 189 IF(lwp) WRITE(numout,*)'ndastp = ',ndastp 190 IF(lwp) WRITE(numout,*)'adatrj = ',adatrj 191 IF(lwp) WRITE(numout,*)'ztime = ',ztime 192 IF(lwp) WRITE(numout,*)'zdaymax = ',zdaymax 193 194 IF(lwp) WRITE(numout,*)'ztimemax = ',ztimemax 195 IF(lwp) WRITE(numout,*)'ztimemin = ',ztimemin 196 IF(lwp) WRITE(numout,*)'zyear0 = ', zyear0 197 IF(lwp) WRITE(numout,*)'zmonth0 = ', zmonth0 198 IF(lwp) WRITE(numout,*)'zday0 = ', zday0 199 IF(lwp) WRITE(numout,*)'zday_year0 = ',zday_year0 200 IF(lwp) WRITE(numout,*)'nobis(2)', nobis(2) 201 IF(lwp) WRITE(numout,*)'nobis(5)', nobis(5) 202 IF(lwp) WRITE(numout,*)'nobis(6)', nobis(6) 203 IF(lwp) WRITE(numout,*)'nobis(1)', nobis(1) 204 IF(lwp) WRITE(numout,*)'nobis(zmonth0 -1)', nobis(zmonth0 - 1) 205 IF(lwp) WRITE(numout,*)'raajj = ', raajj 155 IF( kt == nit000 .AND. lwp ) THEN 156 WRITE(numout,*)' tau : analytical formulation for gyre' 157 WRITE(numout,*)' ~~~~~~~ ' 158 WRITE(numout,*)' nyear = ', nyear 159 WRITE(numout,*)' nmonth = ', nmonth 160 WRITE(numout,*)' nday = ', nday 161 WRITE(numout,*)' nday_year = ',nday_year 162 WRITE(numout,*)' ndastp = ',ndastp 163 WRITE(numout,*)' adatrj = ',adatrj 164 WRITE(numout,*)' ztime = ',ztime 165 WRITE(numout,*)' ztimemax = ',ztimemax 166 WRITE(numout,*)' ztimemin = ',ztimemin 167 WRITE(numout,*)' zyear0 = ', zyear0 168 WRITE(numout,*)' zmonth0 = ', zmonth0 169 WRITE(numout,*)' zday0 = ', zday0 170 WRITE(numout,*)' zday_year0 = ',zday_year0 171 WRITE(numout,*)' raajj = ', raajj 172 WRITE(numout,*)' ztau = ', ztau 173 WRITE(numout,*)' ztau_sais = ', ztau_sais 174 WRITE(numout,*)' ztaun = ', ztaun 206 175 ENDIF 207 176 -
trunk/NEMO/OPA_SRC/TRA/tradmp.F90
r418 r434 24 24 USE dtatem ! temperature data 25 25 USE dtasal ! salinity data 26 USE dtasss ! surface salinity data 26 27 USE zdfmxl ! mixed layer depth 27 28 USE lib_mpp ! distribued memory computing … … 47 48 !! * Module variables 48 49 INTEGER :: & !!! * newtonian damping namelist (mandmp) * 49 ndmp = -1 , & ! = 0/-1/ 'latitude' for damping over T and S50 ndmp = -1 , & ! = 0/-1/-2/'latitude' for damping over T and S 50 51 ndmpf = 2 , & ! = 1 create a damping.coeff NetCDF file 51 nmldmp = 0 ! = 0/1/2 flag for damping in the mixed layer52 nmldmp = 0 ! = 0/1/2/3 flag for damping in the mixed layer 52 53 REAL(wp) :: & !!! * newtonian damping namelist * 53 54 sdmp = 50., & ! surface time scale for internal damping (days) … … 177 178 END DO 178 179 180 CASE( 3 ) ! newtonian damping of SSS only 181 DO jj = 2, jpjm1 182 DO ji = fs_2, fs_jpim1 ! vector opt. 183 zsa = resto(ji,jj,1) * ( sss(ji,jj) - sb(ji,jj,1) ) 184 ! add the trends to the general tracer trends 185 sa(ji,jj,1) = sa(ji,jj,1) + zsa 186 ! save the salinity trend (used in flx to close the salt budget) 187 strdmp(ji,jj,1) = zsa 188 END DO 189 END DO 190 179 191 END SELECT 180 192 … … 237 249 SELECT CASE ( ndmp ) 238 250 251 CASE ( -2 ) ! GYRE: damping SSS only 252 IF(lwp) WRITE(numout,*) ' SSS damping in Gyre' 253 239 254 CASE ( -1 ) ! ORCA: damping in Red & Med Seas only 240 255 IF(lwp) WRITE(numout,*) ' tracer damping in the Med & Red seas only' … … 261 276 CASE ( 2 ) ! no damping in the mixed layer 262 277 IF(lwp) WRITE(numout,*) ' no tracer damping in the mixed layer' 278 279 CASE ( 3 ) ! SSS damping only 280 IF(lwp) WRITE(numout,*) ' SSS surface damping' 263 281 264 282 CASE DEFAULT … … 275 293 nstop = nstop + 1 276 294 ENDIF 295 296 IF( lk_dtasss .AND. ( ( ndmp /= -2 ) .OR. (nmldmp /= 3) ) ) THEN 297 IF(lwp) WRITE(numout,cform_err) 298 IF(lwp) WRITE(numout,*) ' Check namelist for SSS restoring in Gyre ' 299 IF(lwp) WRITE(numout,*) ' ndmp must be -2 and nmldmp must be 3' 300 nstop = nstop + 1 301 ENDIF 302 303 277 304 278 305 strdmp(:,:,:) = 0.e0 ! internal damping salinity trend (used in ocesbc) … … 656 683 resto(:,:,jpk) = 0.e0 657 684 685 ELSEIF( cp_cfg == "gyre" .AND. ( ndmp == -2 )) THEN 686 687 ! ! ========================= 688 ! ! SSS damping 689 ! ! ========================= 690 zsdmp = 1./(sdmp * rday) 691 IF(lwp)WRITE(numout,*) 692 IF(lwp)WRITE(numout,*) ' GYRE configuration: Damping coefficient' 693 resto(:,:, : ) = 0. 694 resto(:,:, 1 ) = zsdmp * tmask(:,:,1) 695 658 696 ELSE 659 697 ! ------------ -
trunk/NEMO/OPA_SRC/in_out_manager.F90
r420 r434 87 87 numwvo = 72 , & !: logical unit for 3d output write 88 88 numsst = 65 , & !: logical unit for surface temperature data 89 numsss = 66 , & !: logical unit for surface salinity data 89 90 numbol = 67 , & !: logical unit for "bol" diagnostics 90 91 numptr = 68 , & !: logical unit for Poleward TRansports -
trunk/NEMO/OPA_SRC/istate.F90
r392 r434 101 101 CALL istate_eel ! EEL configuration : start from pre-defined 102 102 ! ! velocity and thermohaline fields 103 ELSEIF( cp_cfg == 'gyre') THEN103 ELSEIF( cp_cfg == 'gyre' ) THEN 104 104 CALL istate_gyre ! GYRE configuration : start from pre-defined temperature 105 105 ! ! and salinity fields … … 396 396 !! 9.0 ! 04-05 (A. Koch-Larrouy) Original code 397 397 !!---------------------------------------------------------------------- 398 !! * Modules used 399 USE ioipsl 400 398 401 !! * Local variables 399 INTEGER :: ji, jj, jk ! dummy loop indices 400 !!---------------------------------------------------------------------- 401 402 IF(lwp) WRITE(numout,*) 403 IF(lwp) WRITE(numout,*) 'istate_gyre : initial analytical T and S profil deduced from LEVITUS ' 404 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 405 406 DO jk = 1, jpk 407 DO jj = 1, jpj 408 DO ji = 1, jpi 409 tn(ji,jj,jk) = ( 16. - 12. * TANH( (fsdept(ji,jj,jk) - 400) / 700 ) ) & 410 & * (-TANH( (500-fsdept(ji,jj,jk)) / 150 ) + 1) / 2 & 411 & + ( 15. * ( 1. - TANH( (fsdept(ji,jj,jk)-50.) / 1500.) ) & 412 & - 1.4 * TANH((fsdept(ji,jj,jk)-100.) / 100.) & 413 & + 7. * (1500. - fsdept(ji,jj,jk)) / 1500. ) & 414 & * (-TANH( (fsdept(ji,jj,jk) - 500) / 150) + 1) / 2 415 tn(ji,jj,jk) = tn(ji,jj,jk) * tmask(ji,jj,jk) 416 tb(ji,jj,jk) = tn(ji,jj,jk) 417 418 sn(ji,jj,jk) = ( 36.25 - 1.13 * TANH( (fsdept(ji,jj,jk) - 305) / 460 ) ) & 419 & * (-TANH((500 - fsdept(ji,jj,jk)) / 150) + 1) / 2 & 420 & + ( 35.55 + 1.25 * (5000. - fsdept(ji,jj,jk)) / 5000. & 421 & - 1.62 * TANH( (fsdept(ji,jj,jk) - 60. ) / 650. ) & 422 & + 0.2 * TANH( (fsdept(ji,jj,jk) - 35. ) / 100. ) & 423 & + 0.2 * TANH( (fsdept(ji,jj,jk) - 1000.) / 5000.) ) & 424 & * (-TANH((fsdept(ji,jj,jk) - 500) / 150) + 1) / 2 425 sn(ji,jj,jk) = sn(ji,jj,jk) * tmask(ji,jj,jk) 426 sb(ji,jj,jk) = sn(ji,jj,jk) 402 INTEGER, PARAMETER :: jpmois = 12 403 INTEGER, PARAMETER :: & 404 ntsinit = 0 ! (0/1) (analytical/input data files) T&S initialization 405 406 CHARACTER (len=32) :: clname 407 INTEGER :: ji, jj, jk ! dummy loop indices 408 INTEGER :: ipi, ipj, ipk, itime ! temporary integers 409 INTEGER, DIMENSION(jpmois) :: istep 410 411 REAL(wp) :: zdate0, zdt 412 REAL(wp), DIMENSION(jpk) :: zlev 413 REAL(wp), DIMENSION(jpi,jpj) :: zlon, zlat 414 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zt_dta, zs_dta 415 !!---------------------------------------------------------------------- 416 417 SELECT CASE ( ntsinit) 418 419 CASE ( 0 ) ! analytical T/S profil deduced from LEVITUS 420 IF(lwp) WRITE(numout,*) 421 IF(lwp) WRITE(numout,*) 'istate_gyre : initial analytical T and S profil deduced from LEVITUS ' 422 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 423 424 DO jk = 1, jpk 425 DO jj = 1, jpj 426 DO ji = 1, jpi 427 tn(ji,jj,jk) = ( 16. - 12. * TANH( (fsdept(ji,jj,jk) - 400) / 700 ) ) & 428 & * (-TANH( (500-fsdept(ji,jj,jk)) / 150 ) + 1) / 2 & 429 & + ( 15. * ( 1. - TANH( (fsdept(ji,jj,jk)-50.) / 1500.) ) & 430 & - 1.4 * TANH((fsdept(ji,jj,jk)-100.) / 100.) & 431 & + 7. * (1500. - fsdept(ji,jj,jk)) / 1500. ) & 432 & * (-TANH( (fsdept(ji,jj,jk) - 500) / 150) + 1) / 2 433 tn(ji,jj,jk) = tn(ji,jj,jk) * tmask(ji,jj,jk) 434 tb(ji,jj,jk) = tn(ji,jj,jk) 435 436 sn(ji,jj,jk) = ( 36.25 - 1.13 * TANH( (fsdept(ji,jj,jk) - 305) / 460 ) ) & 437 & * (-TANH((500 - fsdept(ji,jj,jk)) / 150) + 1) / 2 & 438 & + ( 35.55 + 1.25 * (5000. - fsdept(ji,jj,jk)) / 5000. & 439 & - 1.62 * TANH( (fsdept(ji,jj,jk) - 60. ) / 650. ) & 440 & + 0.2 * TANH( (fsdept(ji,jj,jk) - 35. ) / 100. ) & 441 & + 0.2 * TANH( (fsdept(ji,jj,jk) - 1000.) / 5000.) ) & 442 & * (-TANH((fsdept(ji,jj,jk) - 500) / 150) + 1) / 2 443 sn(ji,jj,jk) = sn(ji,jj,jk) * tmask(ji,jj,jk) 444 sb(ji,jj,jk) = sn(ji,jj,jk) 445 END DO 427 446 END DO 428 447 END DO 429 END DO 448 449 CASE ( 1 ) ! T/S data fields read in dta_tem.nc/data_sal.nc files 450 IF(lwp) WRITE(numout,*) 451 IF(lwp) WRITE(numout,*) 'istate_gyre : initial T and S read from dta_tem.nc/data_sal.nc files' 452 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 453 IF(lwp) WRITE(numout,*) ' NetCDF FORMAT' 454 455 ! Read temperature field 456 ! ---------------------- 457 ! open file 458 zdt = rdt 459 clname = 'data_tem' 460 CALL flinopen(TRIM(clname), mig(1), nlci , mjg(1), nlcj & 461 & , .false. , ipi , ipj , ipk , zlon & 462 & , zlat , zlev , itime, istep , zdate0 & 463 & , zdt , numtdt ) 464 465 ! title, dimensions and tests 466 IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN 467 IF(lwp) THEN 468 WRITE(numout,*) 469 WRITE(numout,*) 'problem with dimensions' 470 WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta 471 WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta 472 WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk 473 ENDIF 474 STOP 'istate_gyre' 475 ENDIF 476 IF(lwp) WRITE(numout,*) itime,istep(1),zdate0,zdt,numtdt 477 478 479 ! Read data 480 zt_dta(:,:,:) = 0.e0 481 CALL flinget( numtdt,'votemper',jpidta,jpjdta,jpk,1,1, & 482 & 1,mig(1),nlci,mjg(1),nlcj,zt_dta(1:nlci,1:nlcj,1:jpk)) 483 484 tn(:,:,:) = zt_dta(:,:,:)*tmask(:,:,:) 485 tb(:,:,:) = zt_dta(:,:,:)*tmask(:,:,:) 486 487 CALL flinclo( numtdt ) 488 489 IF(lwp) WRITE(numout,*) 490 IF(lwp) WRITE(numout,*) ' read temperature data ok' 491 IF(lwp) WRITE(numout,*) 492 493 ! Read salinity field 494 ! ------------------- 495 ! open file 496 zdt = rdt 497 clname = 'data_sal' 498 CALL flinopen(TRIM(clname), mig(1), nlci , mjg(1), nlcj & 499 & , .false. , ipi , ipj , ipk , zlon & 500 & , zlat , zlev , itime, istep , zdate0 & 501 & , zdt , numsdt ) 502 503 ! title, dimensions and tests 504 505 IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN 506 IF(lwp) THEN 507 WRITE(numout,*) 508 WRITE(numout,*) 'problem with dimensions' 509 WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta 510 WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta 511 WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk 512 ENDIF 513 STOP 'istate_gyre' 514 ENDIF 515 IF(lwp) WRITE(numout,*) itime,istep(1),zdate0,zdt,numsdt 516 517 ! Read data 518 zs_dta(:,:,:) = 0.e0 519 CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,1,1, & 520 & 1,mig(1),nlci,mjg(1),nlcj,zs_dta(1:nlci,1:nlcj,1:jpk)) 521 522 sn(:,:,:) = zs_dta(:,:,:)*tmask(:,:,:) 523 sb(:,:,:) = zs_dta(:,:,:)*tmask(:,:,:) 524 525 CALL flinclo( numsdt ) 526 527 IF(lwp) WRITE(numout,*) 528 IF(lwp) WRITE(numout,*) ' read salinity data ok' 529 IF(lwp) WRITE(numout,*) 530 531 END SELECT 430 532 431 533 IF(lwp) THEN -
trunk/NEMO/OPA_SRC/mppini.F90
r389 r434 143 143 iimppt, ijmppt, ilcit, ilcjt ! temporary workspace 144 144 REAL(wp) :: zidom, zjdom ! temporary scalars 145 CHARACTER(len=80) :: clname146 145 !!---------------------------------------------------------------------- 147 146 … … 351 350 IF (lwp) THEN 352 351 inum = 11 353 clname = 'layout.dat' 354 CALL ctlopn(inum, clname, 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL', 1, numout, lwp, 0)355 352 353 OPEN(inum,FILE='layout.dat') 354 WRITE(inum,'(a)') ' jpnij jpi jpj jpk jpiglo jpjglo' 356 355 WRITE(inum,'(6i8)') jpnij,jpi,jpj,jpk,jpiglo,jpjglo 357 356 WRITE(inum,'(a)') 'NAREA nlci nlcj nldi nldj nlei nlej nimpp njmpp' -
trunk/NEMO/OPA_SRC/par_GYRE.h90
r392 r434 24 24 jpidta = 30*jp_cfg+2, & !: 1st horizontal dimension ( >= jpi ) 25 25 jpjdta = 20*jp_cfg+2, & !: 2nd " " ( >= jpj ) 26 jpkdta = 101,& !: number of levels ( >= jpk )26 jpkdta = 31, & !: number of levels ( >= jpk ) 27 27 28 28 ! global domain size !!! * full domain * … … 76 76 77 77 REAL(wp), PARAMETER :: & !: 78 & ppsur = 0.e0 , & !: Computed in domzgr79 & ppa0 = 0.e0, & !:80 & ppa1 = 0.e0, & !:78 & ppsur = -2033.194295283385_wp , & !: 79 & ppa0 = 155.8325369664153_wp , & !: 80 & ppa1 = 146.3615918601890_wp , & !: 81 81 ! 82 82 & ppkth = 17.28520372419791_wp , & !: (non dimensional): gives the approximate … … 92 92 !! 93 93 REAL(wp), PARAMETER :: & !: 94 & ppdzmin = 1.0e0, & !: (meters): depth of the top (first) model layer94 & ppdzmin = pp_not_used , & !: (meters): depth of the top (first) model layer 95 95 ! ! depth of second "w" level 96 & pphmax = 5000.!: (meters): maximum depth of the ocean96 & pphmax = pp_not_used !: (meters): maximum depth of the ocean 97 97 ! ! depth of the last "w" level 98 98 -
trunk/NEMO/OPA_SRC/step.F90
r414 r434 23 23 USE dtasal ! ocean salinity data (dta_sal routine) 24 24 USE dtasst ! ocean sea surface temperature (dta_sst routine) 25 USE dtasss ! ocean sea surface salinity (dta_sss routine) 25 26 USE taumod ! surface stress (tau routine) 26 27 USE flxmod ! thermohaline fluxes (flx routine) … … 205 206 IF( lk_dtasst ) CALL dta_sst( kstp ) ! Sea Surface Temperature data 206 207 208 IF( lk_dtasss ) CALL dta_sss( kstp ) ! Sea Surface salinity data 209 207 210 IF( lk_obc ) CALL obc_dta( kstp ) ! update dynamic and tracer data at open boundaries 208 211
Note: See TracChangeset
for help on using the changeset viewer.