- Timestamp:
- Apr 25, 2025, 10:57:05 AM (3 months ago)
- Location:
- trunk/LMDZ.PLUTO/libf/phypluto
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.PLUTO/libf/phypluto/iostart.F90
r3709 r3736 4 4 PRIVATE 5 5 INTEGER,SAVE :: nid_start ! NetCDF file identifier for startfi.nc file 6 INTEGER,SAVE :: nid_restart ! NetCDF file identifier for restartfi.nc file7 !$OMP THREADPRIVATE(nid_start ,nid_restart)8 6 ! INTEGER,SAVE :: nid_restart ! NetCDF file identifier for restartfi.nc file 7 !$OMP THREADPRIVATE(nid_start) 8 9 9 ! restartfi.nc file dimension identifiers: (see open_restartphy()) 10 10 INTEGER,SAVE :: idim1 ! "index" dimension … … 16 16 INTEGER,SAVE :: idim7 ! "Time" dimension 17 17 INTEGER,SAVE :: idim8 ! "ocean_layers" dimension 18 !$OMP THREADPRIVATE(idim1,idim2,idim3,idim4,idim5,idim6,idim7,idim8) 19 INTEGER,SAVE :: idim10 ! "descriptor" dimension 20 INTEGER,SAVE :: idim11 ! "description_size" dimension 18 21 INTEGER,SAVE :: timeindex ! current time index (for time-dependent fields) 19 !$OMP THREADPRIVATE(idim1 ,idim2,idim3,idim4,idim5,idim6,idim7,timeindex)22 !$OMP THREADPRIVATE(idim10,idim11,timeindex) 20 23 INTEGER,PARAMETER :: length=100 ! size of tab_cntrl array 21 24 INTEGER,PARAMETER :: ldscrpt = 35 ! size of dscrpt_tab_cntrl array 25 INTEGER,PARAMETER :: ndscrpt = 50 ! size of characters in dscrpt_tab_cntrl array 26 22 27 INTERFACE get_field 23 28 MODULE PROCEDURE Get_field_r1,Get_field_r2,Get_field_r3 24 29 END INTERFACE get_field 25 30 26 31 INTERFACE get_var 27 32 MODULE PROCEDURE get_var_r0,Get_var_r1,Get_var_r2,Get_var_r3 … … 33 38 34 39 INTERFACE put_var 35 MODULE PROCEDURE put_var_r0,put_var_r1,put_var_r2,put_var_r3 40 MODULE PROCEDURE put_var_r0,put_var_r1,put_var_r2,put_var_r3,put_var_c1 36 41 END INTERFACE put_var 37 42 38 PUBLIC nid_start, length 43 PUBLIC nid_start, length, ldscrpt, ndscrpt 39 44 PUBLIC get_field,get_var,put_field,put_var 40 45 PUBLIC inquire_dimension, inquire_dimension_length 41 46 PUBLIC inquire_field, inquire_field_ndims 42 PUBLIC open_startphy,close_startphy, open_restartphy,close_restartphy43 47 PUBLIC open_startphy,close_startphy,create_restartphy,open_restartphy,close_restartphy 48 44 49 CONTAINS 45 50 46 SUBROUTINE open_startphy(filename )51 SUBROUTINE open_startphy(filename,nid_start) 47 52 USE netcdf, only: NF90_OPEN, NF90_NOERR, NF90_NOWRITE, nf90_strerror 48 53 USE mod_phys_lmdz_para, only: is_master, bcast 49 54 IMPLICIT NONE 50 CHARACTER(LEN=*) :: filename 51 INTEGER :: ierr 55 CHARACTER(LEN=*) :: filename 56 INTEGER,INTENT(INOUT) :: nid_start 57 INTEGER :: ierr 52 58 53 59 IF (is_master) THEN … … 56 62 write(*,*)'open_startphy: problem opening file '//trim(filename) 57 63 write(*,*)trim(nf90_strerror(ierr)) 58 CALL abort_physic("open_startphy"," Failed openingfile",1)59 ENDIF 60 ENDIF 61 64 CALL abort_physic("open_startphy","Cannot open file",1) 65 ENDIF 66 ENDIF 67 62 68 CALL bcast(nid_start) ! tell all procs about nid_start 63 69 64 70 END SUBROUTINE open_startphy 65 71 66 SUBROUTINE close_startphy 72 SUBROUTINE close_startphy(nid_start) 67 73 USE netcdf, only: NF90_CLOSE 68 74 USE mod_phys_lmdz_para, only: is_master 69 75 IMPLICIT NONE 70 INTEGER :: ierr 76 INTEGER,INTENT(IN) :: nid_start 77 INTEGER :: ierr 71 78 72 79 IF (is_master) THEN … … 77 84 78 85 79 FUNCTION inquire_field( Field_name)86 FUNCTION inquire_field(nid_start,Field_name) 80 87 ! check if a given field is present in the input file 81 88 USE netcdf, only: NF90_INQ_VARID, NF90_NOERR 82 89 USE mod_phys_lmdz_para, only: is_master, bcast 83 90 IMPLICIT NONE 91 INTEGER,INTENT(IN) :: nid_start 84 92 CHARACTER(LEN=*),INTENT(IN) :: Field_name 85 93 LOGICAL :: inquire_field 86 94 INTEGER :: varid 87 95 INTEGER :: ierr 88 96 89 97 IF (is_master) THEN 90 98 ierr=NF90_INQ_VARID(nid_start,Field_name,varid) … … 101 109 102 110 103 FUNCTION inquire_field_ndims( Field_name)104 ! give the number of dimensions of "Field_name" stored in the input file 111 FUNCTION inquire_field_ndims(nid_start,Field_name) 112 ! give the number of dimensions of "Field_name" stored in the input file 105 113 USE netcdf, only: nf90_inq_varid, nf90_inquire_variable, & 106 114 NF90_NOERR, nf90_strerror 107 115 USE mod_phys_lmdz_para, only: is_master, bcast 108 116 IMPLICIT NONE 117 INTEGER,INTENT(IN) :: nid_start 109 118 CHARACTER(LEN=*),INTENT(IN) :: Field_name 110 119 INTEGER :: inquire_field_ndims 111 120 INTEGER :: varid 112 121 INTEGER :: ierr 113 122 114 123 IF (is_master) THEN 115 124 ierr=nf90_inq_varid(nid_start,Field_name,varid) … … 120 129 //trim(field_name) 121 130 write(*,*)trim(nf90_strerror(ierr)) 122 CALL abort_physic("inquire_field_ndims","Failed getingndims",1)131 CALL abort_physic("inquire_field_ndims","Failed to get ndims",1) 123 132 ENDIF 124 133 ENDIF … … 129 138 130 139 131 FUNCTION inquire_dimension( Field_name)140 FUNCTION inquire_dimension(nid_start,Field_name) 132 141 ! check if a given dimension is present in the input file 133 142 USE netcdf, only: nf90_inq_dimid, NF90_NOERR 134 143 USE mod_phys_lmdz_para, only: is_master, bcast 135 144 IMPLICIT NONE 145 INTEGER,INTENT(IN) :: nid_start 136 146 CHARACTER(LEN=*),INTENT(IN) :: Field_name 137 147 LOGICAL :: inquire_dimension 138 148 INTEGER :: varid 139 149 INTEGER :: ierr 140 150 141 151 IF (is_master) THEN 142 152 ierr=NF90_INQ_DIMID(nid_start,Field_name,varid) … … 152 162 END FUNCTION inquire_dimension 153 163 154 FUNCTION inquire_dimension_length( Field_name)164 FUNCTION inquire_dimension_length(nid_start,Field_name) 155 165 ! give the length of the "Field_name" dimension stored in the input file 156 166 USE netcdf, only: nf90_inquire_dimension, nf90_inq_dimid, & … … 158 168 USE mod_phys_lmdz_para, only: is_master, bcast 159 169 IMPLICIT NONE 170 INTEGER,INTENT(IN) :: nid_start 160 171 CHARACTER(LEN=*),INTENT(IN) :: Field_name 161 172 INTEGER :: inquire_dimension_length 162 173 INTEGER :: varid 163 174 INTEGER :: ierr 164 175 165 176 IF (is_master) THEN 166 177 ierr=nf90_inq_dimid(nid_start,Field_name,varid) … … 171 182 //trim(field_name) 172 183 write(*,*)trim(nf90_strerror(ierr)) 173 CALL abort_physic("inquire_ dimension_length","Failed geting dimlength",1)184 CALL abort_physic("inquire_field_ndims","Failed to get length",1) 174 185 ENDIF 175 186 ENDIF … … 181 192 182 193 183 SUBROUTINE Get_Field_r1( field_name,field,found,timeindex)194 SUBROUTINE Get_Field_r1(nid_start,field_name,field,found,timeindex) 184 195 ! For a surface field 185 196 use mod_grid_phy_lmdz, only: klon_glo ! number of atmospheric columns (full grid) 186 197 IMPLICIT NONE 198 INTEGER,INTENT(IN) :: nid_start 187 199 CHARACTER(LEN=*),INTENT(IN) :: Field_name 188 200 REAL,INTENT(INOUT) :: Field(:) 189 LOGICAL,INTENT(OUT),OPTIONAL :: found 201 LOGICAL,INTENT(OUT),OPTIONAL :: found 190 202 INTEGER,INTENT(IN),OPTIONAL :: timeindex ! time index of sought data 191 203 … … 200 212 201 213 IF (PRESENT(found)) THEN 202 CALL Get_field_rgen( field_name,field,1,corners,edges,found)214 CALL Get_field_rgen(nid_start,field_name,field,1,corners,edges,found) 203 215 ELSE 204 CALL Get_field_rgen( field_name,field,1,corners,edges)205 ENDIF 206 216 CALL Get_field_rgen(nid_start,field_name,field,1,corners,edges) 217 ENDIF 218 207 219 END SUBROUTINE Get_Field_r1 208 209 SUBROUTINE Get_Field_r2( field_name,field,found,timeindex)220 221 SUBROUTINE Get_Field_r2(nid_start,field_name,field,found,timeindex) 210 222 ! For a "3D" horizontal-vertical field 211 223 use mod_grid_phy_lmdz, only: klon_glo ! number of atmospheric columns (full grid) 212 224 IMPLICIT NONE 225 INTEGER,INTENT(IN) :: nid_start 213 226 CHARACTER(LEN=*),INTENT(IN) :: Field_name 214 227 REAL,INTENT(INOUT) :: Field(:,:) 215 LOGICAL,INTENT(OUT),OPTIONAL :: found 228 LOGICAL,INTENT(OUT),OPTIONAL :: found 216 229 INTEGER,INTENT(IN),OPTIONAL :: timeindex ! time index of sought data 217 230 … … 225 238 corners(3)=timeindex 226 239 endif 227 240 228 241 IF (PRESENT(found)) THEN 229 CALL Get_field_rgen( field_name,field,size(field,2),&242 CALL Get_field_rgen(nid_start,field_name,field,size(field,2),& 230 243 corners,edges,found) 231 244 ELSE 232 CALL Get_field_rgen( field_name,field,size(field,2),&245 CALL Get_field_rgen(nid_start,field_name,field,size(field,2),& 233 246 corners,edges) 234 247 ENDIF 235 248 236 249 237 250 END SUBROUTINE Get_Field_r2 238 239 SUBROUTINE Get_Field_r3( field_name,field,found,timeindex)251 252 SUBROUTINE Get_Field_r3(nid_start,field_name,field,found,timeindex) 240 253 ! for a "4D" field surf/alt/?? 241 254 use mod_grid_phy_lmdz, only: klon_glo ! number of atmospheric columns (full grid) 242 255 IMPLICIT NONE 256 INTEGER,INTENT(IN) :: nid_start 243 257 CHARACTER(LEN=*),INTENT(IN) :: Field_name 244 258 REAL,INTENT(INOUT) :: Field(:,:,:) 245 LOGICAL,INTENT(OUT),OPTIONAL :: found 259 LOGICAL,INTENT(OUT),OPTIONAL :: found 246 260 INTEGER,INTENT(IN),OPTIONAL :: timeindex ! time index of sought data 247 261 … … 256 270 corners(4)=timeindex 257 271 endif 258 272 259 273 IF (PRESENT(found)) THEN 260 CALL Get_field_rgen( field_name,field,size(field,2)*size(field,3),&274 CALL Get_field_rgen(nid_start,field_name,field,size(field,2)*size(field,3),& 261 275 corners,edges,found) 262 276 ELSE 263 CALL Get_field_rgen( field_name,field,size(field,2)*size(field,3),&277 CALL Get_field_rgen(nid_start,field_name,field,size(field,2)*size(field,3),& 264 278 corners,edges) 265 279 ENDIF 266 280 267 281 END SUBROUTINE Get_Field_r3 268 269 SUBROUTINE Get_field_rgen( field_name,field,field_size, &282 283 SUBROUTINE Get_field_rgen(nid_start,field_name,field,field_size, & 270 284 corners,edges,found) 271 285 USE netcdf, ONLY: NF90_INQ_VARID, NF90_GET_VAR, NF90_NOERR … … 275 289 USE mod_phys_lmdz_para, ONLY: is_master, bcast, scatter, gather 276 290 IMPLICIT NONE 291 INTEGER,INTENT(IN) :: nid_start 277 292 CHARACTER(LEN=*),INTENT(IN) :: Field_name 278 293 INTEGER,INTENT(IN) :: field_size … … 281 296 INTEGER,INTENT(IN) :: edges(4) 282 297 LOGICAL,OPTIONAL,INTENT(OUT) :: found 283 284 REAL :: field_glo(klon_glo,field_size) ! field on global grid298 299 REAL :: field_glo(klon_glo,field_size) ! field on global grid 285 300 REAL :: field_glo_tmp(klon_glo,field_size) 286 301 INTEGER :: ind_cell_glo_glo(klon_glo) ! cell indexes on global grid 287 288 302 LOGICAL :: tmp_found 289 303 INTEGER :: varid 290 304 INTEGER :: ierr, i 291 305 292 306 ! gather columns indexes on global grid 293 307 CALL gather(ind_cell_glo,ind_cell_glo_glo) 294 295 IF (is_master) THEN 296 308 309 IF (is_master) THEN 310 297 311 ierr=NF90_INQ_VARID(nid_start,Field_name,varid) 298 312 299 313 IF (ierr==NF90_NOERR) THEN 300 CALL body(field_glo_tmp )314 CALL body(field_glo_tmp,nid_start) 301 315 tmp_found=.TRUE. 302 316 ELSE 303 317 tmp_found=.FALSE. 304 318 ENDIF 305 319 306 320 ENDIF ! of IF (is_master) 307 321 308 322 CALL bcast(tmp_found) 309 323 … … 317 331 CALL scatter(field_glo,field) 318 332 ENDIF 319 333 320 334 IF (PRESENT(found)) THEN 321 335 found=tmp_found … … 323 337 IF (.NOT. tmp_found) THEN 324 338 PRINT*, 'get_field_rgen: Field <'//field_name//'> not found' 325 CALL abort _physic("get_field_rgen","Field not found",1)326 ENDIF 327 ENDIF 328 329 339 CALL abort 340 ENDIF 341 ENDIF 342 343 330 344 CONTAINS 331 332 SUBROUTINE body(field_glo )345 346 SUBROUTINE body(field_glo,nid_start) 333 347 REAL :: field_glo(klon_glo*field_size) 348 INTEGER,INTENT(IN) :: nid_start 334 349 ierr=NF90_GET_VAR(nid_start,varid,field_glo,corners,edges) 335 350 IF (ierr/=NF90_NOERR) THEN 336 ! La variable exist dans le fichier mais la lecture a echouee. 351 ! La variable exist dans le fichier mais la lecture a echouee. 337 352 PRINT*, 'get_field_rgen: Failed reading <'//field_name//'>' 338 353 … … 345 360 346 361 347 SUBROUTINE get_var_r0( var_name,var,found)362 SUBROUTINE get_var_r0(nid_start,var_name,var,found) 348 363 ! Get a scalar from input file 349 IMPLICIT NONE 364 IMPLICIT NONE 365 INTEGER,INTENT(IN) :: nid_start 350 366 CHARACTER(LEN=*),INTENT(IN) :: var_name 351 367 REAL,INTENT(INOUT) :: var … … 353 369 354 370 REAL :: varout(1) 355 371 356 372 IF (PRESENT(found)) THEN 357 CALL Get_var_rgen( var_name,varout,size(varout),found)373 CALL Get_var_rgen(nid_start,var_name,varout,size(varout),found) 358 374 ELSE 359 CALL Get_var_rgen( var_name,varout,size(varout))375 CALL Get_var_rgen(nid_start,var_name,varout,size(varout)) 360 376 ENDIF 361 377 var=varout(1) 362 378 363 379 END SUBROUTINE get_var_r0 364 380 365 SUBROUTINE get_var_r1( var_name,var,found)381 SUBROUTINE get_var_r1(nid_start,var_name,var,found) 366 382 ! Get a vector from input file 367 IMPLICIT NONE 383 IMPLICIT NONE 368 384 CHARACTER(LEN=*),INTENT(IN) :: var_name 369 385 REAL,INTENT(INOUT) :: var(:) 370 386 LOGICAL,OPTIONAL,INTENT(OUT) :: found 371 387 INTEGER,INTENT(IN) :: nid_start 388 372 389 IF (PRESENT(found)) THEN 373 CALL Get_var_rgen( var_name,var,size(var),found)390 CALL Get_var_rgen(nid_start,var_name,var,size(var),found) 374 391 ELSE 375 CALL Get_var_rgen( var_name,var,size(var))376 ENDIF 377 392 CALL Get_var_rgen(nid_start,var_name,var,size(var)) 393 ENDIF 394 378 395 END SUBROUTINE get_var_r1 379 396 380 SUBROUTINE get_var_r2( var_name,var,found)397 SUBROUTINE get_var_r2(nid_start,var_name,var,found) 381 398 ! Get a 2D field from input file 382 IMPLICIT NONE 399 IMPLICIT NONE 383 400 CHARACTER(LEN=*),INTENT(IN) :: var_name 384 401 REAL,INTENT(OUT) :: var(:,:) 385 402 LOGICAL,OPTIONAL,INTENT(OUT) :: found 386 403 INTEGER,INTENT(IN) :: nid_start 404 387 405 IF (PRESENT(found)) THEN 388 CALL Get_var_rgen( var_name,var,size(var),found)406 CALL Get_var_rgen(nid_start,var_name,var,size(var),found) 389 407 ELSE 390 CALL Get_var_rgen( var_name,var,size(var))391 ENDIF 392 408 CALL Get_var_rgen(nid_start,var_name,var,size(var)) 409 ENDIF 410 393 411 END SUBROUTINE get_var_r2 394 412 395 SUBROUTINE get_var_r3( var_name,var,found)413 SUBROUTINE get_var_r3(nid_start,var_name,var,found) 396 414 ! Get a 3D field frominput file 397 IMPLICIT NONE 415 IMPLICIT NONE 398 416 CHARACTER(LEN=*),INTENT(IN) :: var_name 399 417 REAL,INTENT(INOUT) :: var(:,:,:) 400 418 LOGICAL,OPTIONAL,INTENT(OUT) :: found 401 419 INTEGER,INTENT(IN) :: nid_start 420 402 421 IF (PRESENT(found)) THEN 403 CALL Get_var_rgen( var_name,var,size(var),found)422 CALL Get_var_rgen(nid_start,var_name,var,size(var),found) 404 423 ELSE 405 CALL Get_var_rgen( var_name,var,size(var))406 ENDIF 407 424 CALL Get_var_rgen(nid_start,var_name,var,size(var)) 425 ENDIF 426 408 427 END SUBROUTINE get_var_r3 409 428 410 SUBROUTINE Get_var_rgen( var_name,var,var_size,found)429 SUBROUTINE Get_var_rgen(nid_start,var_name,var,var_size,found) 411 430 USE netcdf, ONLY: NF90_INQ_VARID, NF90_GET_VAR, NF90_NOERR 412 431 USE mod_phys_lmdz_para, ONLY: is_master, bcast 413 432 IMPLICIT NONE 414 CHARACTER(LEN=*) :: var_name 415 INTEGER :: var_size 416 REAL :: var(var_size) 417 LOGICAL,OPTIONAL :: found 418 433 INTEGER,INTENT(IN) :: nid_start 434 CHARACTER(LEN=*),INTENT(IN) :: var_name 435 INTEGER,INTENT(IN) :: var_size 436 REAL,INTENT(OUT) :: var(var_size) 437 LOGICAL,OPTIONAL,INTENT(OUT) :: found 438 419 439 LOGICAL :: tmp_found 420 440 INTEGER :: varid 421 441 INTEGER :: ierr 422 423 IF (is_master) THEN 424 442 443 IF (is_master) THEN 444 425 445 ierr=NF90_INQ_VARID(nid_start,var_name,varid) 426 446 427 447 IF (ierr==NF90_NOERR) THEN 428 448 ierr=NF90_GET_VAR(nid_start,varid,var) … … 435 455 tmp_found=.FALSE. 436 456 ENDIF 437 438 ENDIF 439 457 458 ENDIF 459 440 460 CALL bcast(tmp_found) 441 461 … … 443 463 CALL bcast(var) 444 464 ENDIF 445 465 446 466 IF (PRESENT(found)) THEN 447 467 found=tmp_found … … 449 469 IF (.NOT. tmp_found) THEN 450 470 PRINT*, 'phyetat0: Variable <'//trim(var_name)//'> not found' 451 CALL abort_physic("get_var_rgen"," Variable not found",1)471 CALL abort_physic("get_var_rgen","Failed to read variable",1) 452 472 ENDIF 453 473 ENDIF … … 457 477 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 458 478 459 SUBROUTINE open_restartphy(filename)479 SUBROUTINE create_restartphy(filename,nid_restart) 460 480 USE netcdf, only: NF90_CREATE, NF90_CLOBBER, NF90_64BIT_OFFSET, & 461 481 NF90_NOERR, nf90_strerror, & 462 482 NF90_PUT_ATT, NF90_GLOBAL, NF90_DEF_DIM, & 463 NF90_UNLIMITED, NF90_ENDDEF, & 464 NF90_WRITE, NF90_OPEN 483 NF90_UNLIMITED, NF90_ENDDEF 465 484 USE mod_phys_lmdz_para, only: is_master 466 485 USE mod_grid_phy_lmdz, only: klon_glo … … 469 488 USE comsoil_h, only: nsoilmx 470 489 ! USE slab_ice_h, only: noceanmx 471 ! USE ocean_slab_mod, ONLY: nslay472 490 473 491 IMPLICIT NONE 474 492 CHARACTER(LEN=*),INTENT(IN) :: filename 493 INTEGER,INTENT(INOUT) :: nid_restart 475 494 INTEGER :: ierr 476 LOGICAL,SAVE :: already_created=.false. 477 !$OMP THREADPRIVATE(already_created) 478 479 IF (is_master) THEN 480 if (.not.already_created) then 481 ! At the very first call, create the file 495 496 IF (is_master) THEN 497 482 498 ierr=NF90_CREATE(filename,IOR(NF90_CLOBBER,NF90_64BIT_OFFSET), & 483 499 nid_restart) 484 500 IF (ierr/=NF90_NOERR) THEN 485 write(*,*)' open_restartphy: problem creating file '//trim(filename)501 write(*,*)'create_restartphy: problem creating file '//trim(filename) 486 502 write(*,*)trim(nf90_strerror(ierr)) 487 CALL abort_physic(" open_restartphy","Failed to createfile",1)503 CALL abort_physic("create_restartphy","Failed creating file",1) 488 504 ENDIF 489 already_created=.true. 490 else 491 ! Just open the file 505 506 ierr=NF90_PUT_ATT(nid_restart,NF90_GLOBAL,"title",& 507 "Physics start file") 508 IF (ierr/=NF90_NOERR) THEN 509 write(*,*)'create_restartphy: problem writing title ' 510 write(*,*)trim(nf90_strerror(ierr)) 511 ENDIF 512 513 ierr=NF90_DEF_DIM(nid_restart,"index",length,idim1) 514 IF (ierr/=NF90_NOERR) THEN 515 write(*,*)'create_restartphy: problem defining index dimension ' 516 write(*,*)trim(nf90_strerror(ierr)) 517 CALL abort_physic("create_restartphy","Failed defining index",1) 518 ENDIF 519 520 ierr=NF90_DEF_DIM(nid_restart,"physical_points",klon_glo,idim2) 521 IF (ierr/=NF90_NOERR) THEN 522 write(*,*)'create_restartphy: problem defining physical_points dimension ' 523 write(*,*)trim(nf90_strerror(ierr)) 524 CALL abort_physic("create_restartphy","Failed defining physical_points",1) 525 ENDIF 526 527 ierr=NF90_DEF_DIM(nid_restart,"subsurface_layers",nsoilmx,idim3) 528 IF (ierr/=NF90_NOERR) THEN 529 write(*,*)'create_restartphy: problem defining subsurface_layers dimension ' 530 write(*,*)trim(nf90_strerror(ierr)) 531 CALL abort_physic("create_restartphy","Failed defining subsurface_layers",1) 532 ENDIF 533 534 ierr=NF90_DEF_DIM(nid_restart,"nlayer_plus_1",klevp1,idim4) 535 IF (ierr/=NF90_NOERR) THEN 536 write(*,*)'create_restartphy: problem defining nlayer_plus_1 dimension ' 537 write(*,*)trim(nf90_strerror(ierr)) 538 CALL abort_physic("create_restartphy","Failed defining nlayer_plus_1",1) 539 ENDIF 540 541 if (nqtot>0) then 542 ! only define a tracer dimension if there are tracers 543 ierr=NF90_DEF_DIM(nid_restart,"number_of_advected_fields",nqtot,idim5) 544 IF (ierr/=NF90_NOERR) THEN 545 write(*,*)'create_restartphy: problem defining number_of_advected_fields dimension ' 546 write(*,*)trim(nf90_strerror(ierr)) 547 CALL abort_physic("create_restartphy","Failed defining number_of_advected_fields",1) 548 ENDIF 549 endif 550 551 ierr=NF90_DEF_DIM(nid_restart,"nlayer",klev,idim6) 552 IF (ierr/=NF90_NOERR) THEN 553 write(*,*)'create_restartphy: problem defining nlayer dimension ' 554 write(*,*)trim(nf90_strerror(ierr)) 555 CALL abort_physic("create_restartphy","Failed defining nlayer",1) 556 ENDIF 557 558 ierr=NF90_DEF_DIM(nid_restart,"Time",NF90_UNLIMITED,idim7) 559 IF (ierr/=NF90_NOERR) THEN 560 write(*,*)'create_restartphy: problem defining Time dimension ' 561 write(*,*)trim(nf90_strerror(ierr)) 562 CALL abort_physic("create_restartphy","Failed defining Time",1) 563 ENDIF 564 565 ierr=NF90_DEF_DIM(nid_restart,"descriptor",ldscrpt,idim10) 566 IF (ierr/=NF90_NOERR) THEN 567 write(*,*)'create_restartphy: problem defining descriptor dimension ' 568 write(*,*)trim(nf90_strerror(ierr)) 569 CALL abort_physic("create_restartphy","Failed defining descriptor",1) 570 ENDIF 571 572 ierr=NF90_DEF_DIM(nid_restart,"description_size",ndscrpt,idim11) 573 IF (ierr/=NF90_NOERR) THEN 574 write(*,*)'create_restartphy: problem defining description_size dimension ' 575 write(*,*)trim(nf90_strerror(ierr)) 576 CALL abort_physic("create_restartphy","Failed defining description_size",1) 577 ENDIF 578 579 ierr=NF90_ENDDEF(nid_restart) 580 IF (ierr/=NF90_NOERR) THEN 581 write(*,*)'create_restartphy: problem ending definition mode ' 582 write(*,*)trim(nf90_strerror(ierr)) 583 CALL abort_physic("create_restartphy","Failed ending definition mode",1) 584 ENDIF 585 ENDIF 586 587 END SUBROUTINE create_restartphy 588 589 SUBROUTINE open_restartphy(filename,nid_restart) 590 USE netcdf, only: NF90_OPEN, NF90_NOERR, NF90_WRITE, nf90_strerror 591 USE mod_phys_lmdz_para, only: is_master 592 593 IMPLICIT NONE 594 CHARACTER(LEN=*),INTENT(IN) :: filename 595 INTEGER,INTENT(INOUT) :: nid_restart 596 INTEGER :: ierr 597 598 IF (is_master) THEN 492 599 ierr=NF90_OPEN(filename,NF90_WRITE,nid_restart) 493 600 IF (ierr/=NF90_NOERR) THEN 494 601 write(*,*)'open_restartphy: problem opening file '//trim(filename) 495 602 write(*,*)trim(nf90_strerror(ierr)) 496 CALL abort_physic("open_restartphy","Failed to openfile",1)603 CALL abort_physic("open_restartphy","Failed opening file",1) 497 604 ENDIF 498 return499 endif ! of if (.not.already_created)500 501 ierr=NF90_PUT_ATT(nid_restart,NF90_GLOBAL,"title",&502 "Physics start file")503 IF (ierr/=NF90_NOERR) THEN504 write(*,*)'open_restartphy: problem writing title '505 write(*,*)trim(nf90_strerror(ierr))506 ENDIF507 508 ierr=NF90_DEF_DIM(nid_restart,"index",length,idim1)509 IF (ierr/=NF90_NOERR) THEN510 write(*,*)'open_restartphy: problem defining index dimension '511 write(*,*)trim(nf90_strerror(ierr))512 CALL abort_physic("open_restartphy","Failed defining index dim",1)513 ENDIF514 515 ierr=NF90_DEF_DIM(nid_restart,"physical_points",klon_glo,idim2)516 IF (ierr/=NF90_NOERR) THEN517 write(*,*)'open_restartphy: problem defining physical_points dimension '518 write(*,*)trim(nf90_strerror(ierr))519 CALL abort_physic("open_restartphy","Failed defining physical_points dim",1)520 ENDIF521 522 ierr=NF90_DEF_DIM(nid_restart,"subsurface_layers",nsoilmx,idim3)523 IF (ierr/=NF90_NOERR) THEN524 write(*,*)'open_restartphy: problem defining subsurface_layers dimension '525 write(*,*)trim(nf90_strerror(ierr))526 CALL abort_physic("open_restartphy","Failed defining subsurface_layers dim",1)527 ENDIF528 529 ierr=NF90_DEF_DIM(nid_restart,"nlayer_plus_1",klevp1,idim4)530 IF (ierr/=NF90_NOERR) THEN531 write(*,*)'open_restartphy: problem defining nlayer_plus_1 dimension '532 write(*,*)trim(nf90_strerror(ierr))533 CALL abort_physic("open_restartphy","Failed defining nlayer_plus_1 dim",1)534 ENDIF535 536 if (nqtot>0) then537 ! only define a tracer dimension if there are tracers538 ierr=NF90_DEF_DIM(nid_restart,"number_of_advected_fields",nqtot,idim5)539 IF (ierr/=NF90_NOERR) THEN540 write(*,*)'open_restartphy: problem defining number_of_advected_fields dimension '541 write(*,*)trim(nf90_strerror(ierr))542 CALL abort_physic("open_restartphy","Failed defining number_of_advected_fields dim",1)543 ENDIF544 endif545 546 ierr=NF90_DEF_DIM(nid_restart,"nlayer",klev,idim6)547 IF (ierr/=NF90_NOERR) THEN548 write(*,*)'open_restartphy: problem defining nlayer dimension '549 write(*,*)trim(nf90_strerror(ierr))550 CALL abort_physic("open_restartphy","Failed defining nlayer dim",1)551 ENDIF552 553 ierr=NF90_DEF_DIM(nid_restart,"Time",NF90_UNLIMITED,idim7)554 IF (ierr/=NF90_NOERR) THEN555 write(*,*)'open_restartphy: problem defining Time dimension '556 write(*,*)trim(nf90_strerror(ierr))557 CALL abort_physic("open_restartphy","Failed defining Time dim",1)558 ENDIF559 560 ierr=NF90_ENDDEF(nid_restart)561 IF (ierr/=NF90_NOERR) THEN562 write(*,*)'open_restartphy: problem ending definition mode '563 write(*,*)trim(nf90_strerror(ierr))564 CALL abort_physic("open_restartphy","Failed ending definition mode",1)565 ENDIF566 605 ENDIF 567 606 568 607 END SUBROUTINE open_restartphy 569 608 570 SUBROUTINE close_restartphy 609 SUBROUTINE close_restartphy(nid_restart) 571 610 USE netcdf, only: NF90_CLOSE 572 611 USE mod_phys_lmdz_para, only: is_master 573 612 IMPLICIT NONE 574 INTEGER :: ierr 613 INTEGER,INTENT(IN) :: nid_restart 614 INTEGER :: ierr 575 615 576 616 IF (is_master) THEN 577 617 ierr = NF90_CLOSE (nid_restart) 578 618 ENDIF 579 619 580 620 END SUBROUTINE close_restartphy 581 621 582 SUBROUTINE put_field_r1( field_name,title,field,time)622 SUBROUTINE put_field_r1(nid_restart,field_name,title,field,time) 583 623 ! For a surface field 584 624 IMPLICIT NONE 625 INTEGER,INTENT(IN) :: nid_restart 585 626 CHARACTER(LEN=*),INTENT(IN) :: field_name 586 627 CHARACTER(LEN=*),INTENT(IN) :: title 587 628 REAL,INTENT(IN) :: field(:) 588 629 REAL,OPTIONAL,INTENT(IN) :: time 589 630 590 631 IF (present(time)) THEN 591 632 ! if timeindex is present, it is a time-dependent variable 592 CALL put_field_rgen( field_name,title,field,1,time)633 CALL put_field_rgen(nid_restart,field_name,title,field,1,time) 593 634 ELSE 594 CALL put_field_rgen( field_name,title,field,1)635 CALL put_field_rgen(nid_restart,field_name,title,field,1) 595 636 ENDIF 596 637 597 638 END SUBROUTINE put_field_r1 598 639 599 SUBROUTINE put_field_r2( field_name,title,field,time)640 SUBROUTINE put_field_r2(nid_restart,field_name,title,field,time) 600 641 ! For a "3D" horizontal-vertical field 601 642 IMPLICIT NONE 643 INTEGER,INTENT(IN) :: nid_restart 602 644 CHARACTER(LEN=*),INTENT(IN) :: field_name 603 645 CHARACTER(LEN=*),INTENT(IN) :: title 604 646 REAL,INTENT(IN) :: field(:,:) 605 647 REAL,OPTIONAL,INTENT(IN) :: time 606 648 607 649 IF (present(time)) THEN 608 650 ! if timeindex is present, it is a time-dependent variable 609 CALL put_field_rgen( field_name,title,field,size(field,2),time)651 CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2),time) 610 652 ELSE 611 CALL put_field_rgen( field_name,title,field,size(field,2))653 CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2)) 612 654 ENDIF 613 655 614 656 END SUBROUTINE put_field_r2 615 657 616 SUBROUTINE put_field_r3( field_name,title,field,time)658 SUBROUTINE put_field_r3(nid_restart,field_name,title,field,time) 617 659 ! For a "4D" field surf/alt/?? 618 660 IMPLICIT NONE 661 INTEGER,INTENT(IN) :: nid_restart 619 662 CHARACTER(LEN=*),INTENT(IN) :: field_name 620 663 CHARACTER(LEN=*),INTENT(IN) :: title 621 664 REAL,INTENT(IN) :: field(:,:,:) 622 665 REAL,OPTIONAL,INTENT(IN) :: time 623 666 624 667 IF (present(time)) THEN 625 668 ! if timeindex is present, it is a time-dependent variable 626 CALL put_field_rgen( field_name,title,field,size(field,2)*size(field,3),&669 CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2)*size(field,3),& 627 670 time) 628 ELSE 629 CALL put_field_rgen( field_name,title,field,size(field,2)*size(field,3))671 ELSE 672 CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2)*size(field,3)) 630 673 ENDIF 631 674 632 675 END SUBROUTINE put_field_r3 633 634 SUBROUTINE put_field_rgen( field_name,title,field,field_size,time)676 677 SUBROUTINE put_field_rgen(nid_restart,field_name,title,field,field_size,time) 635 678 USE netcdf, ONLY: NF90_REDEF, NF90_ENDDEF, NF90_DEF_VAR, NF90_PUT_ATT, & 636 679 NF90_INQ_VARID, NF90_PUT_VAR, NF90_STRERROR, & … … 641 684 USE mod_phys_lmdz_para, ONLY: is_master, gather 642 685 USE geometry_mod, ONLY: ind_cell_glo 643 644 IMPLICIT NONE 686 ! USE slab_ice_h, only: noceanmx 687 688 IMPLICIT NONE 689 INTEGER,INTENT(IN) :: nid_restart 645 690 CHARACTER(LEN=*),INTENT(IN) :: field_name 646 691 CHARACTER(LEN=*),INTENT(IN) :: title … … 648 693 REAL,INTENT(IN) :: field(klon,field_size) 649 694 REAL,OPTIONAL,INTENT(IN) :: time 650 695 651 696 REAL :: field_glo(klon_glo,field_size) 652 697 REAL :: field_glo_tmp(klon_glo,field_size) 653 698 INTEGER :: ind_cell_glo_glo(klon_glo) ! cell indexes on global grid 654 699 655 700 INTEGER :: ierr 656 701 INTEGER :: nvarid 657 702 INTEGER :: idim 658 703 INTEGER :: i 659 704 660 705 ! gather indexes on global grid 661 706 CALL gather(ind_cell_glo,ind_cell_glo_glo) 662 707 ! gather field on master 663 708 CALL gather(field,field_glo_tmp) 664 709 665 710 IF (is_master) THEN 666 711 ! reorder columns … … 668 713 field_glo(ind_cell_glo_glo(i),:)=field_glo_tmp(i,:) 669 714 ENDDO 670 715 671 716 IF (field_size==1) THEN 672 717 ! input is a 1D "surface field" array … … 838 883 endif ! of if (.not.present(time)) 839 884 840 ! ELSE IF (field_size==nslay) THEN841 ! ! input is a 2D "oceanic field" array842 ! if (.not.present(time)) then ! for a time-independent field843 ! ierr = NF90_REDEF(nid_restart)844 ! #ifdef NC_DOUBLE845 ! ierr=NF90_DEF_VAR(nid_restart,field_name,NF90_DOUBLE,&846 ! (/idim2,idim8/),nvarid)847 ! #else848 ! ierr=NF90_DEF_VAR(nid_restart,field_name,NF90_FLOAT,&849 ! (/idim2,idim8/),nvarid)850 ! #endif851 ! if (ierr.ne.NF90_NOERR) then852 ! write(*,*)"put_field_rgen error: failed to define "//trim(field_name)853 ! write(*,*)trim(nf90_strerror(ierr))854 ! endif855 ! IF (LEN_TRIM(title) > 0) ierr=NF90_PUT_ATT(nid_restart,nvarid,"title",title)856 ! ierr = NF90_ENDDEF(nid_restart)857 ! ierr = NF90_PUT_VAR(nid_restart,nvarid,field_glo)858 ! else859 ! ! check if the variable has already been defined:860 ! ierr=NF90_INQ_VARID(nid_restart,field_name,nvarid)861 ! if (ierr/=NF90_NOERR) then ! variable not found, define it862 ! ierr=NF90_REDEF(nid_restart)863 ! #ifdef NC_DOUBLE864 ! ierr=NF90_DEF_VAR(nid_restart,field_name,NF90_DOUBLE,&865 ! (/idim2,idim8,idim7/),nvarid)866 ! #else867 ! ierr=NF90_DEF_VAR(nid_restart,field_name,NF90_FLOAT,&868 ! (/idim2,idim8,idim7/),nvarid)869 ! #endif870 ! if (ierr.ne.NF90_NOERR) then871 ! write(*,*)"put_field_rgen error: failed to define "//trim(field_name)872 ! write(*,*)trim(nf90_strerror(ierr))873 ! endif874 ! IF (LEN_TRIM(title) > 0) ierr=NF90_PUT_ATT(nid_restart,nvarid,"title",title)875 ! ierr=NF90_ENDDEF(nid_restart)876 ! endif877 ! ! Write the variable878 ! ierr=NF90_PUT_VAR(nid_restart,nvarid,field_glo,&879 ! start=(/1,1,timeindex/))880 881 ! endif ! of if (.not.present(time))882 883 884 885 ELSE 885 886 PRINT *, "Error phyredem(put_field_rgen) : wrong dimension for ",trim(field_name) 886 887 write(*,*) " field_size =",field_size 887 CALL abort_physic("put_field_rgen"," Wrong field dimensions",1)888 CALL abort_physic("put_field_rgen","wrong field dimension",1) 888 889 ENDIF 889 890 … … 892 893 write(*,*) " Error phyredem(put_field_rgen) : failed writing ",trim(field_name) 893 894 write(*,*)trim(nf90_strerror(ierr)) 894 call abort_physic("put_field_rgen","Failed writing variable",1)895 CALL abort_physic("put_field_rgen","Failed writing field",1) 895 896 endif 896 897 897 898 ENDIF ! of IF (is_master) 898 899 END SUBROUTINE put_field_rgen 900 901 SUBROUTINE put_var_r0( var_name,title,var)899 900 END SUBROUTINE put_field_rgen 901 902 SUBROUTINE put_var_r0(nid_restart,var_name,title,var) 902 903 ! Put a scalar in file 903 904 IMPLICIT NONE 905 INTEGER,INTENT(IN) :: nid_restart 904 906 CHARACTER(LEN=*),INTENT(IN) :: var_name 905 907 CHARACTER(LEN=*),INTENT(IN) :: title 906 908 REAL,INTENT(IN) :: var 907 909 REAL :: varin(1) 908 910 909 911 varin(1)=var 910 911 CALL put_var_rgen( var_name,title,varin,size(varin))912 913 CALL put_var_rgen(nid_restart,var_name,title,varin,size(varin)) 912 914 913 915 END SUBROUTINE put_var_r0 914 916 915 917 916 SUBROUTINE put_var_r1( var_name,title,var)918 SUBROUTINE put_var_r1(nid_restart,var_name,title,var) 917 919 ! Put a vector in file 918 920 IMPLICIT NONE 921 INTEGER,INTENT(IN) :: nid_restart 919 922 CHARACTER(LEN=*),INTENT(IN) :: var_name 920 923 CHARACTER(LEN=*),INTENT(IN) :: title 921 924 REAL,INTENT(IN) :: var(:) 922 923 CALL put_var_rgen( var_name,title,var,size(var))925 926 CALL put_var_rgen(nid_restart,var_name,title,var,size(var)) 924 927 925 928 END SUBROUTINE put_var_r1 926 927 SUBROUTINE put_var_r2( var_name,title,var)929 930 SUBROUTINE put_var_r2(nid_restart,var_name,title,var) 928 931 ! Put a 2D field in file 929 932 IMPLICIT NONE 933 INTEGER,INTENT(IN) :: nid_restart 930 934 CHARACTER(LEN=*),INTENT(IN) :: var_name 931 935 CHARACTER(LEN=*),INTENT(IN) :: title 932 936 REAL,INTENT(IN) :: var(:,:) 933 934 CALL put_var_rgen( var_name,title,var,size(var))935 936 END SUBROUTINE put_var_r2 937 938 SUBROUTINE put_var_r3( var_name,title,var)937 938 CALL put_var_rgen(nid_restart,var_name,title,var,size(var)) 939 940 END SUBROUTINE put_var_r2 941 942 SUBROUTINE put_var_r3(nid_restart,var_name,title,var) 939 943 ! Put a 3D field in file 940 944 IMPLICIT NONE 945 INTEGER,INTENT(IN) :: nid_restart 941 946 CHARACTER(LEN=*),INTENT(IN) :: var_name 942 947 CHARACTER(LEN=*),INTENT(IN) :: title 943 948 REAL,INTENT(IN) :: var(:,:,:) 944 945 CALL put_var_rgen( var_name,title,var,size(var))949 950 CALL put_var_rgen(nid_restart,var_name,title,var,size(var)) 946 951 947 952 END SUBROUTINE put_var_r3 948 953 949 SUBROUTINE put_var_rgen( var_name,title,var,var_size)954 SUBROUTINE put_var_rgen(nid_restart,var_name,title,var,var_size) 950 955 USE netcdf, only: NF90_REDEF, NF90_DEF_VAR, NF90_ENDDEF, NF90_PUT_VAR, & 951 956 NF90_FLOAT, NF90_DOUBLE, & … … 954 959 USE comsoil_h, only: nsoilmx 955 960 USE mod_phys_lmdz_para, only: is_master 956 ! USE slab_ice_h, only: noceanmx !AF24957 ! USE ocean_slab_mod, ONLY: nslay958 IMPLICIT NONE961 ! USE slab_ice_h, only: noceanmx 962 IMPLICIT NONE 963 INTEGER,INTENT(IN) :: nid_restart 959 964 CHARACTER(LEN=*),INTENT(IN) :: var_name 960 965 CHARACTER(LEN=*),INTENT(IN) :: title 961 966 INTEGER,INTENT(IN) :: var_size 962 967 REAL,INTENT(IN) :: var(var_size) 963 968 964 969 INTEGER :: ierr 965 970 INTEGER :: nvarid … … 967 972 logical,save :: firsttime=.true. 968 973 !$OMP THREADPRIVATE(firsttime) 969 974 970 975 IF (is_master) THEN 971 976 … … 984 989 IF (LEN_TRIM(title) > 0) ierr=NF90_PUT_ATT(nid_restart,nvarid,"title",title) 985 990 ierr=NF90_ENDDEF(nid_restart) 986 991 987 992 firsttime=.false. 988 993 endif … … 998 1003 write(*,*)'put_var_rgen: problem writing Time' 999 1004 write(*,*)trim(nf90_strerror(ierr)) 1000 CALL abort_physic("put_var_rgen","Failed writingTime",1)1005 CALL abort_physic("put_var_rgen","Failed to write Time",1) 1001 1006 ENDIF 1002 1007 return ! nothing left to do … … 1007 1012 ! We know it is an "mlayer" kind of 1D array 1008 1013 idim1d=idim3 1009 ! ELSEIF (var_size==nslay) THEN 1010 ! ! We know it is an "mlayer" kind of 1D array 1011 ! idim1d=idim8 1012 ELSE 1014 ELSE 1013 1015 PRINT *, "put_var_rgen error : wrong dimension" 1014 1016 write(*,*) " var_size =",var_size 1015 CALL abort_physic("put_var_rgen","Wrong field dimensions",1)1017 CALL abort_physic("put_var_rgen","Wrong variable dimension",1) 1016 1018 1017 1019 ENDIF ! of IF (var_size==length) THEN … … 1037 1039 ENDIF 1038 1040 ENDIF ! of IF (is_master) 1039 1040 END SUBROUTINE put_var_rgen 1041 1042 END SUBROUTINE put_var_rgen 1043 1044 SUBROUTINE put_var_c1(nid_restart,var_name,title,var) 1045 ! Put a vector of characters in file 1046 1047 USE netcdf, only: NF90_REDEF, NF90_DEF_VAR, NF90_ENDDEF, NF90_PUT_VAR, & 1048 NF90_CHAR, & 1049 NF90_PUT_ATT, NF90_NOERR, nf90_strerror, & 1050 nf90_inq_dimid, nf90_inquire_dimension, NF90_INQ_VARID 1051 USE mod_phys_lmdz_para, only: is_master 1052 1053 IMPLICIT NONE 1054 INTEGER,INTENT(IN) :: nid_restart 1055 CHARACTER(LEN=*),INTENT(IN) :: var_name 1056 CHARACTER(LEN=*),INTENT(IN) :: title 1057 CHARACTER(LEN=*),INTENT(IN) :: var(:) 1058 1059 INTEGER :: ierr 1060 INTEGER :: nvarid 1061 INTEGER :: idim1d_1, idim1d_2 1062 INTEGER :: var_size 1063 1064 IF (is_master) THEN 1065 1066 var_size = size(var) 1067 IF (var_size==ldscrpt) THEN 1068 ! We know it is a "controle descriptor" kind of 1D array 1069 idim1d_1=idim11 1070 idim1d_2=idim10 1071 ELSE 1072 PRINT *, "put_var_cgen error : wrong dimension" 1073 write(*,*) " var_size =",var_size 1074 CALL abort_physic("put_var_cgen","Wrong variable dimension",1) 1075 1076 ENDIF ! of IF (var_size==length) THEN 1077 1078 ! Swich to NetCDF define mode 1079 ierr=NF90_REDEF (nid_restart) 1080 ! Define the variable 1081 ierr=NF90_DEF_VAR(nid_restart,var_name,NF90_CHAR,(/idim1d_1,idim1d_2/),nvarid) 1082 ! Add a "title" attribute 1083 IF (LEN_TRIM(title)>0) ierr=NF90_PUT_ATT(nid_restart,nvarid,"title",title) 1084 ! Swich out of define mode 1085 ierr=NF90_ENDDEF(nid_restart) 1086 ! Write variable to file 1087 ierr=NF90_PUT_VAR(nid_restart,nvarid,var) 1088 IF (ierr/=NF90_NOERR) THEN 1089 write(*,*)'put_var_cgen: problem writing '//trim(var_name) 1090 write(*,*)trim(nf90_strerror(ierr)) 1091 CALL abort_physic("put_var_cgen","Failed writing variable",1) 1092 ENDIF 1093 ENDIF ! of IF (is_master) 1094 1095 END SUBROUTINE put_var_c1 1096 1097 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1098 1099 SUBROUTINE create_restart1D(filename,nid_restart) 1100 USE netcdf, only: NF90_CREATE, NF90_CLOBBER, NF90_64BIT_OFFSET, & 1101 NF90_NOERR, nf90_strerror, & 1102 NF90_PUT_ATT, NF90_GLOBAL, NF90_DEF_DIM, & 1103 NF90_UNLIMITED, NF90_ENDDEF 1104 USE mod_phys_lmdz_para, only: is_master 1105 USE mod_grid_phy_lmdz, only: klon_glo 1106 USE dimphy, only: klev, klevp1 1107 USE tracer_h, only: nqtot 1108 USE comsoil_h, only: nsoilmx 1109 ! USE slab_ice_h, only: noceanmx 1110 1111 IMPLICIT NONE 1112 CHARACTER(LEN=*),INTENT(IN) :: filename 1113 INTEGER,INTENT(INOUT) :: nid_restart 1114 INTEGER :: ierr 1115 1116 IF (is_master) THEN 1117 1118 ierr=NF90_CREATE(filename,IOR(NF90_CLOBBER,NF90_64BIT_OFFSET), & 1119 nid_restart) 1120 IF (ierr/=NF90_NOERR) THEN 1121 write(*,*)'create_restart1D: problem creating file '//trim(filename) 1122 write(*,*)trim(nf90_strerror(ierr)) 1123 CALL abort_physic("create_restart1D","Failed creating file",1) 1124 ENDIF 1125 1126 ierr=NF90_PUT_ATT(nid_restart,NF90_GLOBAL,"title",& 1127 "Physics start file") 1128 IF (ierr/=NF90_NOERR) THEN 1129 write(*,*)'create_restart1D: problem writing title ' 1130 write(*,*)trim(nf90_strerror(ierr)) 1131 ENDIF 1132 1133 ierr=NF90_DEF_DIM(nid_restart,"physical_points",klon_glo,idim2) 1134 IF (ierr/=NF90_NOERR) THEN 1135 write(*,*)'create_restart1D: problem defining physical_points dimension ' 1136 write(*,*)trim(nf90_strerror(ierr)) 1137 CALL abort_physic("create_restart1D","Failed defining physical_points",1) 1138 ENDIF 1139 1140 ierr=NF90_DEF_DIM(nid_restart,"nlayer",klev,idim6) 1141 IF (ierr/=NF90_NOERR) THEN 1142 write(*,*)'create_restart1D: problem defining nlayer dimension ' 1143 write(*,*)trim(nf90_strerror(ierr)) 1144 CALL abort_physic("create_restart1D","Failed defining nlayer",1) 1145 ENDIF 1146 1147 ierr=NF90_ENDDEF(nid_restart) 1148 IF (ierr/=NF90_NOERR) THEN 1149 write(*,*)'create_restart1D: problem ending definition mode ' 1150 write(*,*)trim(nf90_strerror(ierr)) 1151 CALL abort_physic("create_restart1D","Failed ending definition mode",1) 1152 ENDIF 1153 ENDIF 1154 1155 END SUBROUTINE create_restart1D 1041 1156 1042 1157 END MODULE iostart -
trunk/LMDZ.PLUTO/libf/phypluto/phyetat0_mod.F90
r3635 r3736 4 4 5 5 real, save :: tab_cntrl_mod(100) 6 7 integer,save :: nid_start ! NetCDF file identifier for startfi.nc file 6 8 7 9 !$OMP THREADPRIVATE(tab_cntrl_mod) … … 103 105 if (startphy_file) then 104 106 ! open physics initial state file: 105 call open_startphy(fichnom )107 call open_startphy(fichnom, nid_start) 106 108 107 109 ! possibility to modify tab_cntrl in tabfi … … 118 120 if (startphy_file) then 119 121 ! Load surface geopotential: 120 call get_field( "phisfi",phisfi,found)122 call get_field(nid_start,"phisfi",phisfi,found) 121 123 if (.not.found) then 122 124 call abort_physic(modname,"Failed loading <phisfi>",1) … … 130 132 if (startphy_file) then 131 133 ! Load bare ground albedo: 132 call get_field( "albedodat",albedodat,found)134 call get_field(nid_start,"albedodat",albedodat,found) 133 135 if (.not.found) then 134 136 call abort_physic(modname,"Failed loading <albedodat>",1) … … 146 148 ! ZMEA 147 149 if (startphy_file) then 148 call get_field( "ZMEA",zmea,found)150 call get_field(nid_start,"ZMEA",zmea,found) 149 151 if (.not.found) then 150 152 call abort_physic(modname,"Failed loading <ZMEA>",1) … … 158 160 ! ZSTD 159 161 if (startphy_file) then 160 call get_field( "ZSTD",zstd,found)162 call get_field(nid_start,"ZSTD",zstd,found) 161 163 if (.not.found) then 162 164 call abort_physic(modname,"Failed loading <ZSTD>",1) … … 170 172 ! ZSIG 171 173 if (startphy_file) then 172 call get_field( "ZSIG",zsig,found)174 call get_field(nid_start,"ZSIG",zsig,found) 173 175 if (.not.found) then 174 176 call abort_physic(modname,"Failed loading <ZSIG>",1) … … 182 184 ! ZGAM 183 185 if (startphy_file) then 184 call get_field( "ZGAM",zgam,found)186 call get_field(nid_start,"ZGAM",zgam,found) 185 187 if (.not.found) then 186 188 call abort_physic(modname,"Failed loading <ZGAM>",1) … … 194 196 ! ZTHE 195 197 if (startphy_file) then 196 call get_field( "ZTHE",zthe,found)198 call get_field(nid_start,"ZTHE",zthe,found) 197 199 if (.not.found) then 198 200 call abort_physic(modname,"Failed loading <ZTHE>",1) … … 206 208 ! Surface temperature : 207 209 if (startphy_file) then 208 call get_field( "tsurf",tsurf,found,indextime)210 call get_field(nid_start,"tsurf",tsurf,found,indextime) 209 211 if (.not.found) then 210 212 call abort_physic(modname,"Failed loading <tsurf>",1) … … 218 220 ! Surface emissivity 219 221 if (startphy_file) then 220 call get_field( "emis",emis,found,indextime)222 call get_field(nid_start,"emis",emis,found,indextime) 221 223 if (.not.found) then 222 224 call abort_physic(modname,"Failed loading <emis>",1) … … 236 238 ! pbl wind variance 237 239 if (startphy_file) then 238 call get_field( "q2",q2,found,indextime)240 call get_field(nid_start,"q2",q2,found,indextime) 239 241 if (.not.found) then 240 242 call abort_physic(modname,"Failed loading <q2>",1) … … 251 253 txt=noms(iq) 252 254 if (startphy_file) then 253 call get_field( txt,qsurf(:,iq),found,indextime)255 call get_field(nid_start,txt,qsurf(:,iq),found,indextime) 254 256 if (.not.found) then 255 257 write(*,*) "phyetat0: Failed loading <",trim(txt),">" … … 283 285 ! close file: 284 286 ! 285 if (startphy_file) call close_startphy 287 if (startphy_file) call close_startphy(nid_start) 286 288 287 289 end subroutine phyetat0 -
trunk/LMDZ.PLUTO/libf/phypluto/phyredem.F90
r3735 r3736 2 2 3 3 implicit none 4 5 INTEGER,SAVE :: nid_restart ! NetCDF file identifier for restartfi.nc file 4 6 5 7 contains … … 15 17 iceradius, dtemisice, phisfi 16 18 use iostart, only : open_restartphy, close_restartphy, & 17 put_var, put_field, length 19 put_var, put_field, length, ldscrpt, ndscrpt 18 20 use mod_grid_phy_lmdz, only : klon_glo 19 21 use planete_mod, only: year_day, periastr, apoastr, peri_day, & … … 81 83 82 84 ! Create physics start file 83 call open_restartphy(filename )85 call open_restartphy(filename,nid_restart) 84 86 85 87 ! tab_cntrl() contains run parameters … … 133 135 tab_cntrl(35) = volcapa ! soil volumetric heat capacity 134 136 135 call put_var( "controle","Control parameters",tab_cntrl)137 call put_var(nid_restart,"controle","Control parameters",tab_cntrl) 136 138 137 139 ! Write the controle array descriptor … … 140 142 141 143 ! Write the mid-layer depths 142 call put_var( "soildepth","Soil mid-layer depth",mlayer)144 call put_var(nid_restart,"soildepth","Soil mid-layer depth",mlayer) 143 145 144 146 ! Write longitudes 145 call put_field( "longitude","Longitudes of physics grid",lonfi)147 call put_field(nid_restart,"longitude","Longitudes of physics grid",lonfi) 146 148 147 149 ! Write latitudes 148 call put_field( "latitude","Latitudes of physics grid",latfi)150 call put_field(nid_restart,"latitude","Latitudes of physics grid",latfi) 149 151 150 152 ! Write mesh areas 151 call put_field( "area","Mesh area",cell_area)153 call put_field(nid_restart,"area","Mesh area",cell_area) 152 154 153 155 ! Write surface geopotential 154 call put_field( "phisfi","Geopotential at the surface",phisfi)156 call put_field(nid_restart,"phisfi","Geopotential at the surface",phisfi) 155 157 156 158 ! Write surface albedo 157 !call put_field( "albedodat","Albedo of bare ground",alb)159 !call put_field(nid_restart,"albedodat","Albedo of bare ground",alb) 158 160 159 161 ! Subgrid topogaphy variables 160 call put_field( "ZMEA","Relief: mean relief",zmea)161 call put_field( "ZSTD","Relief: standard deviation",zstd)162 call put_field( "ZSIG","Relief: sigma parameter",zsig)163 call put_field( "ZGAM","Relief: gamma parameter",zgam)164 call put_field( "ZTHE","Relief: theta parameter",zthe)162 call put_field(nid_restart,"ZMEA","Relief: mean relief",zmea) 163 call put_field(nid_restart,"ZSTD","Relief: standard deviation",zstd) 164 call put_field(nid_restart,"ZSIG","Relief: sigma parameter",zsig) 165 call put_field(nid_restart,"ZGAM","Relief: gamma parameter",zgam) 166 call put_field(nid_restart,"ZTHE","Relief: theta parameter",zthe) 165 167 166 168 ! Close file 167 call close_restartphy 169 call close_restartphy(nid_restart) 168 170 169 171 end subroutine physdem0 … … 197 199 198 200 ! Open file 199 call open_restartphy(filename )201 call open_restartphy(filename, nid_restart) 200 202 201 203 ! First variable to write must be "Time", in order to correctly … … 204 206 205 207 ! Surface temperature 206 call put_field( "tsurf","Surface temperature",tsurf)208 call put_field(nid_restart,"tsurf","Surface temperature",tsurf) 207 209 208 210 ! Soil inertia 209 call put_field( "inertiedat","Soil thermal inertia",inertiesoil)211 call put_field(nid_restart,"inertiedat","Soil thermal inertia",inertiesoil) 210 212 211 213 ! Soil temperature 212 call put_field( "tsoil","Soil temperature",tsoil)214 call put_field(nid_restart,"tsoil","Soil temperature",tsoil) 213 215 214 216 ! Emissivity of the surface 215 call put_field( "emis","Surface emissivity",emis)217 call put_field(nid_restart,"emis","Surface emissivity",emis) 216 218 217 219 ! Albedo of the surface 218 call put_field( "albedodat","Albedo of bare ground",alb)220 call put_field(nid_restart,"albedodat","Albedo of bare ground",alb) 219 221 220 222 ! Planetary Boundary Layer 221 call put_field( "q2","pbl wind variance",q2)223 call put_field(nid_restart,"q2","pbl wind variance",q2) 222 224 223 225 ! cloud fraction and sea ice !AF24: removed … … 228 230 if (nq>0) then 229 231 do iq=1,nq 230 call put_field(n oms(iq),"tracer on surface",qsurf(:,iq))232 call put_field(nid_restart,noms(iq),"tracer on surface",qsurf(:,iq)) 231 233 enddo 232 234 endif ! of if (nq>0) … … 235 237 236 238 ! close file 237 CALL close_restartphy 239 CALL close_restartphy(nid_restart) 238 240 !$OMP BARRIER 239 241 -
trunk/LMDZ.PLUTO/libf/phypluto/soil_settings.F90
r3503 r3736 82 82 ! ------------------- 83 83 ! 1.1 Start by reading how many layers of soil there are 84 dimlen=inquire_dimension_length( "subsurface_layers")84 dimlen=inquire_dimension_length(nid,"subsurface_layers") 85 85 86 86 if (dimlen.ne.nsoil) then … … 98 98 99 99 ! check if olmlayer distribution matches current one 100 call get_var( "soildepth",oldmlayer,found)100 call get_var(nid,"soildepth",oldmlayer,found) 101 101 if (found) then 102 102 malpha=oldmlayer(2)/oldmlayer(1) … … 118 118 119 119 ! 1.2 Find out the # of dimensions <inertiedat> was defined as using 120 ndims=inquire_field_ndims( "inertiedat")120 ndims=inquire_field_ndims(nid,"inertiedat") 121 121 ! 1.3 Read depths values or set olddepthdef flag and values 122 122 if (ndims.eq.1) then ! we know that there is none … … 139 139 ! read <depth> coordinate 140 140 if (interpol) then !put values in oldmlayer 141 call get_var( "soildepth",oldmlayer,found)141 call get_var(nid,"soildepth",oldmlayer,found) 142 142 if (.not.found) then 143 143 if (is_master) write(*,*)'soil_settings: Problem while reading <soildepth>' 144 144 endif 145 145 else ! put values in mlayer 146 call get_var( "soildepth",mlayer,found)146 call get_var(nid,"soildepth",mlayer,found) 147 147 if (is_master) print*,"mlayer",mlayer 148 148 if (.not.found) then … … 206 206 ! Read Surface thermal inertia 207 207 allocate(surfinertia(ngrid)) 208 call get_field( "inertiedat",surfinertia,found)208 call get_field(nid,"inertiedat",surfinertia,found) 209 209 if (.not.found) then 210 210 if (is_master) write(*,*) "soil_settings: Failed loading <inertiedat>" … … 229 229 endif 230 230 endif ! of if (.not.allocated(oldinertiedat)) 231 call get_field( "inertiedat",oldinertiedat,found)231 call get_field(nid,"inertiedat",oldinertiedat,found) 232 232 if (.not.found) then 233 233 if (is_master) write(*,*) "soil_settings: Failed loading <inertiedat>" … … 235 235 endif 236 236 else ! put values in therm_i 237 call get_field( "inertiedat",inertiedat,found)237 call get_field(nid,"inertiedat",inertiedat,found) 238 238 if (.not.found) then 239 239 if (is_master) write(*,*) "soil_settings: Failed loading <inertiedat>" … … 247 247 ! ------------------------- 248 248 ! ierr=nf90_inq_varid(nid,"tsoil",nvarid) 249 ok=inquire_field( "tsoil")249 ok=inquire_field(nid,"tsoil") 250 250 ! if (ierr.ne.nf90_noerr) then 251 251 if (.not.ok) then … … 265 265 endif 266 266 endif 267 call get_field( "tsoil",oldtsoil,found)267 call get_field(nid,"tsoil",oldtsoil,found) 268 268 if (.not.found) then 269 269 if (is_master) write(*,*) "soil_settings: Failed loading <tsoil>" … … 271 271 endif 272 272 else ! put values in tsoil 273 call get_field( "tsoil",tsoil,found,timeindex=indextime)273 call get_field(nid,"tsoil",tsoil,found,timeindex=indextime) 274 274 if (.not.found) then 275 275 if (is_master) write(*,*) "soil_settings: Failed loading <tsoil>" -
trunk/LMDZ.PLUTO/libf/phypluto/tabfi_mod.F90
r3477 r3736 159 159 ! 160 160 161 call get_var( "controle",tab_cntrl,found)161 call get_var(nid,"controle",tab_cntrl,found) 162 162 if (.not.found) then 163 163 call abort_physic(modname,"Failed reading <controle> array",1)
Note: See TracChangeset
for help on using the changeset viewer.