Changeset 3605 for LMDZ6/branches/Ocean_skin/libf/phylmd/phyredem.F90
- Timestamp:
- Nov 21, 2019, 4:43:45 PM (4 years ago)
- Location:
- LMDZ6/branches/Ocean_skin
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Ocean_skin
-
LMDZ6/branches/Ocean_skin/libf/phylmd/phyredem.F90
r3458 r3605 29 29 treedrg, ds_ns, dt_ns 30 30 USE geometry_mod, ONLY : longitude_deg, latitude_deg 31 USE iostart, ONLY: open_restartphy, close_restartphy, put_field, put_var31 USE iostart, ONLY: open_restartphy, close_restartphy, enddef_restartphy, put_field, put_var 32 32 USE traclmdz_mod, ONLY : traclmdz_to_restart 33 33 USE infotrac_phy, ONLY: type_trac, niadv, tname, nbtr, nqo … … 66 66 CHARACTER (len=2) :: str2 67 67 CHARACTER (len=256) :: nam, lnam 68 INTEGER :: it, iiq 68 INTEGER :: it, iiq, pass 69 69 70 70 !====================================================================== … … 81 81 CALL open_restartphy(fichnom) 82 82 83 83 84 DO ierr = 1, length 84 85 tab_cntrl(ierr) = 0.0 … … 105 106 tab_cntrl(16) = co2_ppm0 106 107 107 CALL put_var("controle", "Parametres de controle", tab_cntrl) 108 109 CALL put_field("longitude", & 110 "Longitudes de la grille physique", longitude_deg) 111 112 CALL put_field("latitude", "Latitudes de la grille physique", latitude_deg) 113 114 ! PB ajout du masque terre/mer 115 116 CALL put_field("masque", "masque terre mer", zmasq) 117 118 ! BP ajout des fraction de chaque sous-surface 119 120 ! Get last fractions from slab ocean 121 IF (type_ocean == 'slab' .AND. version_ocean == "sicINT") THEN 122 WHERE (1.-zmasq(:).GT.EPSFRA) 123 pctsrf(:,is_oce)=(1.-fsic(:))*(1.-zmasq(:)) 124 pctsrf(:,is_sic)=fsic(:)*(1.-zmasq(:)) 125 END WHERE 126 END IF 127 128 ! 1. fraction de terre 129 130 CALL put_field("FTER", "fraction de continent", pctsrf(:, is_ter)) 131 132 ! 2. Fraction de glace de terre 133 134 CALL put_field("FLIC", "fraction glace de terre", pctsrf(:, is_lic)) 135 136 ! 3. fraction ocean 137 138 CALL put_field("FOCE", "fraction ocean", pctsrf(:, is_oce)) 139 140 ! 4. Fraction glace de mer 141 142 CALL put_field("FSIC", "fraction glace mer", pctsrf(:, is_sic)) 143 144 IF(nbsrf>99) THEN 145 PRINT*, "Trop de sous-mailles"; CALL abort_physic("phyredem", "", 1) 146 END IF 147 IF(nsoilmx>99) THEN 148 PRINT*, "Trop de sous-surfaces"; CALL abort_physic("phyredem", "", 1) 149 END IF 150 IF(nsw>99) THEN 151 PRINT*, "Trop de bandes"; CALL abort_physic("phyredem", "", 1) 152 END IF 153 154 CALL put_field_srf1("TS","Temperature",ftsol(:,:)) 108 DO pass=1,2 ! pass=1 netcdf definition ; pass=2 netcdf write 109 110 CALL put_var(pass, "controle", "Parametres de controle", tab_cntrl) 111 112 CALL put_field(pass,"longitude", & 113 "Longitudes de la grille physique", longitude_deg) 114 115 CALL put_field(pass,"latitude", "Latitudes de la grille physique", latitude_deg) 116 117 ! PB ajout du masque terre/mer 118 119 CALL put_field(pass,"masque", "masque terre mer", zmasq) 120 121 ! BP ajout des fraction de chaque sous-surface 122 123 ! Get last fractions from slab ocean 124 IF (type_ocean == 'slab' .AND. version_ocean == "sicINT") THEN 125 WHERE (1.-zmasq(:).GT.EPSFRA) 126 pctsrf(:,is_oce)=(1.-fsic(:))*(1.-zmasq(:)) 127 pctsrf(:,is_sic)=fsic(:)*(1.-zmasq(:)) 128 END WHERE 129 END IF 130 131 ! 1. fraction de terre 132 133 CALL put_field(pass,"FTER", "fraction de continent", pctsrf(:, is_ter)) 134 135 ! 2. Fraction de glace de terre 136 137 CALL put_field(pass,"FLIC", "fraction glace de terre", pctsrf(:, is_lic)) 138 139 ! 3. fraction ocean 140 141 CALL put_field(pass,"FOCE", "fraction ocean", pctsrf(:, is_oce)) 142 143 ! 4. Fraction glace de mer 144 145 CALL put_field(pass,"FSIC", "fraction glace mer", pctsrf(:, is_sic)) 146 147 IF(nbsrf>99) THEN 148 PRINT*, "Trop de sous-mailles"; CALL abort_physic("phyredem", "", 1) 149 END IF 150 IF(nsoilmx>99) THEN 151 PRINT*, "Trop de sous-surfaces"; CALL abort_physic("phyredem", "", 1) 152 END IF 153 IF(nsw>99) THEN 154 PRINT*, "Trop de bandes"; CALL abort_physic("phyredem", "", 1) 155 END IF 156 157 CALL put_field_srf1(pass,"TS","Temperature",ftsol(:,:)) 155 158 156 159 ! ================== Albedo ======================================= 157 print*,'PHYREDEM NOUVEAU'158 CALL put_field_srf2("A_dir_SW","Albedo direct",falb_dir(:,:,:))159 CALL put_field_srf2("A_dif_SW","Albedo diffus",falb_dif(:,:,:))160 161 CALL put_field_srf1("U10M", "u a 10m", u10m)162 163 CALL put_field_srf1("V10M", "v a 10m", v10m)160 print*,'PHYREDEM NOUVEAU' 161 CALL put_field_srf2(pass,"A_dir_SW","Albedo direct",falb_dir(:,:,:)) 162 CALL put_field_srf2(pass,"A_dif_SW","Albedo diffus",falb_dif(:,:,:)) 163 164 CALL put_field_srf1(pass,"U10M", "u a 10m", u10m) 165 166 CALL put_field_srf1(pass,"V10M", "v a 10m", v10m) 164 167 165 168 166 169 ! ================== Tsoil ========================================= 167 CALL put_field_srf2("Tsoil","Temperature",tsoil(:,:,:))170 CALL put_field_srf2(pass,"Tsoil","Temperature",tsoil(:,:,:)) 168 171 !FC 169 172 ! CALL put_field_srf2("treedrg","freinage arbres",treedrg(:,:,:)) 170 CALL put_field("treedrg_ter","freinage arbres",treedrg(:,:,is_ter))171 172 173 CALL put_field_srf1("QS" , "Humidite",qsurf(:,:))174 175 CALL put_field ("QSOL", "Eau dans le sol (mm)", qsol)176 177 CALL put_field_srf1("EVAP", "Evaporation", fevap(:,:))178 179 CALL put_field_srf1("SNOW", "Neige", snow(:,:))180 181 CALL put_field("RADS", "Rayonnement net a la surface", radsol)182 183 CALL put_field("solsw", "Rayonnement solaire a la surface", solsw)184 185 CALL put_field("sollw", "Rayonnement IF a la surface", sollw)186 187 CALL put_field("sollwdown", "Rayonnement down IF a la surface", sollwdown)188 189 CALL put_field("fder", "Derive de flux", fder)190 191 CALL put_field("rain_f", "precipitation liquide", rain_fall)192 193 CALL put_field("snow_f", "precipitation solide", snow_fall)194 195 CALL put_field_srf1("Z0m", "rugosite", z0m(:,:))196 197 CALL put_field_srf1("Z0h", "rugosite", z0h(:,:))198 199 CALL put_field_srf1("AGESNO", "Age de la neige", agesno(:,:))200 201 CALL put_field("ZMEA", "ZMEA", zmea)202 203 CALL put_field("ZSTD", "ZSTD", zstd)204 205 CALL put_field("ZSIG", "ZSIG", zsig)206 207 CALL put_field("ZGAM", "ZGAM", zgam)208 209 CALL put_field("ZTHE", "ZTHE", zthe)210 211 CALL put_field("ZPIC", "ZPIC", zpic)212 213 CALL put_field("ZVAL", "ZVAL", zval)214 215 CALL put_field("RUGSREL", "RUGSREL", rugoro)216 217 CALL put_field("TANCIEN", "TANCIEN", t_ancien)218 219 CALL put_field("QANCIEN", "QANCIEN", q_ancien)220 221 CALL put_field("QLANCIEN", "QLANCIEN", ql_ancien)222 223 CALL put_field("QSANCIEN", "QSANCIEN", qs_ancien)224 225 CALL put_field("PRWANCIEN", "PRWANCIEN", prw_ancien)226 227 CALL put_field("PRLWANCIEN", "PRLWANCIEN", prlw_ancien)228 229 CALL put_field("PRSWANCIEN", "PRSWANCIEN", prsw_ancien)230 231 CALL put_field("UANCIEN", "UANCIEN", u_ancien)232 233 CALL put_field("VANCIEN", "VANCIEN", v_ancien)234 235 CALL put_field("CLWCON", "Eau liquide convective", clwcon)236 237 CALL put_field("RNEBCON", "Nebulosite convective", rnebcon)238 239 CALL put_field("RATQS", "Ratqs", ratqs)240 241 ! run_off_lic_0242 243 CALL put_field("RUNOFFLIC0", "Runofflic0", run_off_lic_0)244 245 ! DEB TKE PBL !246 247 IF (iflag_pbl>1) then248 CALL put_field_srf3("TKE", "Energ. Cineti. Turb.", &249 pbl_tke(:,:,:))250 CALL put_field_srf3("DELTATKE", "Del TKE wk/env.", &251 wake_delta_pbl_tke(:,:,:))252 END IF253 254 ! FIN TKE PBL !255 !IM ajout zmax0, f0, sig1, w01256 !IM wake_deltat, wake_deltaq, wake_s, wake_cstar, wake_pe, wake_fip257 258 CALL put_field("ZMAX0", "ZMAX0", zmax0)259 260 CALL put_field("F0", "F0", f0)261 262 CALL put_field("sig1", "sig1 Emanuel", sig1)263 264 CALL put_field("w01", "w01 Emanuel", w01)265 266 ! wake_deltat267 CALL put_field("WAKE_DELTAT", "WAKE_DELTAT", wake_deltat)268 269 CALL put_field("WAKE_DELTAQ", "WAKE_DELTAQ", wake_deltaq)270 271 CALL put_field("WAKE_S", "Wake frac. area", wake_s)272 273 CALL put_field("WAKE_DENS", "Wake num. /unit area", wake_dens)274 275 CALL put_field("WAKE_CSTAR", "WAKE_CSTAR", wake_cstar)276 277 CALL put_field("WAKE_PE", "WAKE_PE", wake_pe)278 279 CALL put_field("WAKE_FIP", "WAKE_FIP", wake_fip)280 281 ! thermiques282 283 CALL put_field("FM_THERM", "FM_THERM", fm_therm)284 285 CALL put_field("ENTR_THERM", "ENTR_THERM", entr_therm)286 287 CALL put_field("DETR_THERM", "DETR_THERM", detr_therm)288 289 CALL put_field("ALE_BL", "ALE_BL", ale_bl)290 291 CALL put_field("ALE_BL_TRIG", "ALE_BL_TRIG", ale_bl_trig)292 293 CALL put_field("ALP_BL", "ALP_BL", alp_bl)294 295 CALL put_field("ALE_WAKE", "ALE_WAKE", ale_wake)296 297 CALL put_field("ALE_BL_STAT", "ALE_BL_STAT", ale_bl_stat)298 299 300 ! trs from traclmdz_mod301 IF (type_trac == 'lmdz') THEN302 CALL traclmdz_to_restart(trs)303 DO it=1, nbtr173 CALL put_field(pass,"treedrg_ter","freinage arbres",treedrg(:,:,is_ter)) 174 175 176 CALL put_field_srf1(pass,"QS" , "Humidite",qsurf(:,:)) 177 178 CALL put_field (pass,"QSOL", "Eau dans le sol (mm)", qsol) 179 180 CALL put_field_srf1(pass,"EVAP", "Evaporation", fevap(:,:)) 181 182 CALL put_field_srf1(pass,"SNOW", "Neige", snow(:,:)) 183 184 CALL put_field(pass,"RADS", "Rayonnement net a la surface", radsol) 185 186 CALL put_field(pass,"solsw", "Rayonnement solaire a la surface", solsw) 187 188 CALL put_field(pass,"sollw", "Rayonnement IF a la surface", sollw) 189 190 CALL put_field(pass,"sollwdown", "Rayonnement down IF a la surface", sollwdown) 191 192 CALL put_field(pass,"fder", "Derive de flux", fder) 193 194 CALL put_field(pass,"rain_f", "precipitation liquide", rain_fall) 195 196 CALL put_field(pass,"snow_f", "precipitation solide", snow_fall) 197 198 CALL put_field_srf1(pass,"Z0m", "rugosite", z0m(:,:)) 199 200 CALL put_field_srf1(pass,"Z0h", "rugosite", z0h(:,:)) 201 202 CALL put_field_srf1(pass,"AGESNO", "Age de la neige", agesno(:,:)) 203 204 CALL put_field(pass,"ZMEA", "ZMEA", zmea) 205 206 CALL put_field(pass,"ZSTD", "ZSTD", zstd) 207 208 CALL put_field(pass,"ZSIG", "ZSIG", zsig) 209 210 CALL put_field(pass,"ZGAM", "ZGAM", zgam) 211 212 CALL put_field(pass,"ZTHE", "ZTHE", zthe) 213 214 CALL put_field(pass,"ZPIC", "ZPIC", zpic) 215 216 CALL put_field(pass,"ZVAL", "ZVAL", zval) 217 218 CALL put_field(pass,"RUGSREL", "RUGSREL", rugoro) 219 220 CALL put_field(pass,"TANCIEN", "TANCIEN", t_ancien) 221 222 CALL put_field(pass,"QANCIEN", "QANCIEN", q_ancien) 223 224 CALL put_field(pass,"QLANCIEN", "QLANCIEN", ql_ancien) 225 226 CALL put_field(pass,"QSANCIEN", "QSANCIEN", qs_ancien) 227 228 CALL put_field(pass,"PRWANCIEN", "PRWANCIEN", prw_ancien) 229 230 CALL put_field(pass,"PRLWANCIEN", "PRLWANCIEN", prlw_ancien) 231 232 CALL put_field(pass,"PRSWANCIEN", "PRSWANCIEN", prsw_ancien) 233 234 CALL put_field(pass,"UANCIEN", "UANCIEN", u_ancien) 235 236 CALL put_field(pass,"VANCIEN", "VANCIEN", v_ancien) 237 238 CALL put_field(pass,"CLWCON", "Eau liquide convective", clwcon) 239 240 CALL put_field(pass,"RNEBCON", "Nebulosite convective", rnebcon) 241 242 CALL put_field(pass,"RATQS", "Ratqs", ratqs) 243 244 ! run_off_lic_0 245 246 CALL put_field(pass,"RUNOFFLIC0", "Runofflic0", run_off_lic_0) 247 248 ! DEB TKE PBL ! 249 250 IF (iflag_pbl>1) then 251 CALL put_field_srf3(pass,"TKE", "Energ. Cineti. Turb.", & 252 pbl_tke(:,:,:)) 253 CALL put_field_srf3(pass,"DELTATKE", "Del TKE wk/env.", & 254 wake_delta_pbl_tke(:,:,:)) 255 END IF 256 257 ! FIN TKE PBL ! 258 !IM ajout zmax0, f0, sig1, w01 259 !IM wake_deltat, wake_deltaq, wake_s, wake_cstar, wake_pe, wake_fip 260 261 CALL put_field(pass,"ZMAX0", "ZMAX0", zmax0) 262 263 CALL put_field(pass,"F0", "F0", f0) 264 265 CALL put_field(pass,"sig1", "sig1 Emanuel", sig1) 266 267 CALL put_field(pass,"w01", "w01 Emanuel", w01) 268 269 ! wake_deltat 270 CALL put_field(pass,"WAKE_DELTAT", "WAKE_DELTAT", wake_deltat) 271 272 CALL put_field(pass,"WAKE_DELTAQ", "WAKE_DELTAQ", wake_deltaq) 273 274 CALL put_field(pass,"WAKE_S", "Wake frac. area", wake_s) 275 276 CALL put_field(pass,"WAKE_DENS", "Wake num. /unit area", wake_dens) 277 278 CALL put_field(pass,"WAKE_CSTAR", "WAKE_CSTAR", wake_cstar) 279 280 CALL put_field(pass,"WAKE_PE", "WAKE_PE", wake_pe) 281 282 CALL put_field(pass,"WAKE_FIP", "WAKE_FIP", wake_fip) 283 284 ! thermiques 285 286 CALL put_field(pass,"FM_THERM", "FM_THERM", fm_therm) 287 288 CALL put_field(pass,"ENTR_THERM", "ENTR_THERM", entr_therm) 289 290 CALL put_field(pass,"DETR_THERM", "DETR_THERM", detr_therm) 291 292 CALL put_field(pass,"ALE_BL", "ALE_BL", ale_bl) 293 294 CALL put_field(pass,"ALE_BL_TRIG", "ALE_BL_TRIG", ale_bl_trig) 295 296 CALL put_field(pass,"ALP_BL", "ALP_BL", alp_bl) 297 298 CALL put_field(pass,"ALE_WAKE", "ALE_WAKE", ale_wake) 299 300 CALL put_field(pass,"ALE_BL_STAT", "ALE_BL_STAT", ale_bl_stat) 301 302 303 ! trs from traclmdz_mod 304 IF (type_trac == 'lmdz') THEN 305 CALL traclmdz_to_restart(trs) 306 DO it=1, nbtr 304 307 !! iiq=niadv(it+2) ! jyg 305 iiq=niadv(it+nqo) ! jyg 306 CALL put_field("trs_"//tname(iiq), "", trs(:, it)) 307 END DO 308 IF (carbon_cycle_cpl) THEN 309 IF (.NOT. ALLOCATED(co2_send)) THEN 310 ! This is the case of create_etat0_limit, ce0l 311 ALLOCATE(co2_send(klon)) 312 co2_send(:) = co2_ppm0 308 iiq=niadv(it+nqo) ! jyg 309 CALL put_field(pass,"trs_"//tname(iiq), "", trs(:, it)) 310 END DO 311 IF (carbon_cycle_cpl) THEN 312 IF (.NOT. ALLOCATED(co2_send)) THEN 313 ! This is the case of create_etat0_limit, ce0l 314 ALLOCATE(co2_send(klon)) 315 co2_send(:) = co2_ppm0 316 END IF 317 CALL put_field(pass,"co2_send", "co2_ppm for coupling", co2_send) 318 END IF 319 END IF 320 321 ! Restart variables for Slab ocean 322 IF (type_ocean == 'slab') THEN 323 IF (nslay.EQ.1) THEN 324 CALL put_field(pass,"tslab", "Slab ocean temperature", tslab) 325 ELSE 326 DO it=1,nslay 327 WRITE(str2,'(i2.2)') it 328 CALL put_field(pass,"tslab"//str2, "Slab ocean temperature", tslab(:,it)) 329 END DO 313 330 END IF 314 CALL put_field("co2_send", "co2_ppm for coupling", co2_send) 315 END IF 316 END IF 317 318 ! Restart variables for Slab ocean 319 IF (type_ocean == 'slab') THEN 320 IF (nslay.EQ.1) THEN 321 CALL put_field("tslab", "Slab ocean temperature", tslab) 322 ELSE 323 DO it=1,nslay 324 WRITE(str2,'(i2.2)') it 325 CALL put_field("tslab"//str2, "Slab ocean temperature", tslab(:,it)) 326 END DO 327 END IF 328 IF (version_ocean == 'sicINT') THEN 329 CALL put_field("seaice", "Slab seaice (kg/m2)", seaice) 330 CALL put_field("slab_tice", "Slab sea ice temperature", tice) 331 END IF 332 END IF 333 334 if (ok_gwd_rando) call put_field("du_gwd_rando", & 335 "tendency on zonal wind due to flott gravity waves", du_gwd_rando) 336 337 IF (.not. ok_hines .and. ok_gwd_rando) call put_field("du_gwd_front", & 338 "tendency on zonal wind due to acama gravity waves", du_gwd_front) 339 340 if (activate_ocean_skin >= 1) then 341 CALL put_field("ds_ns", "delta salinity near surface", ds_ns) 342 CALL put_field("dT_ns", "delta temperature near surface", dT_ns) 343 end if 331 IF (version_ocean == 'sicINT') THEN 332 CALL put_field(pass,"seaice", "Slab seaice (kg/m2)", seaice) 333 CALL put_field(pass,"slab_tice", "Slab sea ice temperature", tice) 334 END IF 335 END IF 336 337 if (ok_gwd_rando) call put_field(pass,"du_gwd_rando", & 338 "tendency on zonal wind due to flott gravity waves", du_gwd_rando) 339 340 IF (.not. ok_hines .and. ok_gwd_rando) call put_field(pass,"du_gwd_front", & 341 "tendency on zonal wind due to acama gravity waves", du_gwd_front) 342 343 if (activate_ocean_skin >= 1) then 344 CALL put_field(pass, "ds_ns", "delta salinity near surface", ds_ns) 345 CALL put_field(pass, "dT_ns", "delta temperature near surface", dT_ns) 346 end if 347 348 IF (pass==1) CALL enddef_restartphy 349 IF (pass==2) CALL close_restartphy 350 ENDDO 344 351 345 CALL close_restartphy346 352 !$OMP BARRIER 347 353 … … 350 356 351 357 352 SUBROUTINE put_field_srf1( nam,lnam,field)358 SUBROUTINE put_field_srf1(pass,nam,lnam,field) 353 359 354 360 IMPLICIT NONE 361 INTEGER, INTENT(IN) :: pass 355 362 CHARACTER(LEN=*), INTENT(IN) :: nam, lnam 356 363 REAL, INTENT(IN) :: field(:,:) … … 360 367 nm=TRIM(nam)//TRIM(str) 361 368 lm=TRIM(lnam)//" de surface No. "//TRIM(str) 362 CALL put_field( nm,lm,field(:,nsrf))369 CALL put_field(pass,nm,lm,field(:,nsrf)) 363 370 END DO 364 371 … … 366 373 367 374 368 SUBROUTINE put_field_srf2( nam,lnam,field)375 SUBROUTINE put_field_srf2(pass,nam,lnam,field) 369 376 370 377 IMPLICIT NONE 378 INTEGER, INTENT(IN) :: pass 371 379 CHARACTER(LEN=*), INTENT(IN) :: nam, lnam 372 380 REAL, INTENT(IN) :: field(:,:,:) … … 378 386 nm=TRIM(nam)//TRIM(str) 379 387 lm=TRIM(lnam)//" du sol No. "//TRIM(str) 380 CALL put_field( nm,lm,field(:,isoil,nsrf))388 CALL put_field(pass,nm,lm,field(:,isoil,nsrf)) 381 389 END DO 382 390 END DO … … 385 393 386 394 387 SUBROUTINE put_field_srf3( nam,lnam,field)395 SUBROUTINE put_field_srf3(pass,nam,lnam,field) 388 396 389 397 IMPLICIT NONE 398 INTEGER, INTENT(IN) :: pass 390 399 CHARACTER(LEN=*), INTENT(IN) :: nam, lnam 391 400 REAL, INTENT(IN) :: field(:,:,:) … … 395 404 nm=TRIM(nam)//TRIM(str) 396 405 lm=TRIM(lnam)//TRIM(str) 397 CALL put_field( nm,lm,field(:,1:klev+1,nsrf))406 CALL put_field(pass,nm,lm,field(:,1:klev+1,nsrf)) 398 407 END DO 399 408
Note: See TracChangeset
for help on using the changeset viewer.