Changeset 3895
- Timestamp:
- 2013-05-02T14:36:47+02:00 (11 years ago)
- Location:
- branches/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM
- Files:
-
- 2 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM/CONFIG/ORCA2_LIM_CRS/EXP00/iodef.xml
r3860 r3895 349 349 <field ref="sss" name="sosaline" /> 350 350 <field ref="ssh" name="sossheig" /> 351 <field ref="eken" 351 <field ref="eken" name="energkin" /> 352 352 </file> 353 353 … … 362 362 </file> 363 363 364 <!--365 ............................................................................................................366 example of 3 types of 1d files367 ............................................................................................................368 -->369 <!-- automatic definition of the name based on id="1d_grid_T"370 => this name is used as the radical for all file names of this group371 => add a suffix to be sure that all files names of this group are different -->372 <group id="1d_grid_T" name="auto" description="ocean T grid variables" >373 <!-- mooring: automatic definition of the file name suffix based on id="0n180wT" -->374 <file id="0n180wT" name_suffix="auto" >375 <group id="0n180wT" zoom_ref="0n180wT" > <!-- group of variables sharing the same zoom -->376 <field ref="toce" name="votemper" />377 <field ref="uoce" name="vozocrtx" /> <!-- include a U-grid variable in the list => switch to T-grid -->378 <field ref="eken" name="energkin" />379 380 </group>381 </file>382 <!-- Equatorial section: automatic definition of the file name suffix based on id="EqT" -->383 <file id="EqT" name_suffix="auto" >384 <group id="EqT" zoom_ref="EqT" >385 <field ref="toce" name="votemper" />386 </group>387 </file>388 <!-- global file with different operations on data -->389 <file id="global" >390 <field ref="sst" name="sst_1d_ave" /> <!-- mean -->391 <field ref="sst" name="sst_1d_max" operation="t_max(X)" /> <!-- max -->392 <field ref="M2x" name="M2_x_elev" />393 <field ref="M2y" name="M2_y_elev" />394 </file>395 396 </group>397 398 <!-- variables available with key_float, instantaneous fields -->399 <!--400 <file id="floats" description="floats variables">401 <field ref="traj_lon" name="floats_longitude" freq_op="86400" />402 <field ref="traj_lat" name="floats_latitude" freq_op="86400" />403 <field ref="traj_dep" name="floats_depth" freq_op="86400" />404 <field ref="traj_temp" name="floats_temperature" freq_op="86400" />405 <field ref="traj_salt" name="floats_salinity" freq_op="86400" />406 <field ref="traj_dens" name="floats_density" freq_op="86400" />407 <field ref="traj_group" name="floats_group" freq_op="86400" />408 </file>409 -->410 411 364 </group> 412 365 … … 422 375 <field ref="sss" name="sosaline" /> 423 376 <field ref="ssh" name="sossheig" /> 424 <field ref="empmr" name="sowaflup" />425 <field ref="qsr" name="soshfldo" />426 <field ref="empsmr" name="sowaflcd" />427 <field ref="qt" name="sohefldo" />428 <field ref="mldr10_1" name="somxl010" />429 <field ref="mldkz5" name="somixhgt" />430 <field ref="ice_cover" name="soicecov" />431 <field ref="wspd" name="sowindsp" />432 <field ref="qrp" name="sohefldp" />433 <field ref="erp" name="sowafldp" />434 <field ref="mlddzt" name="sothedep" />435 <field ref="20d" name="so20chgt" />436 <field ref="28d" name="so28chgt" />437 <field ref="hc300" name="sohtc300" />438 <field ref="ist_ipa" name="soicetem" />439 <field ref="icealb_cea" name="soicealb" />440 377 </file> 441 378 … … 448 385 <field ref="ssh_crs" name="sossheig" /> 449 386 <field ref="hdiv_crs" name="vohdiver" /> 450 <field ref="eken_crs" name="energkin" />451 387 </file> 452 388 453 389 <file id="5d_grid_U" name="auto" description="ocean U grid variables" > 454 390 <field ref="uoce" name="vozocrtx" /> 455 <field ref="uoce_eiv" name="vozoeivu" />456 <field ref="utau" name="sozotaux" />457 391 </file> 458 392 … … 465 399 <file id="5d_grid_V" name="auto" description="ocean V grid variables" > 466 400 <field ref="voce" name="vomecrty" /> 467 <field ref="voce_eiv" name="vomeeivv" />468 <field ref="vtau" name="sometauy" />469 401 </file> 470 402 … … 477 409 <file id="5d_grid_W" name="auto" description="ocean W grid variables" > 478 410 <field ref="woce" name="vovecrtz" /> 479 <field ref="woce_eiv" name="voveeivw" />480 <field ref="avt" name="votkeavt" />481 <field ref="avt_evd" name="votkeevd" />482 <field ref="avm" name="votkeavm" />483 <field ref="avm_evd" name="votkeevm" />484 <field ref="avs" name="voddmavs" />485 <field ref="aht2d" name="soleahtw" />486 <field ref="aht2d_eiv" name="soleaeiw" />487 411 </file> 488 412 … … 491 415 </file> 492 416 493 <file id="5d_icemod" name="auto" description="ice variables" >494 <field ref="ice_pres" />495 <field ref="snowthic_cea" name="isnowthi" />496 <field ref="icethic_cea" name="iicethic" />497 <field ref="iceprod_cea" name="iiceprod" />498 <field ref="ist_ipa" name="iicetemp" />499 <field ref="ioceflxb" name="ioceflxb" />500 <field ref="uice_ipa" name="iicevelu" />501 <field ref="vice_ipa" name="iicevelv" />502 <field ref="utau_ice" name="iicestru" />503 <field ref="vtau_ice" name="iicestrv" />504 <field ref="qsr_io_cea" name="iicesflx" />505 <field ref="qns_io_cea" name="iicenflx" />506 <field ref="snowpre" name="isnowpre" />507 </file>508 509 417 </group> 510 418 511 419 <group id="1m" output_freq="-1" output_level="10" enabled=".FALSE."> <!-- real monthly files --> 512 513 <file id="1m_grid_T" name="auto" description="ocean T grid variables" >514 <field ref="sst" name="sosstsst" />515 </file>516 517 420 </group> 518 421 … … 530 433 531 434 <group id="1y" output_freq="-12" output_level="10" enabled=".FALSE."> <!-- real yearly files --> 532 533 <file id="1y_grid_T" name="auto" description="ocean T grid variables" >534 <field ref="mldr10_1" name="sobowlin" operation="t_max(X)" />535 </file>536 537 435 </group> 538 436 -
branches/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM/CONFIG/ORCA2_LIM_CRS/MY_SRC/lib_mpp.F90
r3864 r3895 61 61 PUBLIC ctl_stop, ctl_warn, get_unit, ctl_opn 62 62 PUBLIC mynode, mppstop, mppsync, mpp_comm_free 63 PUBLIC mpp_ini_north 63 PUBLIC mpp_ini_north, mpp_lbc_north, mpp_lbc_north_e 64 64 PUBLIC mpp_min, mpp_max, mpp_sum, mpp_minloc, mpp_maxloc 65 65 PUBLIC mpp_lnk_3d, mpp_lnk_3d_gather, mpp_lnk_2d, mpp_lnk_2d_e … … 328 328 REAL(wp) :: zland 329 329 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 330 REAL(wp), DIMENSION(:,:,:,:) , ALLOCATABLE :: zt3ns, zt3sn ! 3d for north-south & south-north331 REAL(wp), DIMENSION(:,:,:,:) , ALLOCATABLE :: zt3ew, zt3we ! 3d for east-west & west-east330 REAL(wp), DIMENSION(:,:,:,:) , ALLOCATABLE :: t3ns, t3sn ! 3d for north-south & south-north 331 REAL(wp), DIMENSION(:,:,:,:) , ALLOCATABLE :: t3ew, t3we ! 3d for east-west & west-east 332 332 333 333 !!---------------------------------------------------------------------- 334 334 335 ALLOCATE( zt3ns(jpi,jprecj,jpk,2) , zt3sn(jpi,jprecj,jpk,2) , &336 & zt3ew(jpj,jpreci,jpk,2) , zt3we(jpj,jpreci,jpk,2))335 ALLOCATE( t3ns(jpi,jprecj,jpk,2) , t3sn(jpi,jprecj,jpk,2) , & 336 & t3ew(jpj,jpreci,jpk,2) , t3we(jpj,jpreci,jpk,2)) 337 337 338 338 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value … … 383 383 iihom = nlci-nreci 384 384 DO jl = 1, jpreci 385 zt3ew(:,jl,:,1) = ptab(jpreci+jl,:,:)386 zt3we(:,jl,:,1) = ptab(iihom +jl,:,:)385 t3ew(:,jl,:,1) = ptab(jpreci+jl,:,:) 386 t3we(:,jl,:,1) = ptab(iihom +jl,:,:) 387 387 END DO 388 388 END SELECT … … 393 393 SELECT CASE ( nbondi ) 394 394 CASE ( -1 ) 395 CALL mppsend( 2, zt3we(1,1,1,1), imigr, noea, ml_req1 )396 CALL mpprecv( 1, zt3ew(1,1,1,2), imigr, noea )395 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req1 ) 396 CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea ) 397 397 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 398 398 CASE ( 0 ) 399 CALL mppsend( 1, zt3ew(1,1,1,1), imigr, nowe, ml_req1 )400 CALL mppsend( 2, zt3we(1,1,1,1), imigr, noea, ml_req2 )401 CALL mpprecv( 1, zt3ew(1,1,1,2), imigr, noea )402 CALL mpprecv( 2, zt3we(1,1,1,2), imigr, nowe )399 CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 ) 400 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req2 ) 401 CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea ) 402 CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe ) 403 403 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 404 404 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 405 405 CASE ( 1 ) 406 CALL mppsend( 1, zt3ew(1,1,1,1), imigr, nowe, ml_req1 )407 CALL mpprecv( 2, zt3we(1,1,1,2), imigr, nowe )406 CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 ) 407 CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe ) 408 408 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 409 409 END SELECT … … 415 415 CASE ( -1 ) 416 416 DO jl = 1, jpreci 417 ptab(iihom+jl,:,:) = zt3ew(:,jl,:,2)417 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 418 418 END DO 419 419 CASE ( 0 ) 420 420 DO jl = 1, jpreci 421 ptab(jl ,:,:) = zt3we(:,jl,:,2)422 ptab(iihom+jl,:,:) = zt3ew(:,jl,:,2)421 ptab(jl ,:,:) = t3we(:,jl,:,2) 422 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 423 423 END DO 424 424 CASE ( 1 ) 425 425 DO jl = 1, jpreci 426 ptab(jl ,:,:) = zt3we(:,jl,:,2)426 ptab(jl ,:,:) = t3we(:,jl,:,2) 427 427 END DO 428 428 END SELECT … … 436 436 ijhom = nlcj-nrecj 437 437 DO jl = 1, jprecj 438 zt3sn(:,jl,:,1) = ptab(:,ijhom +jl,:)439 zt3ns(:,jl,:,1) = ptab(:,jprecj+jl,:)438 t3sn(:,jl,:,1) = ptab(:,ijhom +jl,:) 439 t3ns(:,jl,:,1) = ptab(:,jprecj+jl,:) 440 440 END DO 441 441 ENDIF … … 446 446 SELECT CASE ( nbondj ) 447 447 CASE ( -1 ) 448 CALL mppsend( 4, zt3sn(1,1,1,1), imigr, nono, ml_req1 )449 CALL mpprecv( 3, zt3ns(1,1,1,2), imigr, nono )448 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req1 ) 449 CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono ) 450 450 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 451 451 CASE ( 0 ) 452 CALL mppsend( 3, zt3ns(1,1,1,1), imigr, noso, ml_req1 )453 CALL mppsend( 4, zt3sn(1,1,1,1), imigr, nono, ml_req2 )454 CALL mpprecv( 3, zt3ns(1,1,1,2), imigr, nono )455 CALL mpprecv( 4, zt3sn(1,1,1,2), imigr, noso )452 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 453 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req2 ) 454 CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono ) 455 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 456 456 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 457 457 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 458 458 CASE ( 1 ) 459 CALL mppsend( 3, zt3ns(1,1,1,1), imigr, noso, ml_req1 )460 CALL mpprecv( 4, zt3sn(1,1,1,2), imigr, noso )459 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 460 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 461 461 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 462 462 END SELECT … … 468 468 CASE ( -1 ) 469 469 DO jl = 1, jprecj 470 ptab(:,ijhom+jl,:) = zt3ns(:,jl,:,2)470 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 471 471 END DO 472 472 CASE ( 0 ) 473 473 DO jl = 1, jprecj 474 ptab(:,jl ,:) = zt3sn(:,jl,:,2)475 ptab(:,ijhom+jl,:) = zt3ns(:,jl,:,2)474 ptab(:,jl ,:) = t3sn(:,jl,:,2) 475 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 476 476 END DO 477 477 CASE ( 1 ) 478 478 DO jl = 1, jprecj 479 ptab(:,jl,:) = zt3sn(:,jl,:,2)479 ptab(:,jl,:) = t3sn(:,jl,:,2) 480 480 END DO 481 481 END SELECT … … 494 494 ENDIF 495 495 ! 496 DEALLOCATE( zt3ns , zt3sn, zt3ew , zt3we )496 DEALLOCATE( t3ns , t3sn, t3ew , t3we ) 497 497 END SUBROUTINE mpp_lnk_3d 498 498 … … 530 530 REAL(wp) :: zland 531 531 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 532 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: zt2ns, zt2sn ! 2d for north-south & south-north533 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: zt2ew, zt2we ! 2d for east-west & west-east534 535 !!---------------------------------------------------------------------- 536 ALLOCATE( zt2ns(jpi,jprecj ,2) , zt2sn(jpi,jprecj ,2) , &537 & zt2ew(jpj,jpreci ,2) , zt2we(jpj,jpreci ,2))532 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: t2ns, t2sn ! 2d for north-south & south-north 533 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: t2ew, t2we ! 2d for east-west & west-east 534 535 !!---------------------------------------------------------------------- 536 ALLOCATE( t2ns(jpi,jprecj ,2) , t2sn(jpi,jprecj ,2) , & 537 & t2ew(jpj,jpreci ,2) , t2we(jpj,jpreci ,2)) 538 538 539 539 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value … … 583 583 iihom = nlci-nreci 584 584 DO jl = 1, jpreci 585 zt2ew(:,jl,1) = pt2d(jpreci+jl,:)586 zt2we(:,jl,1) = pt2d(iihom +jl,:)585 t2ew(:,jl,1) = pt2d(jpreci+jl,:) 586 t2we(:,jl,1) = pt2d(iihom +jl,:) 587 587 END DO 588 588 END SELECT … … 593 593 SELECT CASE ( nbondi ) 594 594 CASE ( -1 ) 595 CALL mppsend( 2, zt2we(1,1,1), imigr, noea, ml_req1 )596 CALL mpprecv( 1, zt2ew(1,1,2), imigr, noea )595 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 ) 596 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 597 597 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 598 598 CASE ( 0 ) 599 CALL mppsend( 1, zt2ew(1,1,1), imigr, nowe, ml_req1 )600 CALL mppsend( 2, zt2we(1,1,1), imigr, noea, ml_req2 )601 CALL mpprecv( 1, zt2ew(1,1,2), imigr, noea )602 CALL mpprecv( 2, zt2we(1,1,2), imigr, nowe )599 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 600 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 ) 601 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 602 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 603 603 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 604 604 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 605 605 CASE ( 1 ) 606 CALL mppsend( 1, zt2ew(1,1,1), imigr, nowe, ml_req1 )607 CALL mpprecv( 2, zt2we(1,1,2), imigr, nowe )606 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 607 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 608 608 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 609 609 END SELECT … … 615 615 CASE ( -1 ) 616 616 DO jl = 1, jpreci 617 pt2d(iihom+jl,:) = zt2ew(:,jl,2)617 pt2d(iihom+jl,:) = t2ew(:,jl,2) 618 618 END DO 619 619 CASE ( 0 ) 620 620 DO jl = 1, jpreci 621 pt2d(jl ,:) = zt2we(:,jl,2)622 pt2d(iihom+jl,:) = zt2ew(:,jl,2)621 pt2d(jl ,:) = t2we(:,jl,2) 622 pt2d(iihom+jl,:) = t2ew(:,jl,2) 623 623 END DO 624 624 CASE ( 1 ) 625 625 DO jl = 1, jpreci 626 pt2d(jl ,:) = zt2we(:,jl,2)626 pt2d(jl ,:) = t2we(:,jl,2) 627 627 END DO 628 628 END SELECT … … 636 636 ijhom = nlcj-nrecj 637 637 DO jl = 1, jprecj 638 zt2sn(:,jl,1) = pt2d(:,ijhom +jl)639 zt2ns(:,jl,1) = pt2d(:,jprecj+jl)638 t2sn(:,jl,1) = pt2d(:,ijhom +jl) 639 t2ns(:,jl,1) = pt2d(:,jprecj+jl) 640 640 END DO 641 641 ENDIF … … 646 646 SELECT CASE ( nbondj ) 647 647 CASE ( -1 ) 648 CALL mppsend( 4, zt2sn(1,1,1), imigr, nono, ml_req1 )649 CALL mpprecv( 3, zt2ns(1,1,2), imigr, nono )648 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 ) 649 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 650 650 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 651 651 CASE ( 0 ) 652 CALL mppsend( 3, zt2ns(1,1,1), imigr, noso, ml_req1 )653 CALL mppsend( 4, zt2sn(1,1,1), imigr, nono, ml_req2 )654 CALL mpprecv( 3, zt2ns(1,1,2), imigr, nono )655 CALL mpprecv( 4, zt2sn(1,1,2), imigr, noso )652 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 653 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 ) 654 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 655 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 656 656 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 657 657 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 658 658 CASE ( 1 ) 659 CALL mppsend( 3, zt2ns(1,1,1), imigr, noso, ml_req1 )660 CALL mpprecv( 4, zt2sn(1,1,2), imigr, noso )659 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 660 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 661 661 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 662 662 END SELECT … … 668 668 CASE ( -1 ) 669 669 DO jl = 1, jprecj 670 pt2d(:,ijhom+jl) = zt2ns(:,jl,2)670 pt2d(:,ijhom+jl) = t2ns(:,jl,2) 671 671 END DO 672 672 CASE ( 0 ) 673 673 DO jl = 1, jprecj 674 pt2d(:,jl ) = zt2sn(:,jl,2)675 pt2d(:,ijhom+jl) = zt2ns(:,jl,2)674 pt2d(:,jl ) = t2sn(:,jl,2) 675 pt2d(:,ijhom+jl) = t2ns(:,jl,2) 676 676 END DO 677 677 CASE ( 1 ) 678 678 DO jl = 1, jprecj 679 pt2d(:,jl ) = zt2sn(:,jl,2)679 pt2d(:,jl ) = t2sn(:,jl,2) 680 680 END DO 681 681 END SELECT … … 694 694 ENDIF 695 695 ! 696 DEALLOCATE( zt2ns , zt2sn , zt2ew , zt2we)696 DEALLOCATE( t2ns , t2sn , t2ew , t2we) 697 697 END SUBROUTINE mpp_lnk_2d 698 698 … … 729 729 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend 730 730 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 731 732 REAL(wp), DIMENSION(:,:,:,:,:), ALLOCATABLE :: zt4ns, zt4sn ! 2 x 3d for north-south & south-north 733 REAL(wp), DIMENSION(:,:,:,:,:), ALLOCATABLE :: zt4ew, zt4we ! 2 x 3d for east-west & west-east 734 735 !!---------------------------------------------------------------------- 736 ALLOCATE( zt4ns(jpi,jprecj,jpk,2,2), zt4sn(jpi,jprecj,jpk,2,2) , & 737 & zt4ew(jpj,jpreci,jpk,2,2), zt4we(jpj,jpreci,jpk,2,2) ) 731 REAL(wp), DIMENSION(:,:,:,:,:), ALLOCATABLE :: t4ns, t4sn ! 2 x 3d for north-south & south-north 732 REAL(wp), DIMENSION(:,:,:,:,:), ALLOCATABLE :: t4ew, t4we ! 2 x 3d for east-west & west-east 733 734 !!---------------------------------------------------------------------- 735 ALLOCATE(t4ns(jpi,jprecj,jpk,2,2) , t4sn(jpi,jprecj,jpk,2,2) , & 736 & t4ew(jpj,jpreci,jpk,2,2) , t4we(jpj,jpreci,jpk,2,2)) 738 737 739 738 … … 770 769 iihom = nlci-nreci 771 770 DO jl = 1, jpreci 772 zt4ew(:,jl,:,1,1) = ptab1(jpreci+jl,:,:)773 zt4we(:,jl,:,1,1) = ptab1(iihom +jl,:,:)774 zt4ew(:,jl,:,2,1) = ptab2(jpreci+jl,:,:)775 zt4we(:,jl,:,2,1) = ptab2(iihom +jl,:,:)771 t4ew(:,jl,:,1,1) = ptab1(jpreci+jl,:,:) 772 t4we(:,jl,:,1,1) = ptab1(iihom +jl,:,:) 773 t4ew(:,jl,:,2,1) = ptab2(jpreci+jl,:,:) 774 t4we(:,jl,:,2,1) = ptab2(iihom +jl,:,:) 776 775 END DO 777 776 END SELECT … … 782 781 SELECT CASE ( nbondi ) 783 782 CASE ( -1 ) 784 CALL mppsend( 2, zt4we(1,1,1,1,1), imigr, noea, ml_req1 )785 CALL mpprecv( 1, zt4ew(1,1,1,1,2), imigr, noea )783 CALL mppsend( 2, t4we(1,1,1,1,1), imigr, noea, ml_req1 ) 784 CALL mpprecv( 1, t4ew(1,1,1,1,2), imigr, noea ) 786 785 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 787 786 CASE ( 0 ) 788 CALL mppsend( 1, zt4ew(1,1,1,1,1), imigr, nowe, ml_req1 )789 CALL mppsend( 2, zt4we(1,1,1,1,1), imigr, noea, ml_req2 )790 CALL mpprecv( 1, zt4ew(1,1,1,1,2), imigr, noea )791 CALL mpprecv( 2, zt4we(1,1,1,1,2), imigr, nowe )787 CALL mppsend( 1, t4ew(1,1,1,1,1), imigr, nowe, ml_req1 ) 788 CALL mppsend( 2, t4we(1,1,1,1,1), imigr, noea, ml_req2 ) 789 CALL mpprecv( 1, t4ew(1,1,1,1,2), imigr, noea ) 790 CALL mpprecv( 2, t4we(1,1,1,1,2), imigr, nowe ) 792 791 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 793 792 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 794 793 CASE ( 1 ) 795 CALL mppsend( 1, zt4ew(1,1,1,1,1), imigr, nowe, ml_req1 )796 CALL mpprecv( 2, zt4we(1,1,1,1,2), imigr, nowe )794 CALL mppsend( 1, t4ew(1,1,1,1,1), imigr, nowe, ml_req1 ) 795 CALL mpprecv( 2, t4we(1,1,1,1,2), imigr, nowe ) 797 796 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 798 797 END SELECT … … 804 803 CASE ( -1 ) 805 804 DO jl = 1, jpreci 806 ptab1(iihom+jl,:,:) = zt4ew(:,jl,:,1,2)807 ptab2(iihom+jl,:,:) = zt4ew(:,jl,:,2,2)805 ptab1(iihom+jl,:,:) = t4ew(:,jl,:,1,2) 806 ptab2(iihom+jl,:,:) = t4ew(:,jl,:,2,2) 808 807 END DO 809 808 CASE ( 0 ) 810 809 DO jl = 1, jpreci 811 ptab1(jl ,:,:) = zt4we(:,jl,:,1,2)812 ptab1(iihom+jl,:,:) = zt4ew(:,jl,:,1,2)813 ptab2(jl ,:,:) = zt4we(:,jl,:,2,2)814 ptab2(iihom+jl,:,:) = zt4ew(:,jl,:,2,2)810 ptab1(jl ,:,:) = t4we(:,jl,:,1,2) 811 ptab1(iihom+jl,:,:) = t4ew(:,jl,:,1,2) 812 ptab2(jl ,:,:) = t4we(:,jl,:,2,2) 813 ptab2(iihom+jl,:,:) = t4ew(:,jl,:,2,2) 815 814 END DO 816 815 CASE ( 1 ) 817 816 DO jl = 1, jpreci 818 ptab1(jl ,:,:) = zt4we(:,jl,:,1,2)819 ptab2(jl ,:,:) = zt4we(:,jl,:,2,2)817 ptab1(jl ,:,:) = t4we(:,jl,:,1,2) 818 ptab2(jl ,:,:) = t4we(:,jl,:,2,2) 820 819 END DO 821 820 END SELECT … … 829 828 ijhom = nlcj - nrecj 830 829 DO jl = 1, jprecj 831 zt4sn(:,jl,:,1,1) = ptab1(:,ijhom +jl,:)832 zt4ns(:,jl,:,1,1) = ptab1(:,jprecj+jl,:)833 zt4sn(:,jl,:,2,1) = ptab2(:,ijhom +jl,:)834 zt4ns(:,jl,:,2,1) = ptab2(:,jprecj+jl,:)830 t4sn(:,jl,:,1,1) = ptab1(:,ijhom +jl,:) 831 t4ns(:,jl,:,1,1) = ptab1(:,jprecj+jl,:) 832 t4sn(:,jl,:,2,1) = ptab2(:,ijhom +jl,:) 833 t4ns(:,jl,:,2,1) = ptab2(:,jprecj+jl,:) 835 834 END DO 836 835 ENDIF … … 841 840 SELECT CASE ( nbondj ) 842 841 CASE ( -1 ) 843 CALL mppsend( 4, zt4sn(1,1,1,1,1), imigr, nono, ml_req1 )844 CALL mpprecv( 3, zt4ns(1,1,1,1,2), imigr, nono )842 CALL mppsend( 4, t4sn(1,1,1,1,1), imigr, nono, ml_req1 ) 843 CALL mpprecv( 3, t4ns(1,1,1,1,2), imigr, nono ) 845 844 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 846 845 CASE ( 0 ) 847 CALL mppsend( 3, zt4ns(1,1,1,1,1), imigr, noso, ml_req1 )848 CALL mppsend( 4, zt4sn(1,1,1,1,1), imigr, nono, ml_req2 )849 CALL mpprecv( 3, zt4ns(1,1,1,1,2), imigr, nono )850 CALL mpprecv( 4, zt4sn(1,1,1,1,2), imigr, noso )846 CALL mppsend( 3, t4ns(1,1,1,1,1), imigr, noso, ml_req1 ) 847 CALL mppsend( 4, t4sn(1,1,1,1,1), imigr, nono, ml_req2 ) 848 CALL mpprecv( 3, t4ns(1,1,1,1,2), imigr, nono ) 849 CALL mpprecv( 4, t4sn(1,1,1,1,2), imigr, noso ) 851 850 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 852 851 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 853 852 CASE ( 1 ) 854 CALL mppsend( 3, zt4ns(1,1,1,1,1), imigr, noso, ml_req1 )855 CALL mpprecv( 4, zt4sn(1,1,1,1,2), imigr, noso )853 CALL mppsend( 3, t4ns(1,1,1,1,1), imigr, noso, ml_req1 ) 854 CALL mpprecv( 4, t4sn(1,1,1,1,2), imigr, noso ) 856 855 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 857 856 END SELECT … … 863 862 CASE ( -1 ) 864 863 DO jl = 1, jprecj 865 ptab1(:,ijhom+jl,:) = zt4ns(:,jl,:,1,2)866 ptab2(:,ijhom+jl,:) = zt4ns(:,jl,:,2,2)864 ptab1(:,ijhom+jl,:) = t4ns(:,jl,:,1,2) 865 ptab2(:,ijhom+jl,:) = t4ns(:,jl,:,2,2) 867 866 END DO 868 867 CASE ( 0 ) 869 868 DO jl = 1, jprecj 870 ptab1(:,jl ,:) = zt4sn(:,jl,:,1,2)871 ptab1(:,ijhom+jl,:) = zt4ns(:,jl,:,1,2)872 ptab2(:,jl ,:) = zt4sn(:,jl,:,2,2)873 ptab2(:,ijhom+jl,:) = zt4ns(:,jl,:,2,2)869 ptab1(:,jl ,:) = t4sn(:,jl,:,1,2) 870 ptab1(:,ijhom+jl,:) = t4ns(:,jl,:,1,2) 871 ptab2(:,jl ,:) = t4sn(:,jl,:,2,2) 872 ptab2(:,ijhom+jl,:) = t4ns(:,jl,:,2,2) 874 873 END DO 875 874 CASE ( 1 ) 876 875 DO jl = 1, jprecj 877 ptab1(:,jl,:) = zt4sn(:,jl,:,1,2)878 ptab2(:,jl,:) = zt4sn(:,jl,:,2,2)876 ptab1(:,jl,:) = t4sn(:,jl,:,1,2) 877 ptab2(:,jl,:) = t4sn(:,jl,:,2,2) 879 878 END DO 880 879 END SELECT … … 896 895 ENDIF 897 896 ! 898 DEALLOCATE(zt4ns , zt4sn , zt4ew , zt4we) 899 ! 897 DEALLOCATE(t4ns , t4sn , t4ew , t4we) 900 898 END SUBROUTINE mpp_lnk_3d_gather 901 899 … … 932 930 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend 933 931 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 934 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: ztr2ns, ztr2sn ! 2d for north-south & south-north + extra outer halo935 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: ztr2ew, ztr2we ! 2d for east-west & west-east + extra outer halo936 937 !!---------------------------------------------------------------------- 938 ALLOCATE( ztr2ns(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) , &939 & ztr2sn(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) , &940 & ztr2ew(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) , &941 & ztr2we(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2))932 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: tr2ns, tr2sn ! 2d for north-south & south-north + extra outer halo 933 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: tr2ew, tr2we ! 2d for east-west & west-east + extra outer halo 934 935 !!---------------------------------------------------------------------- 936 ALLOCATE( tr2ns(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) , & 937 & tr2sn(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) , & 938 & tr2ew(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) , & 939 & tr2we(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2)) 942 940 943 941 ipreci = jpreci + jpr2di ! take into account outer extra 2D overlap area … … 984 982 iihom = nlci-nreci-jpr2di 985 983 DO jl = 1, ipreci 986 ztr2ew(:,jl,1) = pt2d(jpreci+jl,:)987 ztr2we(:,jl,1) = pt2d(iihom +jl,:)984 tr2ew(:,jl,1) = pt2d(jpreci+jl,:) 985 tr2we(:,jl,1) = pt2d(iihom +jl,:) 988 986 END DO 989 987 END SELECT … … 994 992 SELECT CASE ( nbondi ) 995 993 CASE ( -1 ) 996 CALL mppsend( 2, ztr2we(1-jpr2dj,1,1), imigr, noea, ml_req1 )997 CALL mpprecv( 1, ztr2ew(1-jpr2dj,1,2), imigr, noea )994 CALL mppsend( 2, tr2we(1-jpr2dj,1,1), imigr, noea, ml_req1 ) 995 CALL mpprecv( 1, tr2ew(1-jpr2dj,1,2), imigr, noea ) 998 996 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 999 997 CASE ( 0 ) 1000 CALL mppsend( 1, ztr2ew(1-jpr2dj,1,1), imigr, nowe, ml_req1 )1001 CALL mppsend( 2, ztr2we(1-jpr2dj,1,1), imigr, noea, ml_req2 )1002 CALL mpprecv( 1, ztr2ew(1-jpr2dj,1,2), imigr, noea )1003 CALL mpprecv( 2, ztr2we(1-jpr2dj,1,2), imigr, nowe )998 CALL mppsend( 1, tr2ew(1-jpr2dj,1,1), imigr, nowe, ml_req1 ) 999 CALL mppsend( 2, tr2we(1-jpr2dj,1,1), imigr, noea, ml_req2 ) 1000 CALL mpprecv( 1, tr2ew(1-jpr2dj,1,2), imigr, noea ) 1001 CALL mpprecv( 2, tr2we(1-jpr2dj,1,2), imigr, nowe ) 1004 1002 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1005 1003 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 1006 1004 CASE ( 1 ) 1007 CALL mppsend( 1, ztr2ew(1-jpr2dj,1,1), imigr, nowe, ml_req1 )1008 CALL mpprecv( 2, ztr2we(1-jpr2dj,1,2), imigr, nowe )1005 CALL mppsend( 1, tr2ew(1-jpr2dj,1,1), imigr, nowe, ml_req1 ) 1006 CALL mpprecv( 2, tr2we(1-jpr2dj,1,2), imigr, nowe ) 1009 1007 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1010 1008 END SELECT … … 1016 1014 CASE ( -1 ) 1017 1015 DO jl = 1, ipreci 1018 pt2d(iihom+jl,:) = ztr2ew(:,jl,2)1016 pt2d(iihom+jl,:) = tr2ew(:,jl,2) 1019 1017 END DO 1020 1018 CASE ( 0 ) 1021 1019 DO jl = 1, ipreci 1022 pt2d(jl-jpr2di,:) = ztr2we(:,jl,2)1023 pt2d( iihom+jl,:) = ztr2ew(:,jl,2)1020 pt2d(jl-jpr2di,:) = tr2we(:,jl,2) 1021 pt2d( iihom+jl,:) = tr2ew(:,jl,2) 1024 1022 END DO 1025 1023 CASE ( 1 ) 1026 1024 DO jl = 1, ipreci 1027 pt2d(jl-jpr2di,:) = ztr2we(:,jl,2)1025 pt2d(jl-jpr2di,:) = tr2we(:,jl,2) 1028 1026 END DO 1029 1027 END SELECT … … 1037 1035 ijhom = nlcj-nrecj-jpr2dj 1038 1036 DO jl = 1, iprecj 1039 ztr2sn(:,jl,1) = pt2d(:,ijhom +jl)1040 ztr2ns(:,jl,1) = pt2d(:,jprecj+jl)1037 tr2sn(:,jl,1) = pt2d(:,ijhom +jl) 1038 tr2ns(:,jl,1) = pt2d(:,jprecj+jl) 1041 1039 END DO 1042 1040 ENDIF … … 1047 1045 SELECT CASE ( nbondj ) 1048 1046 CASE ( -1 ) 1049 CALL mppsend( 4, ztr2sn(1-jpr2di,1,1), imigr, nono, ml_req1 )1050 CALL mpprecv( 3, ztr2ns(1-jpr2di,1,2), imigr, nono )1047 CALL mppsend( 4, tr2sn(1-jpr2di,1,1), imigr, nono, ml_req1 ) 1048 CALL mpprecv( 3, tr2ns(1-jpr2di,1,2), imigr, nono ) 1051 1049 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1052 1050 CASE ( 0 ) 1053 CALL mppsend( 3, ztr2ns(1-jpr2di,1,1), imigr, noso, ml_req1 )1054 CALL mppsend( 4, ztr2sn(1-jpr2di,1,1), imigr, nono, ml_req2 )1055 CALL mpprecv( 3, ztr2ns(1-jpr2di,1,2), imigr, nono )1056 CALL mpprecv( 4, ztr2sn(1-jpr2di,1,2), imigr, noso )1051 CALL mppsend( 3, tr2ns(1-jpr2di,1,1), imigr, noso, ml_req1 ) 1052 CALL mppsend( 4, tr2sn(1-jpr2di,1,1), imigr, nono, ml_req2 ) 1053 CALL mpprecv( 3, tr2ns(1-jpr2di,1,2), imigr, nono ) 1054 CALL mpprecv( 4, tr2sn(1-jpr2di,1,2), imigr, noso ) 1057 1055 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1058 1056 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 1059 1057 CASE ( 1 ) 1060 CALL mppsend( 3, ztr2ns(1-jpr2di,1,1), imigr, noso, ml_req1 )1061 CALL mpprecv( 4, ztr2sn(1-jpr2di,1,2), imigr, noso )1058 CALL mppsend( 3, tr2ns(1-jpr2di,1,1), imigr, noso, ml_req1 ) 1059 CALL mpprecv( 4, tr2sn(1-jpr2di,1,2), imigr, noso ) 1062 1060 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1063 1061 END SELECT … … 1069 1067 CASE ( -1 ) 1070 1068 DO jl = 1, iprecj 1071 pt2d(:,ijhom+jl) = ztr2ns(:,jl,2)1069 pt2d(:,ijhom+jl) = tr2ns(:,jl,2) 1072 1070 END DO 1073 1071 CASE ( 0 ) 1074 1072 DO jl = 1, iprecj 1075 pt2d(:,jl-jpr2dj) = ztr2sn(:,jl,2)1076 pt2d(:,ijhom+jl ) = ztr2ns(:,jl,2)1073 pt2d(:,jl-jpr2dj) = tr2sn(:,jl,2) 1074 pt2d(:,ijhom+jl ) = tr2ns(:,jl,2) 1077 1075 END DO 1078 1076 CASE ( 1 ) 1079 1077 DO jl = 1, iprecj 1080 pt2d(:,jl-jpr2dj) = ztr2sn(:,jl,2)1078 pt2d(:,jl-jpr2dj) = tr2sn(:,jl,2) 1081 1079 END DO 1082 1080 END SELECT 1083 DEALLOCATE( ztr2ns , ztr2sn , ztr2ew , ztr2we)1081 DEALLOCATE( tr2ns , tr2sn , tr2ew , tr2we) 1084 1082 END SUBROUTINE mpp_lnk_2d_e 1085 1083 … … 1751 1749 INTEGER :: ml_stat(MPI_STATUS_SIZE) ! for key_mpi_isend 1752 1750 REAL(wp), POINTER, DIMENSION(:,:) :: ztab ! temporary workspace 1753 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: zt2ns, zt2sn ! 2d for north-south & south-north1754 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: zt2ew, zt2we ! 2d for east-west & west-east1755 1756 !!---------------------------------------------------------------------- 1757 ALLOCATE( zt2ns(jpi,jprecj ,2) , zt2sn(jpi,jprecj ,2) , &1758 & zt2ew(jpj,jpreci ,2) , zt2we(jpj,jpreci ,2))1751 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: t2ns, t2sn ! 2d for north-south & south-north 1752 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: t2ew, t2we ! 2d for east-west & west-east 1753 1754 !!---------------------------------------------------------------------- 1755 ALLOCATE( t2ns(jpi,jprecj ,2) , t2sn(jpi,jprecj ,2) , & 1756 & t2ew(jpj,jpreci ,2) , t2we(jpj,jpreci ,2)) 1759 1757 1760 1758 … … 1811 1809 iihom = nlci-nreci 1812 1810 DO jl = 1, jpreci 1813 zt2ew(:,jl,1) = ztab(jpreci+jl,:)1814 zt2we(:,jl,1) = ztab(iihom +jl,:)1811 t2ew(:,jl,1) = ztab(jpreci+jl,:) 1812 t2we(:,jl,1) = ztab(iihom +jl,:) 1815 1813 END DO 1816 1814 ENDIF … … 1820 1818 ! 1821 1819 IF( nbondi == -1 ) THEN 1822 CALL mppsend( 2, zt2we(1,1,1), imigr, noea, ml_req1 )1823 CALL mpprecv( 1, zt2ew(1,1,2), imigr, noea )1820 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 ) 1821 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 1824 1822 IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 1825 1823 ELSEIF( nbondi == 0 ) THEN 1826 CALL mppsend( 1, zt2ew(1,1,1), imigr, nowe, ml_req1 )1827 CALL mppsend( 2, zt2we(1,1,1), imigr, noea, ml_req2 )1828 CALL mpprecv( 1, zt2ew(1,1,2), imigr, noea )1829 CALL mpprecv( 2, zt2we(1,1,2), imigr, nowe )1824 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 1825 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 ) 1826 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 1827 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 1830 1828 IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 1831 1829 IF(l_isend) CALL mpi_wait( ml_req2, ml_stat, ml_err ) 1832 1830 ELSEIF( nbondi == 1 ) THEN 1833 CALL mppsend( 1, zt2ew(1,1,1), imigr, nowe, ml_req1 )1834 CALL mpprecv( 2, zt2we(1,1,2), imigr, nowe )1831 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 1832 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 1835 1833 IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 1836 1834 ENDIF … … 1841 1839 IF( nbondi == 0 .OR. nbondi == 1 ) THEN 1842 1840 DO jl = 1, jpreci 1843 ztab(jl,:) = zt2we(:,jl,2)1841 ztab(jl,:) = t2we(:,jl,2) 1844 1842 END DO 1845 1843 ENDIF 1846 1844 IF( nbondi == -1 .OR. nbondi == 0 ) THEN 1847 1845 DO jl = 1, jpreci 1848 ztab(iihom+jl,:) = zt2ew(:,jl,2)1846 ztab(iihom+jl,:) = t2ew(:,jl,2) 1849 1847 END DO 1850 1848 ENDIF … … 1857 1855 ijhom = nlcj-nrecj 1858 1856 DO jl = 1, jprecj 1859 zt2sn(:,jl,1) = ztab(:,ijhom +jl)1860 zt2ns(:,jl,1) = ztab(:,jprecj+jl)1857 t2sn(:,jl,1) = ztab(:,ijhom +jl) 1858 t2ns(:,jl,1) = ztab(:,jprecj+jl) 1861 1859 END DO 1862 1860 ENDIF … … 1866 1864 ! 1867 1865 IF( nbondj == -1 ) THEN 1868 CALL mppsend( 4, zt2sn(1,1,1), imigr, nono, ml_req1 )1869 CALL mpprecv( 3, zt2ns(1,1,2), imigr, nono )1866 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 ) 1867 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 1870 1868 IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 1871 1869 ELSEIF( nbondj == 0 ) THEN 1872 CALL mppsend( 3, zt2ns(1,1,1), imigr, noso, ml_req1 )1873 CALL mppsend( 4, zt2sn(1,1,1), imigr, nono, ml_req2 )1874 CALL mpprecv( 3, zt2ns(1,1,2), imigr, nono )1875 CALL mpprecv( 4, zt2sn(1,1,2), imigr, noso )1870 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 1871 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 ) 1872 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 1873 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 1876 1874 IF( l_isend ) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 1877 1875 IF( l_isend ) CALL mpi_wait( ml_req2, ml_stat, ml_err ) 1878 1876 ELSEIF( nbondj == 1 ) THEN 1879 CALL mppsend( 3, zt2ns(1,1,1), imigr, noso, ml_req1 )1880 CALL mpprecv( 4, zt2sn(1,1,2), imigr, noso)1877 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 1878 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso) 1881 1879 IF( l_isend ) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 1882 1880 ENDIF … … 1886 1884 IF( nbondj == 0 .OR. nbondj == 1 ) THEN 1887 1885 DO jl = 1, jprecj 1888 ztab(:,jl) = zt2sn(:,jl,2)1886 ztab(:,jl) = t2sn(:,jl,2) 1889 1887 END DO 1890 1888 ENDIF 1891 1889 IF( nbondj == 0 .OR. nbondj == -1 ) THEN 1892 1890 DO jl = 1, jprecj 1893 ztab(:,ijhom+jl) = zt2ns(:,jl,2)1891 ztab(:,ijhom+jl) = t2ns(:,jl,2) 1894 1892 END DO 1895 1893 ENDIF … … 1910 1908 END DO 1911 1909 ! 1912 DEALLOCATE( zt2ns , zt2sn , zt2ew , zt2we) 1913 1910 DEALLOCATE( t2ns , t2sn , t2ew , t2we) 1914 1911 CALL wrk_dealloc( jpi,jpj, ztab ) 1915 1912 ! -
branches/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM/NEMO/OPA_SRC/CRS/crs.F90
r3860 r3895 28 28 jpj_full !: 2nd dimension of local parent grid domain 29 29 30 INTEGER :: nist art, njstart31 INTEGER :: niend 30 INTEGER :: nistr , njstr 31 INTEGER :: niend , njend 32 32 33 33 INTEGER :: jpi_crsm1, jpj_crsm1 !: loop indices -
branches/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM/NEMO/OPA_SRC/CRS/crsdiawri.F90
r3860 r3895 4 4 !! Ocean diagnostics : write ocean output files 5 5 !!===================================================================== 6 !! History : OPA ! 1991-03 (M.-A. Foujols) Original code 7 !! 4.0 ! 1991-11 (G. Madec) 8 !! ! 1992-06 (M. Imbard) correction restart file 9 !! ! 1992-07 (M. Imbard) split into diawri and rstwri 10 !! ! 1993-03 (M. Imbard) suppress writibm 11 !! ! 1998-01 (C. Levy) NETCDF format using ioipsl INTERFACE 12 !! ! 1999-02 (E. Guilyardi) name of netCDF files + variables 13 !! 8.2 ! 2000-06 (M. Imbard) Original code (diabort.F) 14 !! NEMO 1.0 ! 2002-06 (A.Bozec, E. Durand) Original code (diainit.F) 15 !! - ! 2002-09 (G. Madec) F90: Free form and module 16 !! - ! 2002-12 (G. Madec) merge of diabort and diainit, F90 17 !! ! 2005-11 (V. Garnier) Surface pressure gradient organization 18 !! 3.2 ! 2008-11 (B. Lemaire) creation from old diawri 19 !! ! 2012-07 (J. Simeon, G. Madec, C. Ethe, C. Calone) Modified for coarsened output 6 !! 2012-07 (J. Simeon, C. Calone, G. Madec, C. Ethe) 20 7 !!---------------------------------------------------------------------- 21 8 … … 131 118 ! Temperature 132 119 zt(:,:,:) = tsn(:,:,:,jp_tem) ; zt_crs(:,:,:) = 0._wp 133 CALL crsfun( p_e1e2t=e1e2t, cd_type='T', cd_op='VOL', p_cmask=tmask_crs, p_ptmask=tmask, & 134 & p_pfield3d_1=zfse3t, p_pfield3d_2=zt, p_cfield3d=zt_crs ) 120 CALL crs_dom_ope( zt, 'VOL', 'T', tmask, zt_crs, p_e12=e1e2t, p_e3=zfse3t ) 135 121 tsn_crs(:,:,:,jp_tem) = zt_crs(:,:,:) 136 122 CALL crs_iom_put( "toce_crs", pv_r3d=tsn_crs(:,:,:,jp_tem) ) ! temp … … 138 124 139 125 ! Salinity 140 zt(:,:,:) = tsn(:,:,:,jp_sal) ; zt_crs(:,:,:) = 0._wp 141 CALL crsfun( p_e1e2t=e1e2t, cd_type='T', cd_op='VOL', p_cmask=tmask_crs, p_ptmask=tmask, & 142 & p_pfield3d_1=zfse3t, p_pfield3d_2=zt, p_cfield3d=zt_crs ) 126 zs(:,:,:) = tsn(:,:,:,jp_sal) ; zs_crs(:,:,:) = 0._wp 127 CALL crs_dom_ope( zs, 'VOL', 'T', tmask, zs_crs, p_e12=e1e2t, p_e3=zfse3t ) 143 128 tsn_crs(:,:,:,jp_sal) = zt_crs(:,:,:) 144 129 CALL crs_iom_put( "soce_crs" , pv_r3d=tsn_crs(:,:,:,jp_sal) ) ! sal … … 146 131 147 132 ! U-velocity 148 CALL crsfun( p_e1_e2=e2u, cd_type='U', psgn=-1.0, p_pmask=umask, & 149 & p_fse3=zfse3u, p_pfield=un, p_surf_crs=crs_surfu_wgt, p_cfield3d=un_crs ) 133 CALL crs_dom_ope( un, 'SUM', 'U', umask, un_crs, p_e12=e2u, p_e3=zfse3u, p_surf_crs=e2e3u_msk ) 150 134 CALL crs_iom_put( "uoce_crs" , pv_r3d=un_crs ) ! i-current 151 135 ! … … 159 143 END DO 160 144 END DO 161 CALL crsfun( p_e1_e2=e2u, cd_type='U', psgn=-1.0, p_pmask=umask, & 162 & p_fse3=zfse3u, p_pfield=zt, p_cfield3d=zt_crs ) 145 CALL crs_dom_ope( zt, 'SUM', 'U', umask, zt_crs, p_e12=e2u, p_e3=zfse3u, p_surf_crs=e2e3u_msk ) 163 146 CALL crs_iom_put( "uocet_crs" , pv_r3d=zt_crs ) ! uT 164 CALL crsfun( p_e1_e2=e2u, cd_type='U', psgn=-1.0, p_pmask=umask, & 165 & p_fse3=zfse3u, p_pfield=zs, p_cfield3d=zs_crs ) 147 CALL crs_dom_ope( zs, 'SUM', 'U', umask, zs_crs, p_e12=e2u, p_e3=zfse3u, p_surf_crs=e2e3u_msk ) 166 148 CALL crs_iom_put( "uoces_crs" , pv_r3d=zs_crs ) ! uS 167 149 168 150 169 151 ! V-velocity 170 CALL crsfun( p_e1_e2=e1v, cd_type='V', psgn=-1.0, p_pmask=vmask, & 171 & p_fse3=zfse3v, p_pfield=vn, p_surf_crs=crs_surfv_wgt, p_cfield3d=vn_crs ) 152 CALL crs_dom_ope( vn, 'SUM', 'V', vmask, vn_crs, p_e12=e1v, p_e3=zfse3v, p_surf_crs=e1e3v_msk ) 172 153 CALL crs_iom_put( "voce_crs" , pv_r3d=vn_crs ) ! v-current 173 154 ! … … 181 162 END DO 182 163 END DO 183 CALL crsfun( p_e1_e2=e1v, cd_type='V', psgn=-1.0, p_pmask=vmask, & 184 & p_fse3=zfse3v, p_pfield=zt, p_cfield3d=zt_crs ) 164 CALL crs_dom_ope( zt, 'SUM', 'V', vmask, zt_crs, p_e12=e1v, p_e3=zfse3v, p_surf_crs=e1e3v_msk ) 185 165 CALL crs_iom_put( "vocet_crs" , pv_r3d=zt_crs ) ! vT 186 166 187 CALL crsfun( p_e1_e2=e1v, cd_type='V', psgn=-1.0, p_pmask=vmask, & 188 & p_fse3=zfse3v, p_pfield=zs, p_cfield3d=zs_crs ) 167 CALL crs_dom_ope( zs, 'SUM', 'V', vmask, zs_crs, p_e12=e1v, p_e3=zfse3v, p_surf_crs=e1e3v_msk ) 189 168 CALL crs_iom_put( "voces_crs" , pv_r3d=zs_crs ) ! vS 190 169 191 170 ! Kinetic energy 192 CALL crsfun( p_e1e2t=e1e2t, cd_type='T', cd_op='VOL', p_cmask=tmask_crs, p_ptmask=tmask, & 193 & p_pfield3d_1=zfse3t, p_pfield3d_2=rke, p_cfield3d=rke_crs ) 194 rke_crs(:,:,:) = rke_crs(:,:,:) * tmask_crs(:,:,:) 171 CALL crs_dom_ope( rke, 'VOL', 'T', tmask, rke_crs, p_e12=e1e2t, p_e3=zfse3t ) 195 172 CALL crs_iom_put( "eken_crs", pv_r3d=rke_crs ) 196 173 197 !198 199 200 174 ! Horizontal divergence ( following OPA_SRC/DYN/divcur.F90 ) 201 175 DO jk = 1, jpkm1 … … 213 187 ENDDO 214 188 ENDDO 215 CALL crs_lbc_lnk( hdivn_crs, 'T', 1.0)189 CALL crs_lbc_lnk( hdivn_crs, 'T', 1.0 ) 216 190 CALL crs_iom_put( "hdiv_crs", pv_r3d=hdivn_crs ) 217 191 218 192 219 193 ! Sea-surface Height 220 CALL crsfun( p_e1e2t=e1e2t, cd_type='T', cd_op='ARE', p_cmask=tmask_crs, p_ptmask=tmask, & 221 & p_pfield2d=sshn, p_cfield2d=sshn_crs ) 194 CALL crs_dom_ope( sshn, 'VOL', 'T', tmask, sshn_crs, p_e12=e1e2t, p_e3=zfse3t ) 222 195 CALL crs_iom_put( "ssh_crs" , pv_r2d=sshn_crs ) ! ssh output 223 196 224 197 ! W-velocity 225 CALL crsfun( p_e1e2t=e1e2t, cd_type='T', cd_op='ARE', p_cmask=tmask_crs, p_ptmask=tmask, & 226 & p_pfield3d_2=wn, p_cfield3d=wn_crs ) 227 CALL crs_iom_put( "woce_crs" , pv_r3d=wn_crs ) ! i-current 228 229 198 CALL crs_dom_ope( wn, 'VOL', 'W', tmask, wn_crs, p_e12=e1e2t, p_e3=zfse3w ) 199 CALL crs_iom_put( "woce_crs" , pv_r3d=wn_crs ) ! i-current 200 230 201 231 202 ! Clean-up 232 233 203 CALL wrk_dealloc( jpi, jpj, jpk, zfse3t, zfse3w ) 234 204 CALL wrk_dealloc( jpi, jpj, jpk, zfse3u, zfse3v ) -
branches/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM/NEMO/OPA_SRC/CRS/crsdom.F90
r3864 r3895 28 28 !! Climate Dynamics, 14:101-116. 29 29 !! History: 30 !! Original. May 2012. (J. Simeon, G. Madec, C. Ethe, C. Calone)30 !! Original. May 2012. (J. Simeon, C. Calone, G. Madec, C. Ethe) 31 31 !!=================================================================== 32 32 … … 43 43 PRIVATE 44 44 45 PUBLIC crsfun, crsfun_wgt 46 PUBLIC crs_dom_e3_max, crs_dom_sfc, crs_dom_msk, crs_dom_def, crs_dom_hgr, crs_dom_coordinates, crs_dom_bat 47 48 INTERFACE crsfun 49 MODULE PROCEDURE crsfun_UV, crsfun_TW 45 PUBLIC crs_dom_ope 46 PUBLIC crs_dom_e3_max, crs_dom_sfc, crs_dom_msk, crs_dom_hgr, crs_dom_coordinates 47 PUBLIC crs_dom_facvol, crs_dom_def, crs_dom_bat 48 49 INTERFACE crs_dom_ope 50 MODULE PROCEDURE crs_dom_ope_3d, crs_dom_ope_2d 50 51 END INTERFACE 51 52 … … 58 59 SUBROUTINE crs_dom_msk 59 60 60 INTEGER :: ji, jj, jk , ijpk! dummy loop indices61 INTEGER :: ijie,ijis,ijje,ijjs62 REAL(wp) :: 61 INTEGER :: ji, jj, jk ! dummy loop indices 62 INTEGER :: ijie,ijis,ijje,ijjs 63 REAL(wp) :: zmask 63 64 64 65 ! Initialize … … 69 70 fmask_crs(:,:,:) = 0.0 70 71 71 DO jk = 1, jpk 72 DO jk = 1, jpkm1 72 73 DO ji = 2, nlei_crs 73 74 ijie = mie_crs(ji) 74 75 ijis = mis_crs(ji) 75 DO jj = n jstart, njend76 DO jj = nldj_crs, nlej_crs 76 77 ijje = mje_crs(jj) 77 78 ijjs = mjs_crs(jj) 78 79 79 zmask = 0 80 zmask = 0.0 80 81 zmask = SUM( tmask(ijis:ijie,ijjs:ijje,jk) ) 81 IF ( zmask > 0 ) tmask_crs(ji,jj,jk) = 182 IF ( zmask > 0.0 ) tmask_crs(ji,jj,jk) = 1.0 82 83 83 zmask = 0 84 zmask = 0.0 84 85 zmask = SUM( vmask(ijis:ijie,ijje ,jk) ) 85 IF ( zmask > 0 ) vmask_crs(ji,jj,jk) = 186 IF ( zmask > 0.0 ) vmask_crs(ji,jj,jk) = 1.0 86 87 87 zmask = 0 88 zmask = 0.0 88 89 zmask = SUM( umask(ijie ,ijjs:ijje,jk) ) 89 IF ( zmask > 0 ) umask_crs(ji,jj,jk) = 190 IF ( zmask > 0.0 ) umask_crs(ji,jj,jk) = 1.0 90 91 91 92 fmask_crs(ji,jj,jk) = fmask(ijie,ijje,jk) … … 95 96 ENDDO 96 97 ! 97 CALL crs_lbc_lnk( tmask_crs (:,:,:), 'T', psgn =1.0 )98 CALL crs_lbc_lnk( vmask_crs (:,:,:), 'V', psgn =1.0 )99 CALL crs_lbc_lnk( umask_crs (:,:,:), 'U', psgn =1.0 )100 CALL crs_lbc_lnk( fmask_crs (:,:,:), 'F', psgn =1.0 )98 CALL crs_lbc_lnk( tmask_crs, 'T', 1.0 ) 99 CALL crs_lbc_lnk( vmask_crs, 'V', 1.0 ) 100 CALL crs_lbc_lnk( umask_crs, 'U', 1.0 ) 101 CALL crs_lbc_lnk( fmask_crs, 'F', 1.0 ) 101 102 ! 102 103 END SUBROUTINE crs_dom_msk 103 104 104 SUBROUTINE crs_dom_coordinates( p_ pgphi, p_pglam, cd_type, p_cgphi, p_cglam)105 SUBROUTINE crs_dom_coordinates( p_gphi, p_glam, cd_type, p_gphi_crs, p_glam_crs ) 105 106 !!---------------------------------------------------------------- 106 107 !! *** SUBROUTINE crs_coordinates *** … … 116 117 !! the central f-corner. 117 118 !! 118 !! ** Input : p_ pgphi = parent grid gphi[t|u|v|f]119 !! p_ pglam = parent grid glam[t|u|v|f]119 !! ** Input : p_gphi = parent grid gphi[t|u|v|f] 120 !! p_glam = parent grid glam[t|u|v|f] 120 121 !! cd_type = grid type (T,U,V,F) 121 !! ** Output : p_ cgphi= coarse grid gphi[t|u|v|f]122 !! p_ cglam= coarse grid glam[t|u|v|f]122 !! ** Output : p_gphi_crs = coarse grid gphi[t|u|v|f] 123 !! p_glam_crs = coarse grid glam[t|u|v|f] 123 124 !! 124 125 !! History. 1 Jun. 125 126 !!---------------------------------------------------------------- 126 127 !! Arguments 127 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in) :: p_pgphi ! Parent grid latitude128 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in) :: p_pglam ! Parent grid longitude129 CHARACTER(len=1), INTENT(in) :: cd_type ! grid type (T,U,V,F)130 REAL(wp), DIMENSION(jpi_crs,jpj_crs), INTENT(out) :: p_ cgphi! Coarse grid latitude131 REAL(wp), DIMENSION(jpi_crs,jpj_crs), INTENT(out) :: p_ cglam! Coarse grid longitude128 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in) :: p_gphi ! Parent grid latitude 129 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in) :: p_glam ! Parent grid longitude 130 CHARACTER(len=1), INTENT(in) :: cd_type ! grid type (T,U,V,F) 131 REAL(wp), DIMENSION(jpi_crs,jpj_crs), INTENT(out) :: p_gphi_crs ! Coarse grid latitude 132 REAL(wp), DIMENSION(jpi_crs,jpj_crs), INTENT(out) :: p_glam_crs ! Coarse grid longitude 132 133 133 134 !! Local variables 134 INTEGER :: 135 INTEGER :: iji e,ijis,ijje,ijjs,ijpk135 INTEGER :: ji, jj, jk ! dummy loop indices 136 INTEGER :: ijis, ijjs 136 137 137 138 138 !! Initialize output fields 139 p_cgphi(:,:) = 0.e0 140 p_cglam(:,:) = 0.e0 141 142 DO ji = 2, nlei_crs 143 144 IF ( cd_type == 'T' .OR. cd_type == 'V' ) ijis = mis_crs(ji) + mxbinctr 145 IF ( cd_type == 'U' .OR. cd_type == 'F' ) ijis = mie_crs(ji) 146 147 DO jj = njstart, njend 148 149 IF ( cd_type == 'T' .OR. cd_type == 'U' ) ijjs = mjs_crs(jj) + mybinctr 150 IF ( cd_type == 'V' .OR. cd_type == 'F' ) ijjs = mje_crs(jj) 151 152 p_cgphi(ji,jj) = p_pgphi(ijis,ijjs) 153 p_cglam(ji,jj) = p_pglam(ijis,ijjs) 154 155 ENDDO 156 157 ENDDO 158 159 160 ! Retroactively add back the boundary halo cells. 161 162 CALL crs_lbc_lnk( p_cgphi(:,:),cd_type,1.0 ) 163 CALL crs_lbc_lnk( p_cglam(:,:),cd_type,1.0 ) 139 SELECT CASE ( cd_type ) 140 CASE ( 'T' ) 141 DO jj = nldj_crs, nlej_crs 142 ijjs = mjs_crs(jj) + mybinctr 143 DO ji = 2, nlei_crs 144 ijis = mis_crs(ji) + mxbinctr 145 p_gphi_crs(ji,jj) = p_gphi(ijis,ijjs) 146 p_glam_crs(ji,jj) = p_glam(ijis,ijjs) 147 ENDDO 148 ENDDO 149 CASE ( 'U' ) 150 DO jj = nldj_crs, nlej_crs 151 ijjs = mjs_crs(jj) + mybinctr 152 DO ji = 2, nlei_crs 153 ijis = mis_crs(ji) 154 p_gphi_crs(ji,jj) = p_gphi(ijis,ijjs) 155 p_glam_crs(ji,jj) = p_glam(ijis,ijjs) 156 ENDDO 157 ENDDO 158 CASE ( 'V' ) 159 DO jj = nldj_crs, nlej_crs 160 ijjs = mjs_crs(jj) 161 DO ji = 2, nlei_crs 162 ijis = mis_crs(ji) + mxbinctr 163 p_gphi_crs(ji,jj) = p_gphi(ijis,ijjs) 164 p_glam_crs(ji,jj) = p_glam(ijis,ijjs) 165 ENDDO 166 ENDDO 167 CASE ( 'F' ) 168 DO jj = nldj_crs, nlej_crs 169 ijjs = mjs_crs(jj) 170 DO ji = 2, nlei_crs 171 ijis = mis_crs(ji) 172 p_gphi_crs(ji,jj) = p_gphi(ijis,ijjs) 173 p_glam_crs(ji,jj) = p_glam(ijis,ijjs) 174 ENDDO 175 ENDDO 176 END SELECT 177 178 ! Retroactively add back the boundary halo cells. 179 CALL crs_lbc_lnk( p_gphi_crs, cd_type, 1.0 ) 180 CALL crs_lbc_lnk( p_glam_crs, cd_type, 1.0 ) 164 181 165 182 ! Fill up jrow=1 which is zeroed out or not handled by lbc_lnk and lbc_nfd 166 167 DO ji = 2, nlei_crs 168 169 IF ( cd_type == 'T' .OR. cd_type == 'V' ) ijis = mis_crs(ji) + mxbinctr 170 IF ( cd_type == 'U' .OR. cd_type == 'F' ) ijis = mie_crs(ji) 171 172 p_cgphi(ji,1) = p_pgphi(ijis,1) 173 p_cglam(ji,1) = p_pglam(ijis,1) 174 175 ENDDO 176 177 ! Fill i=1, i=jpi at j=1 178 p_cgphi(1,1) = p_cgphi(jpi_crsm1,1) 179 p_cglam(1,1) = p_cglam(jpi_crsm1,1) 180 p_cgphi(jpi_crs,1) = p_cgphi(2,1) 181 p_cglam(jpi_crs,1) = p_cglam(2,1) 182 ! Fill upper-right corner i=1, j=jpj_crs 183 183 SELECT CASE ( cd_type ) 184 CASE ( 'T', 'V' ) 185 DO ji = 2, nlei_crs 186 ijis = mis_crs(ji) + mxbinctr 187 p_gphi_crs(ji,1) = p_gphi(ijis,1) 188 p_glam_crs(ji,1) = p_glam(ijis,1) 189 ENDDO 190 CASE ( 'U', 'F' ) 191 DO ji = 2, nlei_crs 192 ijis = mis_crs(ji) 193 p_gphi_crs(ji,1) = p_gphi(ijis,1) 194 p_glam_crs(ji,1) = p_glam(ijis,1) 195 ENDDO 196 END SELECT 197 198 ! ! Fill i=1, i=jpi at j=1 199 p_gphi_crs(1 ,1) = p_gphi(jpi_crsm1,1) 200 p_glam_crs(1 ,1) = p_glam(jpi_crsm1,1) 201 ! ! Fill upper-right corner i=1, j=jpj_crs 202 p_gphi_crs(jpi_crs,1) = p_gphi(2 ,1) 203 p_glam_crs(jpi_crs,1) = p_glam(2 ,1) 204 ! 184 205 END SUBROUTINE crs_dom_coordinates 185 206 … … 211 232 212 233 !! Local variables 213 INTEGER 214 INTEGER 234 INTEGER :: ji, jj, jk ! dummy loop indices 235 INTEGER :: ijie,ijis,ijje,ijjs,ijrs 215 236 216 237 !!---------------------------------------------------------------- … … 221 242 ijie = mie_crs(ji) 222 243 ijis = mis_crs(ji) 223 DO jj = n jstart, njend244 DO jj = nldj_crs, nlej_crs 224 245 ijje = mje_crs(jj) 225 246 ijjs = mjs_crs(jj) … … 262 283 263 284 264 SUBROUTINE crsfun_wgt( cd_type, cd_op, p_pmask, p_e1, p_e2, p_fse3, & 265 & p_cfield2d_1, p_cfield2d_2, p_cfield3d_1, p_cfield3d_2 ) 285 SUBROUTINE crs_dom_facvol( p_mask, cd_type, p_e1, p_e2, p_e3, p_fld1_crs, p_fld2_crs ) 266 286 !!---------------------------------------------------------------- 267 287 !! *** SUBROUTINE crsfun_wgt *** … … 304 324 !! 305 325 !! Arguments 306 CHARACTER(len=1), INTENT(in) :: cd_type ! grid type U,V 307 CHARACTER(len=3), INTENT(in) :: cd_op ! operation sum or average 308 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: p_pmask ! Parent grid U,V mask 309 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: p_e1 ! Parent grid U,V scale factors (e1) 310 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: p_e2 ! Parent grid U,V scale factors (e2) 311 312 REAL(wp), DIMENSION(:,:), INTENT(out), OPTIONAL :: p_cfield2d_1 ! Coarse grid box 2D quantity 313 REAL(wp), DIMENSION(:,:), INTENT(out), OPTIONAL :: p_cfield2d_2 ! Coarse grid box 2D quantity 314 REAL(wp), DIMENSION(:,:,:), INTENT(out), OPTIONAL :: p_cfield3d_1 ! Coarse grid box 3D quantity 315 REAL(wp), DIMENSION(:,:,:), INTENT(out), OPTIONAL :: p_cfield3d_2 ! Coarse grid box 3D quantity 316 317 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL :: p_fse3 ! Parent grid vertical level thickness (fse3u, fse3v) 326 CHARACTER(len=1), INTENT(in) :: cd_type ! grid type U,V 327 REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT(in) :: p_mask ! Parent grid U,V mask 328 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in) :: p_e1 ! Parent grid U,V scale factors (e1) 329 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in) :: p_e2 ! Parent grid U,V scale factors (e2) 330 REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT(in) :: p_e3 ! Parent grid vertical level thickness (fse3u, fse3v) 331 332 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(out) :: p_fld1_crs ! Coarse grid box 3D quantity 333 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(out) :: p_fld2_crs ! Coarse grid box 3D quantity 318 334 319 335 !! Local variables 320 INTEGER :: ji, jj, jk, jii, jjj ! dummy loop indices 321 INTEGER :: ijie,ijis,ijje,ijjs,ijpk 322 REAL(wp) :: zdAm ! masked face area 323 REAL(wp), DIMENSION(:,:), POINTER :: ze1, ze2 324 REAL(wp), DIMENSION(:,:,:), POINTER :: ze3 325 REAL(wp), DIMENSION(:,:), POINTER :: zcfield2d_1, zcfield2d_2 326 REAL(wp), DIMENSION(:,:,:), POINTER :: zcfield3d_1, zcfield3d_2 327 336 REAL(wp) :: zdAm 337 INTEGER :: ji, jj, jk ! dummy loop indices 338 INTEGER :: ii, ij, ijie,ijje 339 340 REAL(wp), DIMENSION(:,:,:), POINTER :: zvol 328 341 !!---------------------------------------------------------------- 329 ! Initialize330 331 ! Arrays, scalars initialization332 CALL wrk_alloc(jpi , jpj , ze1, ze2 )333 CALL wrk_alloc(jpi , jpj , jpk, ze3 )334 CALL wrk_alloc(jpi_crs, jpj_crs, zcfield2d_1, zcfield2d_2 )335 CALL wrk_alloc(jpi_crs, jpj_crs, jpk, zcfield3d_1, zcfield3d_2 )336 337 ze1(:,:) = 1.0338 ze2(:,:) = 1.0339 ze3(:,:,:) = 1.0340 zcfield2d_1(:,:) = 0.0341 zcfield2d_2(:,:) = 0.0342 zcfield3d_1(:,:,:) = 0.0343 zcfield3d_2(:,:,:) = 0.0344 345 ijpk = jpk346 347 ! Control of arguments348 ze1(:,:) = p_e1(:,:)349 ze2(:,:) = p_e2(:,:)350 351 IF ( PRESENT(p_cfield2d_1) ) p_cfield2d_1(:,:) = 0.0352 IF ( PRESENT(p_cfield2d_2) ) p_cfield2d_2(:,:) = 0.0353 IF ( PRESENT(p_cfield3d_1) ) p_cfield3d_1(:,:,:) = 0.0354 IF ( PRESENT(p_cfield3d_2) ) p_cfield3d_2(:,:,:) = 0.0355 356 IF ( PRESENT(p_fse3) ) ze3(:,:,:) = p_fse3(:,:,:)357 358 359 DO jk = 1, ijpk360 361 zcfield2d_1(:,:) = 0.0 ; zcfield2d_2(:,:) = 0.0362 DO ji = 2, nlei_crs363 ijie = mie_crs(ji)364 ijis = mis_crs(ji)365 366 367 DO jj = njstart, njend368 ijje = mje_crs(jj)369 ijjs = mjs_crs(jj)370 371 IF ( cd_op == 'POS' ) THEN !cc372 373 IF ( nn_factx == 3 .AND. nn_facty == 3) THEN374 375 SELECT CASE ( cd_type )376 377 CASE ( 'T' )378 379 SELECT CASE ( mje_crs(jj)-mjs_crs(jj) )380 381 CASE( 0, 1 ) ! Si à la frontière sud on a pas assez de maille de la grille mère382 383 zcfield2d_1(ji,jj) = ze1(ijie-1,ijje ) * nn_factx384 zcfield2d_2(ji,jj) = ze2(ijie-1,ijje ) * nn_facty385 386 CASE DEFAULT387 342 388 zcfield2d_1(ji,jj) = ze1(ijie-1,ijje-1) * nn_factx 389 zcfield2d_2(ji,jj) = ze2(ijie-1,ijje-1) * nn_facty 390 391 END SELECT 392 393 CASE ( 'U' ) 394 395 SELECT CASE ( mje_crs(jj)-mjs_crs(jj) ) 396 397 CASE( 0, 1 ) ! Si à la frontière sud on a pas assez de maille de la grille mère 398 399 zcfield2d_1(ji,jj) = ze1(ijie ,ijje ) * nn_factx 400 zcfield2d_2(ji,jj) = ze2(ijie ,ijje ) * nn_facty 401 402 CASE DEFAULT 403 404 zcfield2d_1(ji,jj) = ze1(ijie ,ijje-1) * nn_factx 405 zcfield2d_2(ji,jj) = ze2(ijie ,ijje-1) * nn_facty 406 407 END SELECT 408 409 CASE ( 'V' ) 410 411 zcfield2d_1(ji,jj) = ze1(ijie-1,ijje ) * nn_factx 412 zcfield2d_2(ji,jj) = ze2(ijie-1,ijje ) * nn_facty 413 414 CASE ( 'F' ) 415 416 zcfield2d_1(ji,jj) = ze1(ijie ,ijje ) * nn_factx 417 zcfield2d_2(ji,jj) = ze2(ijie ,ijje ) * nn_facty 418 419 END SELECT 420 ENDIF 421 ENDIF 422 423 424 IF ( cd_op == 'WGT' ) THEN 425 426 zdAm = 0.0 427 428 IF ( cd_type == 'V' ) THEN 429 ! 430 DO jii = ijis, ijie 431 zdAm = zdAm + ( ze1(jii,ijje) * ze3(jii,ijje,jk) * p_pmask(jii,ijje,jk) ) 432 ENDDO 433 IF ( zdAm /= 0 ) zcfield3d_1(ji,jj,jk) = zdAm 434 435 ELSEIF ( cd_type == 'U') THEN 436 DO jjj = ijjs, ijje 437 zdAm = zdAm + ( ze2(ijie,jjj) * ze3(ijie,jjj,jk) * p_pmask(ijie,jjj,jk) ) 438 ENDDO 439 IF ( zdAm /= 0 ) zcfield3d_1(ji,jj,jk) = zdAm 440 441 ELSEIF ( cd_type == 'W' ) THEN 442 DO jii = ijis, ijie 443 DO jjj = ijjs, ijje 444 zdAm = zdAm + ( ze1(jii,jjj) * ze2(jii,jjj) * p_pmask(jii,jjj,jk) ) 445 ENDDO 446 ENDDO 447 IF ( zdAm /= 0 ) zcfield3d_1(ji,jj,jk) = zdAm 448 449 ELSEIF ( cd_type == 'T' ) THEN 450 DO jii = ijis, ijie 451 DO jjj = ijjs, ijje 452 zdAm = zdAm + ( ze1(jii,jjj) * ze2(jii,jjj) * ze3(jii,jjj,jk) * p_pmask(jii,jjj,jk) ) 453 ENDDO 454 ENDDO 455 IF ( zdAm /= 0 ) zcfield3d_1(ji,jj,jk) = zdAm 456 457 ELSE 458 459 ! jes. Add a stop? 460 461 ENDIF 462 463 ENDIF 464 465 IF ( cd_op == 'VOL' ) THEN 466 467 zdAm = 0.0 468 469 IF ( cd_type == 'W' .OR. cd_type == 'T' ) THEN 470 471 DO jii = ijis, ijie 472 DO jjj = ijjs, ijje 473 zcfield3d_1(ji,jj,jk) = zcfield3d_1(ji,jj,jk) + ( ze1(jii,jjj) * ze2(jii,jjj) * ze3(jii,jjj,jk) ) 474 zdAm = zdAm + ( ze1(jii,jjj) * ze2(jii,jjj) * ze3(jii,jjj,jk) * p_pmask(jii,jjj,jk) ) 475 ENDDO 476 ENDDO 477 IF ( zcfield3d_1(ji,jj,jk) /= 0 ) zcfield3d_2(ji,jj,jk) = zdAm / zcfield3d_1(ji,jj,jk) 478 479 ELSE 480 ! jes. add a stop? 481 ENDIF 482 483 ENDIF 484 485 ENDDO 486 ENDDO 487 488 ENDDO 489 490 ! Retroactively add back the boundary halo cells. 491 492 493 494 ! Take care of the 2D arrays 495 IF ( cd_op == 'SUM' .OR. cd_op == 'POS') THEN 496 IF ( PRESENT(p_cfield2d_1) ) THEN 497 p_cfield2d_1(:,:) = zcfield2d_1(:,:) 498 CALL crs_lbc_lnk( p_cfield2d_1(:,:),cd_type,1.0, pval=1.0) 499 ENDIF 500 501 IF ( PRESENT(p_cfield2d_2) ) THEN 502 p_cfield2d_2(:,:) = zcfield2d_2(:,:) 503 CALL crs_lbc_lnk( p_cfield2d_2(:,:),cd_type,1.0, pval=1.0 ) 504 505 IF ( cd_op == 'SUM') THEN 506 DO jii = 1 , jpiglo_crs 507 p_cfield2d_2(jii,1) = p_cfield2d_2(jii,1) * 3 508 ENDDO 509 ENDIF 510 ENDIF 511 512 ELSE 513 514 CALL crs_lbc_lnk( zcfield2d_1(:,:),cd_type,1.0 ) 515 IF ( PRESENT(p_cfield2d_1) ) p_cfield2d_1(:,:) = zcfield2d_1(:,:) 516 CALL crs_lbc_lnk( zcfield2d_2(:,:),cd_type,1.0 ) 517 IF ( PRESENT(p_cfield2d_2) ) p_cfield2d_2(:,:) = zcfield2d_2(:,:) 518 519 ENDIF 520 521 ! Take care now of 3d arrays 522 IF ( cd_op == 'SUM' .OR. cd_op == 'VOL' .OR. cd_op == 'POS' ) THEN 523 CALL crs_lbc_lnk( zcfield3d_1(:,:,:),cd_type,1.0 ) 524 IF ( PRESENT(p_cfield3d_1) ) p_cfield3d_1(:,:,:) = zcfield3d_1(:,:,:) 525 CALL crs_lbc_lnk( zcfield3d_2(:,:,:),cd_type,1.0 ) 526 IF ( PRESENT(p_cfield3d_2) ) p_cfield3d_2(:,:,:) = zcfield3d_2(:,:,:) 527 ELSE 528 p_cfield3d_1(:,:,:) = zcfield3d_1(:,:,:) 529 CALL crs_lbc_lnk( p_cfield3d_1(:,:,:),cd_type,1.0 ) 530 531 ! Fill upper-right corner i=1, j=jpj_crs 532 IF ( nperio == 4 ) THEN 533 p_cfield3d_1(1,jpj_crs,:) = p_cfield3d_1(jpi_crsm1,jpj_crs-2,:) 534 ELSEIF ( nperio == 6 ) THEN 535 p_cfield3d_1(1,jpj_crs,:) = p_cfield3d_1(jpi_crs,jpj_crsm1,:) 536 ENDIF 537 538 ENDIF 539 540 CALL wrk_dealloc(jpi , jpj , ze1, ze2 ) 541 CALL wrk_dealloc(jpi , jpj , jpk, ze3 ) 542 CALL wrk_dealloc(jpi_crs, jpj_crs, zcfield2d_1, zcfield2d_2 ) 543 CALL wrk_dealloc(jpi_crs, jpj_crs, jpk, zcfield3d_1, zcfield3d_2 ) 544 545 END SUBROUTINE crsfun_wgt 546 547 548 SUBROUTINE crsfun_UV( p_e1_e2, cd_type, psgn, p_pmask, p_fse3, p_pfield, p_surf_crs, p_cfield3d ) 343 CALL wrk_alloc( jpi, jpj, jpk, zvol ) 344 345 DO jk = 1, jpk 346 zvol(:,:,jk) = p_e1(:,:) * p_e2(:,:) * p_e3(:,:,jk) 347 ENDDO 348 349 DO jk = 1, jpk 350 DO ji = nistr, niend, nn_factx 351 DO jj = njstr, njend, nn_facty 352 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 ! cordinate in parent grid 353 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 354 ijje = mje_crs(ij) 355 ijie = mie_crs(ii) 356 ! 357 p_fld1_crs(ii,ij,jk) = zvol(ji,jj ,jk) + zvol(ji+1,jj ,jk) + zvol(ji+2,jj ,jk) & 358 & + zvol(ji,jj+1,jk) + zvol(ji+1,jj+1,jk) + zvol(ji+2,jj+1,jk) & 359 & + zvol(ji,jj+2,jk) + zvol(ji+1,jj+2,jk) + zvol(ji+2,jj+2,jk) 360 ENDDO 361 ENDDO 362 ENDDO 363 364 IF( cd_type == 'T' ) THEN 365 DO jk = 1, jpk 366 DO ji = nistr, niend, nn_factx 367 DO jj = njstr, njend, nn_facty 368 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 ! cordinate in parent grid 369 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 370 ijje = mje_crs(ij) 371 ijie = mie_crs(ii) 372 ! 373 zdAm = zvol(ji ,jj ,jk) * p_mask(ji ,jj ,jk) & 374 & + zvol(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk) & 375 & + zvol(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk) & 376 & + zvol(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk) & 377 & + zvol(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk) & 378 & + zvol(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk) & 379 & + zvol(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk) & 380 & + zvol(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk) & 381 & + zvol(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk) 382 ! 383 IF( p_fld1_crs(ii,ij,jk) /= 0._wp ) p_fld2_crs(ii,ij,jk) = zdAm / p_fld1_crs(ii,ij,jk) 384 ! 385 ENDDO 386 ENDDO 387 ENDDO 388 ENDIF 389 ! 390 IF( cd_type == 'W' ) THEN 391 DO jk = 2, jpk 392 DO ji = nistr, niend, nn_factx 393 DO jj = njstr, njend, nn_facty 394 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 ! cordinate in parent grid 395 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 396 ijje = mje_crs(ij) 397 ijie = mie_crs(ii) 398 ! 399 zdAm = zvol(ji ,jj ,jk) * p_mask(ji ,jj ,jk-1) & 400 & + zvol(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk-1) & 401 & + zvol(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk-1) & 402 & + zvol(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk-1) & 403 & + zvol(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk-1) & 404 & + zvol(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk-1) & 405 & + zvol(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk-1) & 406 & + zvol(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk-1) & 407 & + zvol(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk-1) 408 ! 409 IF( p_fld1_crs(ii,ij,jk) /= 0._wp ) p_fld2_crs(ii,ij,jk) = zdAm / p_fld1_crs(ii,ij,jk) 410 ! 411 ENDDO 412 ENDDO 413 ENDDO 414 DO ji = nistr, niend, nn_factx 415 DO jj = njstr, njend, nn_facty 416 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 ! cordinate in parent grid 417 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 418 ijje = mje_crs(ij) 419 ijie = mie_crs(ii) 420 ! 421 zdAm = zvol(ji ,jj ,1) * p_mask(ji ,jj ,1) & 422 & + zvol(ji+1,jj ,1) * p_mask(ji+1,jj ,1) & 423 & + zvol(ji+2,jj ,1) * p_mask(ji+2,jj ,1) & 424 & + zvol(ji ,jj+1,1) * p_mask(ji ,jj+1,1) & 425 & + zvol(ji+1,jj+1,1) * p_mask(ji+1,jj+1,1) & 426 & + zvol(ji+2,jj+1,1) * p_mask(ji+2,jj+1,1) & 427 & + zvol(ji ,jj+2,1) * p_mask(ji ,jj+2,1) & 428 & + zvol(ji+1,jj+2,1) * p_mask(ji+1,jj+2,1) & 429 & + zvol(ji+2,jj+2,1) * p_mask(ji+2,jj+2,1) 430 ! 431 IF( p_fld1_crs(ii,ij,1) /= 0._wp ) p_fld2_crs(ii,ij,1) = zdAm / p_fld2_crs(ii,ij,1) 432 ! 433 ENDDO 434 ENDDO 435 ENDIF 436 437 ! ! Retroactively add back the boundary halo cells. 438 CALL crs_lbc_lnk( p_fld1_crs, cd_type, 1.0 ) 439 CALL crs_lbc_lnk( p_fld2_crs, cd_type, 1.0 ) 440 ! 441 CALL wrk_dealloc( jpi, jpj, jpk, zvol ) 442 ! 443 END SUBROUTINE crs_dom_facvol 444 445 446 SUBROUTINE crs_dom_ope_3d( p_fld, cd_op, cd_type, p_mask, p_fld_crs, p_e12, p_e3, p_surf_crs, p_mask_crs ) 549 447 !!---------------------------------------------------------------- 550 448 !! *** SUBROUTINE crsfun_UV *** … … 571 469 !! 572 470 !! Arguments 573 REAL(wp), DIMENSION(jpi,jpj ), INTENT(in) :: p_e1_e2 ! Parent grid U,V scale factors (e1 or e2)574 CHARACTER(len= 1), INTENT(in) :: cd_type ! grid type U,V575 REAL(wp), INTENT(in) :: psgn ! sign change option across north fold576 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: p_pmask ! Parent gridU,V mask577 REAL(wp), DIMENSION(jpi,jpj ,jpk), INTENT(in) :: p_fse3 ! Parent grid vertical level thickness (fse3u, fse3v)578 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: p_pfield ! U or V on parent grid471 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: p_fld ! T, U, V or W on parent grid 472 CHARACTER(len=3), INTENT(in) :: cd_op ! Operation SUM, MAX or MIN 473 CHARACTER(len=1), INTENT(in) :: cd_type ! grid type U,V 474 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: p_mask ! Parent grid T,U,V mask 475 REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: p_e12 ! Parent grid T,U,V scale factors (e1 or e2) 476 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL :: p_e3 ! Parent grid vertical level thickness (fse3u, fse3v) 579 477 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(in), OPTIONAL :: p_surf_crs ! Coarse grid area-weighting denominator 580 581 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(out) :: p_cfield3d ! Coarse grid box 3D quantity 478 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(in), OPTIONAL :: p_mask_crs ! Coarse grid T,U,V mask 479 480 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(out) :: p_fld_crs ! Coarse grid box 3D quantity 582 481 583 482 !! Local variables 584 INTEGER :: ji, jj, jk , jii, jjj ! dummy loop indices 585 INTEGER :: ijie, ijis, ijje, ijjs 586 REAL(wp), DIMENSION(:,:,:), POINTER :: zsurfcrs 483 INTEGER :: ji, jj, jk ! dummy loop indices 484 INTEGER :: ijie, ijje, ii, ij 485 REAL(wp) :: zflcrs, zsfcrs 486 REAL(wp) :: zeps = 1.e20 487 REAL(wp), DIMENSION(:,:,:), POINTER :: zsurf 587 488 588 489 !!---------------------------------------------------------------- 589 590 CALL wrk_alloc( jpi_crs, jpj_crs, jpk, zsurfcrs ) 591 zsurfcrs(:,:,:) = 1.0 592 IF ( PRESENT(p_surf_crs) ) THEN 593 WHERE ( p_surf_crs /= 0 ) zsurfcrs(:,:,:) = 1.0/p_surf_crs(:,:,:) 594 ENDIF 595 596 DO jk = 1, jpk 597 598 DO ji = 2, nlei_crs 599 ijie = mie_crs(ji) 600 ijis = mis_crs(ji) 601 602 DO jj = njstart, njend 603 ijje = mje_crs(jj) 604 ijjs = mjs_crs(jj) 605 606 IF ( cd_type == 'V' ) THEN 607 608 DO jii = ijis, ijie 609 p_cfield3d(ji,jj,jk) = p_cfield3d(ji,jj,jk) & 610 & + ( p_pfield(jii,ijje,jk) * p_e1_e2(jii,ijje) * p_fse3(jii,ijje,jk) * p_pmask(jii,ijje,jk) ) 490 491 492 SELECT CASE ( cd_op ) 493 494 CASE ( 'VOL' ) 495 496 CALL wrk_alloc( jpi, jpj, jpk, zsurf ) 497 DO jk = 1, jpk 498 zsurf(:,:,jk) = p_e12(:,:) * p_e3(:,:,jk) 499 ENDDO 500 501 SELECT CASE ( cd_type ) 502 503 CASE( 'T' ) 504 505 DO jk = 1, jpk 506 507 DO ji = nistr, niend, nn_factx 508 DO jj = njstr, njend, nn_facty 509 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 510 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 511 ijje = mje_crs(ij) 512 ijie = mie_crs(ii) 513 514 zflcrs = p_fld(ji ,jj ,jk) * zsurf(ji ,jj ,jk) * p_mask(ji ,jj ,jk) & 515 & + p_fld(ji+1,jj ,jk) * zsurf(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk) & 516 & + p_fld(ji+2,jj ,jk) * zsurf(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk) & 517 & + p_fld(ji ,jj+1,jk) * zsurf(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk) & 518 & + p_fld(ji+1,jj+1,jk) * zsurf(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk) & 519 & + p_fld(ji+2,jj+1,jk) * zsurf(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk) & 520 & + p_fld(ji ,jj+2,jk) * zsurf(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk) & 521 & + p_fld(ji+1,jj+2,jk) * zsurf(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk) & 522 & + p_fld(ji+2,jj+2,jk) * zsurf(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk) 523 524 zsfcrs = zsurf(ji ,jj ,jk) * p_mask(ji ,jj ,jk) & 525 & + zsurf(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk) & 526 & + zsurf(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk) & 527 & + zsurf(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk) & 528 & + zsurf(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk) & 529 & + zsurf(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk) & 530 & + zsurf(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk) & 531 & + zsurf(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk) & 532 & + zsurf(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk) 533 ! 534 p_fld_crs(ii,ij,jk) = zflcrs 535 IF( zsfcrs /= 0.0 ) p_fld_crs(ii,ij,jk) = zflcrs / zsfcrs 536 537 ENDDO 538 ENDDO 539 ENDDO 540 541 CASE( 'W' ) 542 543 DO jk = 2, jpk 544 545 DO ji = nistr, niend, nn_factx 546 DO jj = njstr, njend, nn_facty 547 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 548 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 549 ijje = mje_crs(ij) 550 ijie = mie_crs(ii) 551 552 zflcrs = p_fld(ji ,jj ,jk) * zsurf(ji ,jj ,jk) * p_mask(ji ,jj ,jk-1) & 553 & + p_fld(ji+1,jj ,jk) * zsurf(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk-1) & 554 & + p_fld(ji+2,jj ,jk) * zsurf(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk-1) & 555 & + p_fld(ji ,jj+1,jk) * zsurf(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk-1) & 556 & + p_fld(ji+1,jj+1,jk) * zsurf(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk-1) & 557 & + p_fld(ji+2,jj+1,jk) * zsurf(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk-1) & 558 & + p_fld(ji ,jj+2,jk) * zsurf(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk-1) & 559 & + p_fld(ji+1,jj+2,jk) * zsurf(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk-1) & 560 & + p_fld(ji+2,jj+2,jk) * zsurf(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk-1) 561 562 zsfcrs = zsurf(ji ,jj ,jk) * p_mask(ji ,jj ,jk-1) & 563 & + zsurf(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk-1) & 564 & + zsurf(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk-1) & 565 & + zsurf(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk-1) & 566 & + zsurf(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk-1) & 567 & + zsurf(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk-1) & 568 & + zsurf(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk-1) & 569 & + zsurf(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk-1) & 570 & + zsurf(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk-1) 571 ! 572 p_fld_crs(ii,ij,jk) = zflcrs 573 IF( zsfcrs /= 0.0 ) p_fld_crs(ii,ij,jk) = zflcrs / zsfcrs 574 575 ENDDO 576 ENDDO 577 ENDDO 578 579 DO ji = nistr, niend, nn_factx 580 DO jj = njstr, njend, nn_facty 581 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 582 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 583 ijje = mje_crs(ij) 584 ijie = mie_crs(ii) 585 586 zflcrs = p_fld(ji ,jj ,1) * zsurf(ji ,jj ,1) * p_mask(ji ,jj ,1) & 587 & + p_fld(ji+1,jj ,1) * zsurf(ji+1,jj ,1) * p_mask(ji+1,jj ,1) & 588 & + p_fld(ji+2,jj ,1) * zsurf(ji+2,jj ,1) * p_mask(ji+2,jj ,1) & 589 & + p_fld(ji ,jj+1,1) * zsurf(ji ,jj+1,1) * p_mask(ji ,jj+1,1) & 590 & + p_fld(ji+1,jj+1,1) * zsurf(ji+1,jj+1,1) * p_mask(ji+1,jj+1,1) & 591 & + p_fld(ji+2,jj+1,1) * zsurf(ji+2,jj+1,1) * p_mask(ji+2,jj+1,1) & 592 & + p_fld(ji ,jj+2,1) * zsurf(ji ,jj+2,1) * p_mask(ji ,jj+2,1) & 593 & + p_fld(ji+1,jj+2,1) * zsurf(ji+1,jj+2,1) * p_mask(ji+1,jj+2,1) & 594 & + p_fld(ji+2,jj+2,1) * zsurf(ji+2,jj+2,1) * p_mask(ji+2,jj+2,1) 595 596 zsfcrs = zsurf(ji ,jj ,1) * p_mask(ji ,jj ,1) & 597 & + zsurf(ji+1,jj ,1) * p_mask(ji+1,jj ,1) & 598 & + zsurf(ji+2,jj ,1) * p_mask(ji+2,jj ,1) & 599 & + zsurf(ji ,jj+1,1) * p_mask(ji ,jj+1,1) & 600 & + zsurf(ji+1,jj+1,1) * p_mask(ji+1,jj+1,1) & 601 & + zsurf(ji+2,jj+1,1) * p_mask(ji+2,jj+1,1) & 602 & + zsurf(ji ,jj+2,1) * p_mask(ji ,jj+2,1) & 603 & + zsurf(ji+1,jj+2,1) * p_mask(ji+1,jj+2,1) & 604 & + zsurf(ji+2,jj+2,1) * p_mask(ji+2,jj+2,1) 605 606 p_fld_crs(ii,ij,1) = zflcrs 607 IF( zsfcrs /= 0.0 ) p_fld_crs(ii,ij,1) = zflcrs / zsfcrs 608 609 ENDDO 611 610 ENDDO 612 p_cfield3d(ji,jj,jk) = p_cfield3d(ji,jj,jk) * zsurfcrs(ji,jj,jk) 613 614 ELSEIF ( cd_type == 'U') THEN 615 616 DO jjj = ijjs, ijje 617 p_cfield3d(ji,jj,jk) = p_cfield3d(ji,jj,jk) & 618 & + ( p_pfield(ijie,jjj,jk) * p_e1_e2(ijie,jjj) * p_fse3(ijie,jjj,jk) * p_pmask(ijie,jjj,jk) ) 611 612 END SELECT 613 614 CALL wrk_dealloc( jpi, jpj, jpk, zsurf ) 615 616 CASE ( 'SUM' ) 617 618 CALL wrk_alloc( jpi, jpj, jpk, zsurf ) 619 DO jk = 1, jpk 620 zsurf(:,:,jk) = p_e12(:,:) * p_e3(:,:,jk) 621 ENDDO 622 623 SELECT CASE ( cd_type ) 624 625 CASE( 'T' ) 626 627 DO jk = 1, jpk 628 DO ji = nistr, niend, nn_factx 629 DO jj = njstr, njend, nn_facty 630 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 631 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 632 ijje = mje_crs(ij) 633 ijie = mie_crs(ii) 634 635 zflcrs = p_fld(ji ,jj ,jk) * zsurf(ji ,jj ,jk) * p_mask(ji ,jj ,jk) & 636 & + p_fld(ji+1,jj ,jk) * zsurf(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk) & 637 & + p_fld(ji+2,jj ,jk) * zsurf(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk) & 638 & + p_fld(ji ,jj+1,jk) * zsurf(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk) & 639 & + p_fld(ji+1,jj+1,jk) * zsurf(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk) & 640 & + p_fld(ji+2,jj+1,jk) * zsurf(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk) & 641 & + p_fld(ji ,jj+2,jk) * zsurf(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk) & 642 & + p_fld(ji+1,jj+2,jk) * zsurf(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk) & 643 & + p_fld(ji+2,jj+2,jk) * zsurf(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk) 644 ! 645 p_fld_crs(ii,ij,jk) = zflcrs 646 ! 647 ENDDO 648 ENDDO 649 ENDDO 650 651 CASE( 'W' ) 652 653 DO jk = 2, jpk 654 DO ji = nistr, niend, nn_factx 655 DO jj = njstr, njend, nn_facty 656 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 657 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 658 ijje = mje_crs(ij) 659 ijie = mie_crs(ii) 660 ! 661 zflcrs = p_fld(ji ,jj ,jk) * zsurf(ji ,jj ,jk) * p_mask(ji ,jj ,jk-1) & 662 & + p_fld(ji+1,jj ,jk) * zsurf(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk-1) & 663 & + p_fld(ji+2,jj ,jk) * zsurf(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk-1) & 664 & + p_fld(ji ,jj+1,jk) * zsurf(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk-1) & 665 & + p_fld(ji+1,jj+1,jk) * zsurf(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk-1) & 666 & + p_fld(ji+2,jj+1,jk) * zsurf(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk-1) & 667 & + p_fld(ji ,jj+2,jk) * zsurf(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk-1) & 668 & + p_fld(ji+1,jj+2,jk) * zsurf(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk-1) & 669 & + p_fld(ji+2,jj+2,jk) * zsurf(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk-1) 670 ! 671 p_fld_crs(ii,ij,jk) = zflcrs 672 ! 673 ENDDO 674 ENDDO 675 ENDDO 676 677 DO ji = nistr, niend, nn_factx 678 DO jj = njstr, njend, nn_facty 679 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 680 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 681 ijje = mje_crs(ij) 682 ijie = mie_crs(ii) 683 ! 684 zflcrs = p_fld(ji ,jj ,1) * zsurf(ji ,jj ,1) * p_mask(ji ,jj ,1) & 685 & + p_fld(ji+1,jj ,1) * zsurf(ji+1,jj ,1) * p_mask(ji+1,jj ,1) & 686 & + p_fld(ji+2,jj ,1) * zsurf(ji+2,jj ,1) * p_mask(ji+2,jj ,1) & 687 & + p_fld(ji ,jj+1,1) * zsurf(ji ,jj+1,1) * p_mask(ji ,jj+1,1) & 688 & + p_fld(ji+1,jj+1,1) * zsurf(ji+1,jj+1,1) * p_mask(ji+1,jj+1,1) & 689 & + p_fld(ji+2,jj+1,1) * zsurf(ji+2,jj+1,1) * p_mask(ji+2,jj+1,1) & 690 & + p_fld(ji ,jj+2,1) * zsurf(ji ,jj+2,1) * p_mask(ji ,jj+2,1) & 691 & + p_fld(ji+1,jj+2,1) * zsurf(ji+1,jj+2,1) * p_mask(ji+1,jj+2,1) & 692 & + p_fld(ji+2,jj+2,1) * zsurf(ji+2,jj+2,1) * p_mask(ji+2,jj+2,1) 693 ! 694 p_fld_crs(ii,ij,1) = zflcrs 695 ! 696 ENDDO 619 697 ENDDO 620 p_cfield3d(ji,jj,jk) = p_cfield3d(ji,jj,jk) * zsurfcrs(ji,jj,jk) 621 622 ENDIF 623 624 ENDDO 625 ENDDO 626 ENDDO 627 628 ! Retroactively add back the boundary halo cells. 629 630 CALL crs_lbc_lnk( p_cfield3d(:,:,:),cd_type,psgn ) 631 632 CALL wrk_dealloc( jpi_crs, jpj_crs, jpk, zsurfcrs ) 633 634 END SUBROUTINE crsfun_UV 635 636 SUBROUTINE crsfun_TW( p_e1e2t, cd_type, cd_op, p_cmask, p_ptmask, psgn, p_pfield2d, p_pfield3d_1, p_pfield3d_2, & 637 & p_cfield2d, p_cfield3d) 698 699 CASE( 'V' ) 700 701 DO jk = 1, jpk 702 DO ji = nistr, niend, nn_factx 703 DO jj = njstr, njend, nn_facty 704 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 705 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 706 ijje = mje_crs(ij) 707 ijie = mie_crs(ii) 708 ! 709 zflcrs = p_fld(ji ,ijje,jk) * zsurf(ji ,ijje,jk) * p_mask(ji ,ijje,jk) & 710 & + p_fld(ji+1,ijje,jk) * zsurf(ji+1,ijje,jk) * p_mask(ji+1,ijje,jk) & 711 & + p_fld(ji+2,ijje,jk) * zsurf(ji+2,ijje,jk) * p_mask(ji+2,ijje,jk) 712 ! 713 p_fld_crs(ii,ij,jk) = zflcrs 714 ! 715 ENDDO 716 ENDDO 717 ENDDO 718 719 720 CASE( 'U' ) 721 722 DO jk = 1, jpk 723 DO ji = nistr, niend, nn_factx 724 DO jj = njstr, njend, nn_facty 725 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 726 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 727 ijje = mje_crs(ij) 728 ijie = mie_crs(ii) 729 ! 730 zflcrs = p_fld(ijie,jj ,jk) * zsurf(ijie,jj ,jk) * p_mask(ijie,jj ,jk) & 731 & + p_fld(ijie,jj+1,jk) * zsurf(ijie,jj+1,jk) * p_mask(ijie,jj+1,jk) & 732 & + p_fld(ijie,jj+2,jk) * zsurf(ijie,jj+2,jk) * p_mask(ijie,jj+2,jk) 733 ! 734 p_fld_crs(ii,ij,jk) = zflcrs 735 ! 736 ENDDO 737 ENDDO 738 ENDDO 739 740 END SELECT 741 742 IF( PRESENT( p_surf_crs ) ) THEN 743 WHERE ( p_surf_crs /= 0.0 ) p_fld_crs(:,:,:) = p_fld_crs(:,:,:) / p_surf_crs(:,:,:) 744 ENDIF 745 746 CALL wrk_dealloc( jpi, jpj, jpk, zsurf ) 747 748 CASE ( 'MAX' ) 749 750 SELECT CASE ( cd_type ) 751 752 CASE( 'T' ) 753 754 DO jk = 1, jpk 755 DO ji = nistr, niend, nn_factx 756 DO jj = njstr, njend, nn_facty 757 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 758 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 759 ijje = mje_crs(ij) 760 ijie = mie_crs(ii) 761 762 zflcrs = MAX( p_fld(ji ,jj ,jk) * p_mask(ji ,jj ,jk), & 763 & p_fld(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk), & 764 & p_fld(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk), & 765 & p_fld(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk), & 766 & p_fld(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk), & 767 & p_fld(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk), & 768 & p_fld(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk), & 769 & p_fld(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk), & 770 & p_fld(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk) ) 771 ! 772 p_fld_crs(ii,ij,jk) = zflcrs 773 ! 774 ENDDO 775 ENDDO 776 ENDDO 777 778 CASE( 'W' ) 779 780 DO jk = 2, jpk 781 DO ji = nistr, niend, nn_factx 782 DO jj = njstr, njend, nn_facty 783 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 784 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 785 ijje = mje_crs(ij) 786 ijie = mie_crs(ii) 787 ! 788 zflcrs = MAX( p_fld(ji ,jj ,jk) * p_mask(ji ,jj ,jk-1), & 789 & p_fld(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk-1), & 790 & p_fld(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk-1), & 791 & p_fld(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk-1), & 792 & p_fld(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk-1), & 793 & p_fld(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk-1), & 794 & p_fld(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk-1), & 795 & p_fld(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk-1), & 796 & p_fld(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk-1) ) 797 ! 798 p_fld_crs(ii,ij,jk) = zflcrs 799 ! 800 ENDDO 801 ENDDO 802 ENDDO 803 804 DO ji = nistr, niend, nn_factx 805 DO jj = njstr, njend, nn_facty 806 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 807 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 808 ijje = mje_crs(ij) 809 ijie = mie_crs(ii) 810 ! 811 zflcrs = MAX( p_fld(ji ,jj ,1) * p_mask(ji ,jj ,1), & 812 & p_fld(ji+1,jj ,1) * p_mask(ji+1,jj ,1), & 813 & p_fld(ji+2,jj ,1) * p_mask(ji+2,jj ,1), & 814 & p_fld(ji ,jj+1,1) * p_mask(ji ,jj+1,1), & 815 & p_fld(ji+1,jj+1,1) * p_mask(ji+1,jj+1,1), & 816 & p_fld(ji+2,jj+1,1) * p_mask(ji+2,jj+1,1), & 817 & p_fld(ji ,jj+2,1) * p_mask(ji ,jj+2,1), & 818 & p_fld(ji+1,jj+2,1) * p_mask(ji+1,jj+2,1), & 819 & p_fld(ji+2,jj+2,1) * p_mask(ji+2,jj+2,1) ) 820 ! 821 p_fld_crs(ii,ij,1) = zflcrs 822 ! 823 ENDDO 824 ENDDO 825 826 CASE( 'V' ) 827 828 DO jk = 1, jpk 829 DO ji = nistr, niend, nn_factx 830 DO jj = njstr, njend, nn_facty 831 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 832 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 833 ijje = mje_crs(ij) 834 ijie = mie_crs(ii) 835 ! 836 zflcrs = MAX( p_fld(ji ,ijje,jk) * p_mask(ji ,ijje,jk), & 837 & p_fld(ji+1,ijje,jk) * p_mask(ji+1,ijje,jk), & 838 & p_fld(ji+2,ijje,jk) * p_mask(ji+2,ijje,jk) ) 839 ! 840 p_fld_crs(ii,ij,jk) = zflcrs 841 ! 842 ENDDO 843 ENDDO 844 ENDDO 845 846 847 CASE( 'U' ) 848 849 DO jk = 1, jpk 850 DO ji = nistr, niend, nn_factx 851 DO jj = njstr, njend, nn_facty 852 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 853 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 854 ijje = mje_crs(ij) 855 ijie = mie_crs(ii) 856 ! 857 Zflcrs = MAX( p_fld(ijie,jj ,jk) * p_mask(ijie,jj ,jk), & 858 & p_fld(ijie,jj+1,jk) * p_mask(ijie,jj+1,jk), & 859 & p_fld(ijie,jj+2,jk) * p_mask(ijie,jj+2,jk) ) 860 ! 861 p_fld_crs(ii,ij,jk) = zflcrs 862 ! 863 ENDDO 864 ENDDO 865 ENDDO 866 867 END SELECT 868 869 CASE ( 'MIN' ) 870 ! Search the min of masked grid cells 871 SELECT CASE ( cd_type ) 872 873 CASE( 'T' ) 874 875 DO jk = 1, jpk 876 DO ji = nistr, niend, nn_factx 877 DO jj = njstr, njend, nn_facty 878 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 879 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 880 ijje = mje_crs(ij) 881 ijie = mie_crs(ii) 882 883 zflcrs = MIN( p_fld(ji ,jj ,jk) * ( 1. + ( 1. - p_mask(ji ,jj ,jk) ) * zeps ), & 884 & p_fld(ji+1,jj ,jk) * ( 1. + ( 1. - p_mask(ji+1,jj ,jk) ) * zeps ), & 885 & p_fld(ji+2,jj ,jk) * ( 1. + ( 1. - p_mask(ji+2,jj ,jk) ) * zeps ), & 886 & p_fld(ji ,jj+1,jk) * ( 1. + ( 1. - p_mask(ji ,jj ,jk) ) * zeps ), & 887 & p_fld(ji+1,jj+1,jk) * ( 1. + ( 1. - p_mask(ji+1,jj+1,jk) ) * zeps ), & 888 & p_fld(ji+2,jj+1,jk) * ( 1. + ( 1. - p_mask(ji+2,jj+2,jk) ) * zeps ), & 889 & p_fld(ji ,jj+2,jk) * ( 1. + ( 1. - p_mask(ji ,jj ,jk) ) * zeps ), & 890 & p_fld(ji+1,jj+2,jk) * ( 1. + ( 1. - p_mask(ji+1,jj+1,jk) ) * zeps ), & 891 & p_fld(ji+2,jj+2,jk) * ( 1. + ( 1. - p_mask(ji+2,jj+2,jk) ) * zeps ) ) 892 ! 893 p_fld_crs(ii,ij,jk) = zflcrs * p_mask_crs(ii,ij,jk) 894 ! 895 ENDDO 896 ENDDO 897 ENDDO 898 899 CASE( 'W' ) 900 901 DO jk = 2, jpk 902 DO ji = nistr, niend, nn_factx 903 DO jj = njstr, njend, nn_facty 904 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 905 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 906 ijje = mje_crs(ij) 907 ijie = mie_crs(ii) 908 909 zflcrs = MIN( p_fld(ji ,jj ,jk) * ( 1. + ( 1. - p_mask(ji ,jj ,jk-1) ) * zeps ), & 910 & p_fld(ji+1,jj ,jk) * ( 1. + ( 1. - p_mask(ji+1,jj ,jk-1) ) * zeps ), & 911 & p_fld(ji+2,jj ,jk) * ( 1. + ( 1. - p_mask(ji+2,jj ,jk-1) ) * zeps ), & 912 & p_fld(ji ,jj+1,jk) * ( 1. + ( 1. - p_mask(ji ,jj ,jk-1) ) * zeps ), & 913 & p_fld(ji+1,jj+1,jk) * ( 1. + ( 1. - p_mask(ji+1,jj+1,jk-1) ) * zeps ), & 914 & p_fld(ji+2,jj+1,jk) * ( 1. + ( 1. - p_mask(ji+2,jj+2,jk-1) ) * zeps ), & 915 & p_fld(ji ,jj+2,jk) * ( 1. + ( 1. - p_mask(ji ,jj ,jk-1) ) * zeps ), & 916 & p_fld(ji+1,jj+2,jk) * ( 1. + ( 1. - p_mask(ji+1,jj+1,jk-1) ) * zeps ), & 917 & p_fld(ji+2,jj+2,jk) * ( 1. + ( 1. - p_mask(ji+2,jj+2,jk-1) ) * zeps ) ) 918 ! 919 p_fld_crs(ii,ij,jk) = zflcrs * p_mask_crs(ii,ij,jk) 920 ! 921 ENDDO 922 ENDDO 923 ENDDO 924 925 DO ji = nistr, niend, nn_factx 926 DO jj = njstr, njend, nn_facty 927 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 928 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 929 ijje = mje_crs(ij) 930 ijie = mie_crs(ii) 931 932 zflcrs = MIN( p_fld(ji ,jj ,1) * ( 1. + ( 1. - p_mask(ji ,jj ,1) ) * zeps ), & 933 & p_fld(ji+1,jj ,1) * ( 1. + ( 1. - p_mask(ji+1,jj ,1) ) * zeps ), & 934 & p_fld(ji+2,jj ,1) * ( 1. + ( 1. - p_mask(ji+2,jj ,1) ) * zeps ), & 935 & p_fld(ji ,jj+1,1) * ( 1. + ( 1. - p_mask(ji ,jj ,1) ) * zeps ), & 936 & p_fld(ji+1,jj+1,1) * ( 1. + ( 1. - p_mask(ji+1,jj+1,1) ) * zeps ), & 937 & p_fld(ji+2,jj+1,1) * ( 1. + ( 1. - p_mask(ji+2,jj+2,1) ) * zeps ), & 938 & p_fld(ji ,jj+2,1) * ( 1. + ( 1. - p_mask(ji ,jj ,1) ) * zeps ), & 939 & p_fld(ji+1,jj+2,1) * ( 1. + ( 1. - p_mask(ji+1,jj+1,1) ) * zeps ), & 940 & p_fld(ji+2,jj+2,1) * ( 1. + ( 1. - p_mask(ji+2,jj+2,1) ) * zeps ) ) 941 ! 942 p_fld_crs(ii,ij,1) = zflcrs * p_mask_crs(ii,ij,1) 943 ! 944 ENDDO 945 ENDDO 946 947 CASE( 'V' ) 948 949 DO jk = 1, jpk 950 DO ji = nistr, niend, nn_factx 951 DO jj = njstr, njend, nn_facty 952 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 953 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 954 ijje = mje_crs(ij) 955 ijie = mie_crs(ii) 956 957 zflcrs = MIN( p_fld(ji ,ijje,jk) * ( 1. + ( 1. - p_mask(ji ,ijje,jk) ) * zeps ), & 958 & p_fld(ji+1,ijje,jk) * ( 1. + ( 1. - p_mask(ji+1,ijje,jk) ) * zeps ), & 959 & p_fld(ji+2,ijje,jk) * ( 1. + ( 1. - p_mask(ji+2,ijje,jk) ) * zeps ) ) 960 ! 961 p_fld_crs(ii,ij,jk) = zflcrs * p_mask_crs(ii,ij,jk) 962 ! 963 ENDDO 964 ENDDO 965 ENDDO 966 967 968 CASE( 'U' ) 969 970 DO jk = 1, jpk 971 DO ji = nistr, niend, nn_factx 972 DO jj = njstr, njend, nn_facty 973 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 974 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 975 ijje = mje_crs(ij) 976 ijie = mie_crs(ii) 977 978 zflcrs = MIN( p_fld(ijie,jj ,jk) * ( 1. + ( 1. - p_mask(ijie,jj ,jk) ) * zeps ), & 979 & p_fld(ijie,jj+1,jk) * ( 1. + ( 1. - p_mask(ijie,jj+1,jk) ) * zeps ), & 980 & p_fld(ijie,jj+2,jk) * ( 1. + ( 1. - p_mask(ijie,jj+2,jk) ) * zeps ) ) 981 ! 982 p_fld_crs(ii,ij,jk) = zflcrs * p_mask_crs(ii,ij,jk) 983 ! 984 ENDDO 985 ENDDO 986 ENDDO 987 END SELECT 988 ! 989 END SELECT 990 ! 991 CALL crs_lbc_lnk( p_fld_crs, cd_type, 1.0 ) 992 ! 993 END SUBROUTINE crs_dom_ope_3d 994 995 SUBROUTINE crs_dom_ope_2d( p_fld, cd_op, cd_type, p_mask, p_fld_crs, p_e12, p_e3, p_surf_crs, p_mask_crs ) 638 996 !!---------------------------------------------------------------- 639 !! *** SUBROUTINE crsfun_TW *** 640 !! ** Purpose : Five applications. 641 !! 1) Maximum surface quantity 642 !! - Vertical scale factors (fse3t or fse3w) 643 !! max thickness of the parent grid for coarse grid scale factors. 644 !! - or diffusion test 645 !! 2) Area-weighted mean quantity: w, or other 3D or 2D quantity 646 !! 3) Volume-weighted mean quantity: tracer 647 !! 4) Minimum surface quantity (diffusion test) 648 !! 5) Area- or Volume- weighted sum. 649 !! ** Method : 1) - cd_op = 'MAX'. Determines the max vertical thickness of grid boxes 650 !! including partial steps for at the bottom 651 !! for the coarsened grid, where within the subset of 652 !! the parent grid cells the maximum thickness is taken. 653 !! Valid arguments: p_e1e2t, cd_type, cd_op, p_cmask, p_pfield3d_1 654 !! Where, normally p_pfield3d_1 is e3t. 655 !! - cd_op = 'MAX'. May also be used for say, determining the maximum value of Kz, 656 !! thus p_pfield3d_1 is set to the 3D field, Kz. 657 !! Valid arguments: p_e1e2t, cd_type, cd_op, p_cmask, p_pfield3d_1 658 !! 2) - cd_op = 'ARE'. Calculate the area-weighted average (surface e1t*e2t) 659 !! of vertical velocity, w. 660 !! Valid arguments: p_e1e2t, cd_type, cd_op, p_cmask, p_pfield3d_1 661 !! - cd_op = 'ARE'. Calculate area-weighted average of a 2D quantity (e.g. emp) 662 !! Valid arguments: p_e1e2t, cd_type, cd_op, p_cmask, p_pfield2d 663 !! 3) - cd_op = 'VOL'. Calculate the ocean volume (e1e2t*[fse3t|fse3w]) 664 !! Valid arguments: p_e1e2t, cd_type, cd_op, p_cmask, p_pfield3d_1 665 !! - cd_op = 'VOL'. Calculate volume-weighted average (volume e1t*e2t*fse3t) of a quantity. 666 !! Valid arguments: p_e1e2t, cd_type, cd_op, p_cmask, p_pfield3d_1, p_pfield3d_2 667 !! 4) - cd_op = 'MIN'. Calculate the minimum value on surface e1t*e2t for 3D variables 668 !! Valid arguments: p_e1e2t, cd_type, cd_op, p_cmask, p_pfield3d_1 669 !! 5) - cd_op = 'SUM'. Calculate a dimesionally-weighted sum. This could be area-weighted 670 !! or volume-weighted sum. 671 !! ** Inputs : p_e1e2t = parent grid top face surface area, e1t*e2t 672 !! cd_type = grid type T, W (U, V, F) 673 !! cd_op = MAX, ARE, VOL, MIN, SUM 674 !! p_cmask = coarse grid mask 675 !! p_ptmask = parent grid tmask 676 !! psgn = (Optional) sign for lbc_lnk 677 !! p_pfield2d = (Optional) 2D field on parent grid 678 !! p_pfield3d_1 = (Optional) parent grid fse3t or fse3w 679 !! p_pfield3d_2 = (Optional) 3D field on parent grid 680 !! ** Outputs : p_cfield2d = (Optional) 2D field on coarse grid 681 !! p_cfield3d = (Optional) 3D field on coarse grid 997 !! *** SUBROUTINE crsfun_UV *** 998 !! ** Purpose : Average, area-weighted, of U or V on the east and north faces 682 999 !! 683 !! 684 !! History. 30 May. Editing. To decide later: Keep all functionality or separate out the mean function. 685 !! 7 Jun TODO. Need to fix up the parent grid mask to optional like crsfun_UV... 1000 !! ** Method : The U and V velocities (3D) are determined as the area-weighted averages 1001 !! on the east and north faces, respectively, 1002 !! of the parent grid subset comprising the coarse grid box. 1003 !! In the case of the V and F grid, the last jrow minus 1 is spurious. 1004 !! ** Inputs : p_e1_e2 = parent grid e1 or e2 (t,u,v,f) 1005 !! cd_type = grid type (T,U,V,F) for scale factors; for velocities (U or V) 1006 !! psgn = sign change over north fold (See lbclnk.F90) 1007 !! p_pmask = parent grid mask (T,U,V,F) for scale factors; 1008 !! for velocities (U or V) 1009 !! p_fse3 = parent grid vertical level thickness (fse3u or fse3v) 1010 !! p_pfield = U or V on the parent grid 1011 !! p_surf_crs = (Optional) Coarse grid weight for averaging 1012 !! ** Outputs : p_cfield3d = 3D field on coarse grid 1013 !! 1014 !! History. 29 May. completed draft. 1015 !! 4 Jun. Revision for WGT 1016 !! 5 Jun. Streamline for area-weighted average only ; separate scale factor and weights. 686 1017 !!---------------------------------------------------------------- 687 1018 !! 688 1019 !! Arguments 689 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: p_e1e2t ! Parent grid T surface (e1*e2) 690 CHARACTER(len=1), INTENT(in) :: cd_type ! grid type T, W ( U, V, F) 691 CHARACTER(len=3), INTENT(in) :: cd_op ! operation max, min, area-average, volume-average 692 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(in) :: p_cmask ! Coarse grid T mask 693 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: p_ptmask ! Parent grid T mask 694 REAL(wp), OPTIONAL, INTENT(in) :: psgn ! sign for lbc_lnk 695 REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) :: p_pfield2d ! 2D quantity on parent grid, e.g. ssh 696 REAL(wp), DIMENSION(jpi,jpj,jpk), OPTIONAL, INTENT(in) :: p_pfield3d_1 ! Normally parent grid vertical level thickness 697 REAL(wp), DIMENSION(jpi,jpj,jpk), OPTIONAL, INTENT(in) :: p_pfield3d_2 ! 3D tracer or W on parent grid 698 699 REAL(wp), DIMENSION(jpi_crs,jpj_crs), OPTIONAL, INTENT(out):: p_cfield2d ! Coarse grid box east or north face quantity 700 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), OPTIONAL, INTENT(out):: p_cfield3d ! Coarse grid box east or north face quantity 1020 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: p_fld ! T, U, V or W on parent grid 1021 CHARACTER(len=3), INTENT(in) :: cd_op ! Operation SUM, MAX or MIN 1022 CHARACTER(len=1), INTENT(in) :: cd_type ! grid type U,V 1023 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: p_mask ! Parent grid T,U,V mask 1024 REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: p_e12 ! Parent grid T,U,V scale factors (e1 or e2) 1025 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL :: p_e3 ! Parent grid vertical level thickness (fse3u, fse3v) 1026 REAL(wp), DIMENSION(jpi_crs,jpj_crs) , INTENT(in), OPTIONAL :: p_surf_crs ! Coarse grid area-weighting denominator 1027 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(in), OPTIONAL :: p_mask_crs ! Coarse grid T,U,V mask 1028 1029 REAL(wp), DIMENSION(jpi_crs,jpj_crs) , INTENT(out) :: p_fld_crs ! Coarse grid box 3D quantity 701 1030 702 1031 !! Local variables 703 INTEGER :: ji, jj, jk! dummy loop indices704 INTEGER :: ijie,ijis,ijje,ijjs,ijpk,jii,jjj705 INTEGER, DIMENSION(3) :: idims706 REAL(wp) , POINTER, DIMENSION(:,:) :: ze1e2, zpfield2d, zcfield2d707 REAL(wp), POINTER, DIMENSION(:,:,:) :: ze3, zpfield3d, zcfield3d, zcmask, zpmask708 REAL(wp) :: zdAm, zsgn 1032 INTEGER :: ji, jj, jk ! dummy loop indices 1033 INTEGER :: ijie, ijje, ii, ij 1034 REAL(wp) :: zflcrs, zsfcrs 1035 REAL(wp) :: zeps = 1.e20 1036 REAL(wp), DIMENSION(:,:), POINTER :: zsurf 1037 709 1038 !!---------------------------------------------------------------- 710 ! Initialize 711 712 CALL wrk_alloc(jpi , jpj , ze1e2, zpfield2d ) 713 CALL wrk_alloc(jpi , jpj , jpk, ze3 , zpfield3d, zpmask ) 714 CALL wrk_alloc(jpi_crs, jpj_crs, zcfield2d ) 715 CALL wrk_alloc(jpi_crs, jpj_crs, jpk, zcfield3d, zcmask ) 716 717 718 ! Arrays, scalars initialization 719 zpfield2d(:,:) = 0.0 720 zpfield3d(:,:,:) = 0.0 721 zcfield2d(:,:) = 0.0 722 zcfield3d(:,:,:) = 0.0 723 zpmask(:,:,:) = 1.0 724 idims(:) = 1 725 726 zcmask(:,:,:) = p_cmask(:,:,:) 727 zpmask(:,:,:) = p_ptmask(:,:,:) 728 729 ijpk = jpk 730 731 732 ! Control of optional arguments 733 ! 734 IF ( PRESENT(psgn) ) THEN 735 zsgn = psgn 736 ELSE 737 zsgn = 1.0 738 ENDIF 739 ! 740 IF ( TRIM(cd_op) == 'MAX' ) THEN 741 ! Find the maximum thickness in each parent grid subset 742 IF ( PRESENT(p_pfield3d_1) ) THEN 743 zpfield3d(:,:,:) = p_pfield3d_1(:,:,:) 744 ze3(:,:,:) = 0.0 745 ze1e2(:,:) = 0.0 746 ELSE 747 WRITE(numout,*) 'crsfun_TW. MAX only 3D arrays supported' 748 ENDIF 749 ELSEIF ( TRIM(cd_op) == 'VOL' ) THEN 750 IF ( PRESENT(p_pfield3d_1) ) THEN 751 ze3(:,:,:) = p_pfield3d_1(:,:,:) 752 IF ( PRESENT(p_pfield3d_2) ) THEN 753 ! ! Prep to calculate a volume-averaged mean 754 zpfield3d(:,:,:) = p_pfield3d_2(:,:,:) 755 ze1e2(:,:) = p_e1e2t(:,:) 756 ELSE 757 WRITE(numout,*) 'crsfun_TW. WARNING. Supply both e3t and the field for volume-averaged field' 758 ENDIF 759 ELSE 760 WRITE(numout,*) 'crsfun_TW. VOL only 3D arrays supported' 761 ENDIF 762 ELSEIF ( TRIM(cd_op) == 'ARE' ) THEN 763 ze1e2(:,:) = p_e1e2t(:,:) 764 ze3(:,:,:) = 1.0 765 IF ( PRESENT(p_pfield3d_2) ) THEN 766 ! Prep to do the area-weighted average of (3D) W 767 zpfield3d(:,:,:) = p_pfield3d_2(:,:,:) 768 ELSEIF ( PRESENT(p_pfield2d) ) THEN 769 ! Prep to do the area-weighted average of some 2D quantity 770 zpfield2d(:,:) = p_pfield2d(:,:) 771 ijpk=1 772 ENDIF 773 ELSEIF ( TRIM(cd_op) == 'MIN' ) THEN 774 IF ( PRESENT(p_pfield3d_1) ) THEN 775 ! Prep to do get the minimum diffusion on the top face 776 zpfield3d(:,:,:) = p_pfield3d_1(:,:,:) 777 ze3(:,:,:) = 0.0 778 ze1e2(:,:) = 0.0 779 ELSE 780 WRITE(numout,*) 'crsfun_TW. MIN Only 3D arrays supported' 781 ENDIF 782 ELSEIF ( TRIM(cd_op) == 'SUM' ) THEN 783 ze1e2(:,:) = p_e1e2t(:,:) 784 zpmask(:,:,:) = p_ptmask(:,:,:) 785 ze3(:,:,:) = 1.0 786 IF ( PRESENT(p_pfield3d_1) ) THEN 787 IF ( PRESENT(p_pfield3d_2) ) THEN 788 ! ! Prep to calculate a volume-weighted sum 789 zpfield3d(:,:,:) = p_pfield3d_2(:,:,:) 790 ze3(:,:,:) = p_pfield3d_1(:,:,:) 791 ELSE 792 ! Prep to do the area-weighted sum of (3D) W 793 zpfield3d(:,:,:) = p_pfield3d_1(:,:,:) 794 ENDIF 795 ELSEIF ( PRESENT(p_pfield2d) ) THEN 796 ! Prep to do the area-weighted sum of some 2D quantity 797 zpfield2d(:,:) = p_pfield2d(:,:) 798 ijpk=1 799 ENDIF 800 ELSE 801 WRITE(numout,*) 'crsfun_TW. valid cd_op are MAX, MIN, ARE, VOL, SUM' 802 ENDIF 803 804 ! Determine output 805 DO jk = 1, ijpk 806 807 IF ( ijpk == jpk ) zpfield2d(:,:) = zpfield3d(:,:,jk) 808 zcfield2d(:,:) = 0.0 809 810 DO ji = 2, nlei_crs 811 ijie = mie_crs(ji) 812 ijis = mis_crs(ji) 813 814 DO jj = njstart, njend 815 ijje = mje_crs(jj) 816 ijjs = mjs_crs(jj) 817 818 ! First determine weighted sums 819 IF ( TRIM(cd_op) == 'SUM' .OR. TRIM(cd_op) == 'ARE' .OR. TRIM(cd_op) == 'VOL' ) THEN 820 ! Area- or volume- weighted sum 821 ! Accumulate to sum in parent grid subset 822 DO jii = ijis, ijie 823 DO jjj = ijjs, ijje 824 zcfield2d(ji,jj) = zcfield2d(ji,jj) & 825 & + ( zpfield2d(jii,jjj) & 826 & * ze1e2(jii,jjj) & 827 & * ze3(jii,jjj,jk) & 828 & * zpmask(jii,jjj,jk) ) 829 830 ENDDO 1039 1040 1041 SELECT CASE ( cd_op ) 1042 1043 CASE ( 'VOL' ) 1044 1045 CALL wrk_alloc( jpi, jpj, zsurf ) 1046 zsurf(:,:) = p_e12(:,:) * p_e3(:,:,1) * p_mask(:,:,1) 1047 1048 DO ji = nistr, niend, nn_factx 1049 DO jj = njstr, njend, nn_facty 1050 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1051 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1052 ijje = mje_crs(ij) 1053 ijie = mie_crs(ii) 1054 1055 zflcrs = p_fld(ji ,jj ) * zsurf(ji ,jj ) & 1056 & + p_fld(ji+1,jj ) * zsurf(ji+1,jj ) & 1057 & + p_fld(ji+2,jj ) * zsurf(ji+2,jj ) & 1058 & + p_fld(ji ,jj+1) * zsurf(ji ,jj+1) & 1059 & + p_fld(ji+1,jj+1) * zsurf(ji+1,jj+1) & 1060 & + p_fld(ji+2,jj+1) * zsurf(ji+2,jj+1) & 1061 & + p_fld(ji ,jj+2) * zsurf(ji ,jj+2) & 1062 & + p_fld(ji+1,jj+2) * zsurf(ji+1,jj+2) & 1063 & + p_fld(ji+2,jj+2) * zsurf(ji+2,jj+2) 1064 1065 zsfcrs = zsurf(ji,jj ) + zsurf(ji+1,jj ) + zsurf(ji+2,jj ) & 1066 & + zsurf(ji,jj+1) + zsurf(ji+1,jj+1) + zsurf(ji+2,jj+1) & 1067 & + zsurf(ji,jj+2) + zsurf(ji+1,jj+2) + zsurf(ji+2,jj+2) 1068 ! 1069 p_fld_crs(ii,ij) = zflcrs 1070 IF( zsfcrs /= 0.0 ) p_fld_crs(ii,ij) = zflcrs / zsfcrs 1071 1072 ENDDO 1073 ENDDO 1074 1075 CALL wrk_dealloc( jpi, jpj, zsurf ) 1076 1077 CASE ( 'SUM' ) 1078 1079 CALL wrk_alloc( jpi, jpj, zsurf ) 1080 zsurf(:,:) = p_e12(:,:) * p_e3(:,:,1) * p_mask(:,:,1) 1081 1082 SELECT CASE ( cd_type ) 1083 1084 CASE( 'T', 'W' ) 1085 1086 DO ji = nistr, niend, nn_factx 1087 DO jj = njstr, njend, nn_facty 1088 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1089 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1090 ijje = mje_crs(ij) 1091 ijie = mie_crs(ii) 1092 1093 zflcrs = p_fld(ji ,jj ) * zsurf(ji ,jj ) & 1094 & + p_fld(ji+1,jj ) * zsurf(ji+1,jj ) & 1095 & + p_fld(ji+2,jj ) * zsurf(ji+2,jj ) & 1096 & + p_fld(ji ,jj+1) * zsurf(ji ,jj+1) & 1097 & + p_fld(ji+1,jj+1) * zsurf(ji+1,jj+1) & 1098 & + p_fld(ji+2,jj+1) * zsurf(ji+2,jj+1) & 1099 & + p_fld(ji ,jj+2) * zsurf(ji ,jj+2) & 1100 & + p_fld(ji+1,jj+2) * zsurf(ji+1,jj+2) & 1101 & + p_fld(ji+2,jj+2) * zsurf(ji+2,jj+2) 1102 ! 1103 p_fld_crs(ii,ij) = zflcrs 1104 ! 1105 ENDDO 1106 ENDDO 1107 1108 CASE( 'V' ) 1109 1110 DO jk = 1, jpk 1111 DO ji = nistr, niend, nn_factx 1112 DO jj = njstr, njend, nn_facty 1113 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1114 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1115 ijje = mje_crs(ij) 1116 ijie = mie_crs(ii) 1117 ! 1118 zflcrs = p_fld(ji ,ijje) * zsurf(ji ,ijje) & 1119 & + p_fld(ji+1,ijje) * zsurf(ji+1,ijje) & 1120 & + p_fld(ji+2,ijje) * zsurf(ji+2,ijje) 1121 ! 1122 p_fld_crs(ii,ij) = zflcrs 1123 ! 1124 ENDDO 831 1125 ENDDO 832 833 ENDIF 834 835 ! Calculate weighted average if desired 836 IF ( TRIM(cd_op) == 'ARE' .OR. TRIM(cd_op) == 'VOL' ) THEN 837 838 ! Area- or volume- weighted mean 839 ! Sum first parent grid subset 840 zdAm = 0.0 841 DO jii = ijis, ijie 842 DO jjj = ijjs, ijje 843 zdAm = zdAm + ( ze1e2(jii,jjj) & 844 & * ze3(jii,jjj,jk) & 845 & * zpmask(jii,jjj,jk) ) 846 ENDDO 1126 ENDDO 1127 1128 1129 CASE( 'U' ) 1130 1131 DO jk = 1, jpk 1132 DO ji = nistr, niend, nn_factx 1133 DO jj = njstr, njend, nn_facty 1134 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1135 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1136 ijje = mje_crs(ij) 1137 ijie = mie_crs(ii) 1138 ! 1139 zflcrs = p_fld(ijie,jj ) * zsurf(ijie,jj ) & 1140 & + p_fld(ijie,jj+1) * zsurf(ijie,jj+1) & 1141 & + p_fld(ijie,jj+2) * zsurf(ijie,jj+2) 1142 ! 1143 p_fld_crs(ii,ij) = zflcrs 1144 ! 1145 ENDDO 847 1146 ENDDO 848 849 IF ( zdAm /= 0 ) zcfield2d(ji,jj) = zcfield2d(ji,jj) / zdAm 850 851 ENDIF 852 853 854 IF ( TRIM(cd_op) == 'MAX' ) THEN 855 ! Find max in parent grid subset 856 DO jii = ijis, ijie 857 DO jjj = ijjs, ijje 858 zcfield2d(ji,jj) = MAX( zcfield2d(ji,jj), zpfield3d(jii,jjj,jk)*zpmask(jii,jjj,jk) ) 859 ENDDO 860 ENDDO 861 ENDIF 862 863 IF ( TRIM(cd_op) == 'MIN' ) THEN 864 ! Find min in parent grid subset 865 DO jii = ijis, ijie 866 DO jjj = ijjs, ijje 867 IF ( zpmask(jii,jjj,jk) == 1 ) THEN 868 zcfield2d(ji,jj) = MIN( zcfield2d(ji,jj), zpfield3d(jii,jjj,jk) ) 869 ENDIF 870 ENDDO 871 ENDDO 872 ENDIF 873 874 ENDDO 875 ENDDO 876 877 IF ( ijpk == 1 ) THEN 878 IF ( PRESENT(p_cfield2d) ) p_cfield2d(:,:) = zcfield2d(:,:) * zcmask(:,:,jk) 879 ELSE 880 IF ( PRESENT(p_cfield3d) ) p_cfield3d(:,:,jk) = zcfield2d(:,:) * zcmask(:,:,jk) 881 ENDIF 882 883 ENDDO 884 885 886 ! Retroactively add back the boundary halo cells. 887 888 IF ( ijpk == 1 ) THEN 889 IF ( PRESENT(p_cfield2d) ) CALL crs_lbc_lnk( p_cfield2d(:,:),cd_type,zsgn ) 890 ELSE 891 IF ( PRESENT(p_cfield3d) ) THEN 892 CALL crs_lbc_lnk( p_cfield3d(:,:,:),cd_type,zsgn ) 893 ENDIF 894 ENDIF 895 896 CALL wrk_dealloc(jpi , jpj , ze1e2, zpfield2d ) 897 CALL wrk_dealloc(jpi , jpj , jpk, ze3 , zpfield3d, zpmask ) 898 CALL wrk_dealloc(jpi_crs, jpj_crs, zcfield2d ) 899 CALL wrk_dealloc(jpi_crs, jpj_crs, jpk, zcfield3d, zcmask ) 1147 ENDDO 1148 1149 END SELECT 1150 1151 IF( PRESENT( p_surf_crs ) ) THEN 1152 WHERE ( p_surf_crs /= 0.0 ) p_fld_crs(:,:) = p_fld_crs(:,:) / p_surf_crs(:,:) 1153 ENDIF 1154 1155 CALL wrk_dealloc( jpi, jpj, zsurf ) 1156 1157 CASE ( 'MAX' ) 1158 1159 SELECT CASE ( cd_type ) 1160 1161 CASE( 'T', 'W' ) 1162 1163 DO ji = nistr, niend, nn_factx 1164 DO jj = njstr, njend, nn_facty 1165 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1166 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1167 ijje = mje_crs(ij) 1168 ijie = mie_crs(ii) 1169 1170 zflcrs = MAX( p_fld(ji ,jj ) * p_mask(ji ,jj ,1), & 1171 & p_fld(ji+1,jj ) * p_mask(ji+1,jj ,1), & 1172 & p_fld(ji+2,jj ) * p_mask(ji+2,jj ,1), & 1173 & p_fld(ji ,jj+1) * p_mask(ji ,jj+1,1), & 1174 & p_fld(ji+1,jj+1) * p_mask(ji+1,jj+1,1), & 1175 & p_fld(ji+2,jj+1) * p_mask(ji+2,jj+1,1), & 1176 & p_fld(ji ,jj+2) * p_mask(ji ,jj+2,1), & 1177 & p_fld(ji+1,jj+2) * p_mask(ji+1,jj+2,1), & 1178 & p_fld(ji+2,jj+2) * p_mask(ji+2,jj+2,1) ) 1179 ! 1180 p_fld_crs(ii,ij) = zflcrs 1181 ! 1182 ENDDO 1183 ENDDO 1184 1185 CASE( 'V' ) 1186 1187 DO ji = nistr, niend, nn_factx 1188 DO jj = njstr, njend, nn_facty 1189 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1190 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1191 ijje = mje_crs(ij) 1192 ijie = mie_crs(ii) 1193 ! 1194 zflcrs = MAX( p_fld(ji ,ijje) * p_mask(ji ,ijje,1), & 1195 & p_fld(ji+1,ijje) * p_mask(ji+1,ijje,1), & 1196 & p_fld(ji+2,ijje) * p_mask(ji+2,ijje,1) ) 1197 ! 1198 p_fld_crs(ii,ij) = zflcrs 1199 ! 1200 ENDDO 1201 ENDDO 1202 1203 CASE( 'U' ) 1204 1205 DO ji = nistr, niend, nn_factx 1206 DO jj = njstr, njend, nn_facty 1207 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1208 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1209 ijje = mje_crs(ij) 1210 ijie = mie_crs(ii) 1211 ! 1212 zflcrs = MAX( p_fld(ijie,jj ) * p_mask(ijie,jj ,1), & 1213 & p_fld(ijie,jj+1) * p_mask(ijie,jj+1,1), & 1214 & p_fld(ijie,jj+2) * p_mask(ijie,jj+2,1) ) 1215 ! 1216 p_fld_crs(ii,ij) = zflcrs 1217 ! 1218 ENDDO 1219 ENDDO 1220 1221 END SELECT 1222 1223 CASE ( 'MIN' ) 1224 ! Search the min of masked grid cells 1225 SELECT CASE ( cd_type ) 1226 1227 CASE( 'T', 'W' ) 1228 1229 DO ji = nistr, niend, nn_factx 1230 DO jj = njstr, njend, nn_facty 1231 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1232 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1233 ijje = mje_crs(ij) 1234 ijie = mie_crs(ii) 1235 1236 zflcrs = MIN( p_fld(ji ,jj ) * ( 1. + ( 1. - p_mask(ji ,jj ,1) ) * zeps ), & 1237 & p_fld(ji+1,jj ) * ( 1. + ( 1. - p_mask(ji+1,jj ,1) ) * zeps ), & 1238 & p_fld(ji+2,jj ) * ( 1. + ( 1. - p_mask(ji+2,jj ,1) ) * zeps ), & 1239 & p_fld(ji ,jj+1) * ( 1. + ( 1. - p_mask(ji ,jj ,1) ) * zeps ), & 1240 & p_fld(ji+1,jj+1) * ( 1. + ( 1. - p_mask(ji+1,jj+1,1) ) * zeps ), & 1241 & p_fld(ji+2,jj+1) * ( 1. + ( 1. - p_mask(ji+2,jj+2,1) ) * zeps ), & 1242 & p_fld(ji ,jj+2) * ( 1. + ( 1. - p_mask(ji ,jj ,1) ) * zeps ), & 1243 & p_fld(ji+1,jj+2) * ( 1. + ( 1. - p_mask(ji+1,jj+1,1) ) * zeps ), & 1244 & p_fld(ji+2,jj+2) * ( 1. + ( 1. - p_mask(ji+2,jj+2,1) ) * zeps ) ) 1245 ! 1246 p_fld_crs(ii,ij) = zflcrs * p_mask_crs(ii,ij,1) 1247 ! 1248 ENDDO 1249 ENDDO 900 1250 901 902 END SUBROUTINE crsfun_TW 1251 CASE( 'V' ) 1252 1253 DO ji = nistr, niend, nn_factx 1254 DO jj = njstr, njend, nn_facty 1255 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1256 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1257 ijje = mje_crs(ij) 1258 ijie = mie_crs(ii) 1259 1260 zflcrs = MIN( p_fld(ji ,ijje) * ( 1. + ( 1. - p_mask(ji ,ijje,1) ) * zeps ), & 1261 & p_fld(ji+1,ijje) * ( 1. + ( 1. - p_mask(ji+1,ijje,1) ) * zeps ), & 1262 & p_fld(ji+2,ijje) * ( 1. + ( 1. - p_mask(ji+2,ijje,1) ) * zeps ) ) 1263 ! 1264 p_fld_crs(ii,ij) = zflcrs * p_mask_crs(ii,ij,1) 1265 ! 1266 ENDDO 1267 ENDDO 1268 1269 CASE( 'U' ) 1270 1271 DO ji = nistr, niend, nn_factx 1272 DO jj = njstr, njend, nn_facty 1273 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1274 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1275 ijje = mje_crs(ij) 1276 ijie = mie_crs(ii) 1277 1278 zflcrs = MIN( p_fld(ijie,jj ) * ( 1. + ( 1. - p_mask(ijie,jj ,1) ) * zeps ), & 1279 & p_fld(ijie,jj+1) * ( 1. + ( 1. - p_mask(ijie,jj+1,1) ) * zeps ), & 1280 & p_fld(ijie,jj+2) * ( 1. + ( 1. - p_mask(ijie,jj+2,1) ) * zeps ) ) 1281 ! 1282 p_fld_crs(ii,ij) = zflcrs * p_mask_crs(ii,ij,1) 1283 ! 1284 ENDDO 1285 ENDDO 1286 END SELECT 1287 ! 1288 END SELECT 1289 ! 1290 CALL crs_lbc_lnk( p_fld_crs, cd_type, 1.0 ) 1291 ! 1292 END SUBROUTINE crs_dom_ope_2d 903 1293 904 1294 … … 914 1304 !! Local variables 915 1305 INTEGER :: ji, jj, jk ! dummy loop indices 916 INTEGER :: ijie,ijis,ijje,ijjs,jii,jjj 1306 INTEGER :: ijie, ijje, ii, ij 1307 REAL(wp) :: ze3crs 917 1308 !!---------------------------------------------------------------- 918 1309 ! Initialize … … 923 1314 924 1315 DO jk = 1 , jpk 925 926 DO ji = 2, nlei_crs ! ji = 1 et jpi_crs definit par cyclique est-ouest et pivot T 927 ijie = mie_crs(ji) 928 ijis = mis_crs(ji) 929 930 DO jj = njstart, njend ! jj = jpj_crs definit par pivot T 931 ijje = mje_crs(jj) 932 ijjs = mjs_crs(jj) 933 934 DO jii = ijis, ijie 935 DO jjj = ijjs, ijje 936 p_e3_crs(ji,jj,jk) = max( p_e3_crs(ji,jj,jk), p_e3(jii,jjj,jk) * p_mask(jii,jjj,jk) ) 937 ENDDO 938 ENDDO 939 ENDDO 1316 DO ji = nistr, niend, nn_factx 1317 DO jj = njstr, njend, nn_facty 1318 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 ! cordinate in parent grid 1319 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1320 ijje = mje_crs(ij) 1321 ijie = mie_crs(ii) 1322 ! 1323 ze3crs = MAX( p_e3(ji ,jj ,jk) * p_mask(ji ,jj ,jk), & 1324 & p_e3(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk), & 1325 & p_e3(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk), & 1326 & p_e3(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk), & 1327 & p_e3(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk), & 1328 & p_e3(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk), & 1329 & p_e3(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk), & 1330 & p_e3(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk), & 1331 & p_e3(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk) ) 1332 1333 p_e3_crs(ii,ij,jk) = ze3crs 1334 ENDDO 940 1335 ENDDO 941 1336 ENDDO … … 944 1339 945 1340 DO jk = 2 , jpk 946 947 ! ji = 1 et jpi_crs definit par cyclique est-ouest et pivot T 948 DO ji = 2, nlei_crs 949 ijie = mie_crs(ji) 950 ijis = mis_crs(ji) 951 952 DO jj = njstart, njend ! jj = jpj_crs definit par pivot T 953 ijje = mje_crs(jj) 954 ijjs = mjs_crs(jj) 955 956 DO jii = ijis, ijie 957 DO jjj = ijjs, ijje 958 p_e3_crs(ji,jj,jk) = max( p_e3_crs(ji,jj,jk), p_e3(jii,jjj,jk) * p_mask(jii,jjj,jk-1) ) 959 ENDDO 960 ENDDO 961 ENDDO 962 ENDDO 963 ENDDO 964 965 jk = 1 ! cas particulier car zpmask(jii,jjj,0) n'existe pas 966 967 DO ji = 2, nlei_crs 968 ijie = mie_crs(ji) 969 ijis = mis_crs(ji) 970 971 DO jj = njstart, njend 972 ijje = mje_crs(jj) 973 ijjs = mjs_crs(jj) 974 975 DO jii = ijis, ijie 976 DO jjj = ijjs, ijje 977 p_e3_crs(ji,jj,jk) = max( p_e3_crs(ji,jj,jk), p_e3(jii,jjj,jk) * p_mask(jii,jjj,jk) ) 978 ENDDO 1341 DO ji = nistr, niend, nn_factx 1342 DO jj = njstr, njend, nn_facty 1343 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 ! cordinate in parent grid 1344 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1345 ijje = mje_crs(ij) 1346 ijie = mie_crs(ii) 1347 ! 1348 ze3crs = MAX( p_e3(ji ,jj ,jk) * p_mask(ji ,jj ,jk-1), & 1349 & p_e3(ji+1,jj ,jk) * p_mask(ji+1,jj ,jk-1), & 1350 & p_e3(ji+2,jj ,jk) * p_mask(ji+2,jj ,jk-1), & 1351 & p_e3(ji ,jj+1,jk) * p_mask(ji ,jj+1,jk-1), & 1352 & p_e3(ji+1,jj+1,jk) * p_mask(ji+1,jj+1,jk-1), & 1353 & p_e3(ji+2,jj+1,jk) * p_mask(ji+2,jj+1,jk-1), & 1354 & p_e3(ji ,jj+2,jk) * p_mask(ji ,jj+2,jk-1), & 1355 & p_e3(ji+1,jj+2,jk) * p_mask(ji+1,jj+2,jk-1), & 1356 & p_e3(ji+2,jj+2,jk) * p_mask(ji+2,jj+2,jk-1) ) 1357 1358 p_e3_crs(ii,ij,jk) = ze3crs 979 1359 ENDDO 980 1360 ENDDO 981 ENDDO 1361 ENDDO 1362 1363 DO ji = nistr, niend, nn_factx 1364 DO jj = njstr, njend, nn_facty 1365 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 ! cordinate in parent grid 1366 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1367 ijje = mje_crs(ij) 1368 ijie = mie_crs(ii) 1369 ! 1370 ze3crs = MAX( p_e3(ji ,jj ,1) * p_mask(ji ,jj ,1), & 1371 & p_e3(ji+1,jj ,1) * p_mask(ji+1,jj ,1), & 1372 & p_e3(ji+2,jj ,1) * p_mask(ji+2,jj ,1), & 1373 & p_e3(ji ,jj+1,1) * p_mask(ji ,jj+1,1), & 1374 & p_e3(ji+1,jj+1,1) * p_mask(ji+1,jj+1,1), & 1375 & p_e3(ji+2,jj+1,1) * p_mask(ji+2,jj+1,1), & 1376 & p_e3(ji ,jj+2,1) * p_mask(ji ,jj+2,1), & 1377 & p_e3(ji+1,jj+2,1) * p_mask(ji+1,jj+2,1), & 1378 & p_e3(ji+2,jj+2,1) * p_mask(ji+2,jj+2,1) ) 1379 1380 p_e3_crs(ii,ij,1) = ze3crs 1381 ENDDO 1382 ENDDO 982 1383 983 1384 END SELECT 984 985 CALL crs_lbc_lnk( p_e3_crs(:,:,:),cd_type, 1.0, pval=1.0 ) 986 987 WRITE(numout,*) 'crs_e3_max : end of subroutine ' 988 989 1385 ! 1386 CALL crs_lbc_lnk( p_e3_crs, cd_type, 1.0, pval=1.0 ) 1387 ! 990 1388 END SUBROUTINE crs_dom_e3_max 991 1389 992 993 SUBROUTINE crs_dom_sfc( p_e1, p_e2, p_e3, cd_type, p_mask, p_surf_crs, p_surf_crs_msk ) 1390 SUBROUTINE crs_dom_sfc( p_mask, cd_type, p_surf_crs, p_surf_crs_msk, p_e1, p_e2, p_e3 ) 994 1391 995 1392 !! Arguments 996 1393 CHARACTER(len=1), INTENT(in) :: cd_type ! grid type T, W ( U, V, F) 997 1394 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: p_mask ! Parent grid T mask 998 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in) :: p_e1, p_e2 ! 3D tracer T or W on parent grid999 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: p_e3 ! 3D tracer T or W on parent grid1000 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT( inout):: p_surf_crs ! Coarse grid box east or north face quantity1001 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT( inout):: p_surf_crs_msk ! Coarse grid box east or north face quantity1395 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in), OPTIONAL :: p_e1, p_e2 ! 3D tracer T or W on parent grid 1396 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL :: p_e3 ! 3D tracer T or W on parent grid 1397 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(out):: p_surf_crs ! Coarse grid box east or north face quantity 1398 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(out):: p_surf_crs_msk ! Coarse grid box east or north face quantity 1002 1399 1003 1400 !! Local variables 1004 INTEGER :: ji, jj, jk ! dummy loop indices 1005 INTEGER :: ijie,ijis,ijje,ijjs,ijpk,jii,jjj 1006 REAL(wp) :: zsfc 1401 INTEGER :: ji, jj, jk ! dummy loop indices 1402 INTEGER :: ijie, ijje, ii, ij 1403 REAL(wp), DIMENSION(:,:) , POINTER :: zsurf 1404 REAL(wp), DIMENSION(:,:,:), POINTER :: zsurf3d 1405 REAL(wp) :: zsfcrs, zsfcrs_msk 1007 1406 !!---------------------------------------------------------------- 1008 1407 ! Initialize 1009 1408 1010 p_surf_crs (:,:,:) = 0._wp 1011 p_surf_crs_msk(:,:,:) = 0._wp 1409 1012 1410 ! 1013 1411 SELECT CASE ( cd_type ) 1014 1412 1015 1413 CASE ('W') 1016 1017 DO jk = 2 , jpk 1018 DO ji = 2, nlei_crs 1019 ijie = mie_crs(ji) 1020 ijis = mis_crs(ji) 1021 DO jj = njstart, njend 1022 ijje = mje_crs(jj) 1023 ijjs = mjs_crs(jj) 1024 DO jii = ijis, ijie 1025 DO jjj = ijjs, ijje 1026 zsfc = p_e1(jii,jjj) * p_e2(jii,jjj) 1027 p_surf_crs(ji,jj,jk) = p_surf_crs(ji,jj,jk) + zsfc 1028 p_surf_crs_msk(ji,jj,jk) = p_surf_crs_msk(ji,jj,jk) + zsfc * p_mask(jii,jjj,jk-1) 1029 ENDDO 1030 ENDDO 1031 IF( njstart == 1 ) p_surf_crs(ji,jj,jk) = p_surf_crs(ji,jj,jk) * nn_facty 1032 ENDDO 1414 1415 CALL wrk_alloc( jpi, jpj, zsurf ) 1416 zsurf(:,:) = p_e1(:,:) * p_e2(:,:) 1417 1418 DO ji = nistr, niend, nn_factx 1419 DO jj = njstr, njend, nn_facty 1420 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 ! cordinate in parent grid 1421 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1422 ijje = mje_crs(ij) 1423 ijie = mie_crs(ii) 1424 ! 1425 zsfcrs = zsurf(ji,jj ) + zsurf(ji+1,jj ) + zsurf(ji+2,jj ) & 1426 & + zsurf(ji,jj+1) + zsurf(ji+1,jj+1) + zsurf(ji+2,jj+1) & 1427 & + zsurf(ji,jj+2) + zsurf(ji+1,jj+2) + zsurf(ji+2,jj+2) 1428 ! 1429 zsfcrs_msk = zsurf(ji ,jj ) * p_mask(ji ,jj ,1) & 1430 & + zsurf(ji+1,jj ) * p_mask(ji+1,jj ,1) & 1431 & + zsurf(ji+2,jj ) * p_mask(ji+2,jj ,1) & 1432 & + zsurf(ji ,jj+1) * p_mask(ji ,jj+1,1) & 1433 & + zsurf(ji+1,jj+1) * p_mask(ji+1,jj+1,1) & 1434 & + zsurf(ji+2,jj+1) * p_mask(ji+2,jj+1,1) & 1435 & + zsurf(ji ,jj+2) * p_mask(ji ,jj+2,1) & 1436 & + zsurf(ji+1,jj+2) * p_mask(ji+1,jj+2,1) & 1437 & + zsurf(ji+2,jj+2) * p_mask(ji+2,jj+2,1) 1438 ! 1439 p_surf_crs (ii,ij,1) = zsfcrs 1440 p_surf_crs_msk(ii,ij,1) = zsfcrs_msk 1441 ! 1033 1442 ENDDO 1034 1443 ENDDO 1444 DO jk = 2, jpk 1445 ! 1446 p_surf_crs(:,:,jk) = p_surf_crs(:,:,1) 1447 ! 1448 DO ji = nistr, niend, nn_factx 1449 DO jj = njstr, njend, nn_facty 1450 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 ! cordinate in parent grid 1451 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1452 ijje = mje_crs(ij) 1453 ijie = mie_crs(ii) 1454 ! 1455 zsfcrs_msk = zsurf(ji ,jj ) * p_mask(ji ,jj ,jk-1) & 1456 & + zsurf(ji+1,jj ) * p_mask(ji+1,jj ,jk-1) & 1457 & + zsurf(ji+2,jj ) * p_mask(ji+2,jj ,jk-1) & 1458 & + zsurf(ji ,jj+1) * p_mask(ji ,jj+1,jk-1) & 1459 & + zsurf(ji+1,jj+1) * p_mask(ji+1,jj+1,jk-1) & 1460 & + zsurf(ji+2,jj+1) * p_mask(ji+2,jj+1,jk-1) & 1461 & + zsurf(ji ,jj+2) * p_mask(ji ,jj+2,jk-1) & 1462 & + zsurf(ji+1,jj+2) * p_mask(ji+1,jj+2,jk-1) & 1463 & + zsurf(ji+2,jj+2) * p_mask(ji+2,jj+2,jk-1) 1464 ! 1465 p_surf_crs_msk(ii,ij,jk) = zsfcrs_msk 1466 ! 1467 ENDDO 1468 ENDDO 1469 ENDDO 1035 1470 1036 ! surface ; ji = 1 et jpi_crs definit par cyclique est-ouest et pivot T 1037 DO ji = 2, nlei_crs 1038 ijie = mie_crs(ji) 1039 ijis = mis_crs(ji) 1040 DO jj = njstart, njend 1041 ijje = mje_crs(jj) 1042 ijjs = mjs_crs(jj) 1043 DO jii = ijis, ijie 1044 DO jjj = ijjs, ijje 1045 zsfc = p_e1(jii,jjj) * p_e2(jii,jjj) 1046 p_surf_crs(ji,jj,1) = p_surf_crs(ji,jj,1) + zsfc 1047 p_surf_crs_msk(ji,jj,1) = p_surf_crs_msk(ji,jj,1) * zsfc * p_mask(jii,jjj,1) 1048 ENDDO 1049 ENDDO 1050 IF( njstart == 1 ) p_surf_crs(ji,jj,1) = p_surf_crs(ji,jj,1) * nn_facty 1051 ENDDO 1052 ENDDO 1471 CALL wrk_dealloc( jpi, jpj, zsurf ) 1472 1473 CASE( 'V' ) 1474 1475 CALL wrk_alloc( jpi, jpj, jpk, zsurf3d ) 1476 DO jk = 1, jpk 1477 zsurf3d(:,:,jk) = p_e1(:,:) * p_e3(:,:,jk) 1478 ENDDO 1479 1480 DO jk = 1, jpk 1481 DO ji = nistr, niend, nn_factx 1482 DO jj = njstr, njend, nn_facty 1483 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1484 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1485 ijje = mje_crs(ij) 1486 ijie = mie_crs(ii) 1487 ! 1488 zsfcrs = zsurf3d(ji,ijje,jk) + zsurf3d(ji+1,ijje,jk) + zsurf3d(ji+2,ijje,jk) 1489 ! 1490 zsfcrs_msk = zsurf3d(ji ,ijje,jk) * p_mask(ji ,ijje,jk) & 1491 & + zsurf3d(ji+1,ijje,jk) * p_mask(ji+1,ijje,jk) & 1492 & + zsurf3d(ji+2,ijje,jk) * p_mask(ji+2,ijje,jk) 1493 ! 1494 p_surf_crs (ii,ij,jk) = zsfcrs 1495 p_surf_crs_msk(ii,ij,jk) = zsfcrs_msk 1496 ! 1497 ENDDO 1498 ENDDO 1499 ENDDO 1500 1501 CALL wrk_dealloc( jpi, jpj, jpk, zsurf3d ) 1053 1502 1054 CASE ('U') 1055 1056 DO jk = 1 , jpk 1057 ! ji = 1 et jpi_crs definit par cyclique est-ouest et pivot T 1058 DO ji = 2, nlei_crs 1059 ijie = mie_crs(ji) 1060 ijis = mis_crs(ji) 1061 DO jj = njstart, njend 1062 ijje = mje_crs(jj) 1063 ijjs = mjs_crs(jj) 1064 DO jii = ijis, ijie 1065 DO jjj = ijjs, ijje 1066 zsfc = p_e3(jii,jjj,jk) * p_e2(jii,jjj) 1067 p_surf_crs(ji,jj,jk) = p_surf_crs(ji,jj,jk) + zsfc 1068 p_surf_crs_msk(ji,jj,jk) = p_surf_crs_msk(ji,jj,jk) + zsfc * p_mask(jii,jjj,jk) 1069 ENDDO 1070 ENDDO 1071 IF( njstart == 1 ) p_surf_crs(ji,jj,jk) = p_surf_crs(ji,jj,jk) * nn_facty 1072 ENDDO 1073 ENDDO 1074 ENDDO 1075 1076 CASE ('V') 1077 1078 DO jk = 1 , ijpk 1079 ! ji = 1 et jpi_crs definit par cyclique est-ouest et pivot T 1080 DO ji = 2, nlei_crs 1081 ijie = mie_crs(ji) 1082 ijis = mis_crs(ji) 1083 DO jj = njstart, njend ! jj = jpj_crs definit par pivot T 1084 ijje = mje_crs(jj) 1085 ijjs = mjs_crs(jj) 1086 DO jii = ijis, ijie 1087 DO jjj = ijjs, ijje 1088 zsfc = p_e3(jii,jjj,jk) * p_e1(jii,jjj) 1089 p_surf_crs(ji,jj,jk) = p_surf_crs(ji,jj,jk) + zsfc 1090 p_surf_crs_msk(ji,jj,jk) = p_surf_crs_msk(ji,jj,jk) + zsfc * p_mask(jii,jjj,jk) 1091 ENDDO 1092 ENDDO 1093 ENDDO 1094 ENDDO 1095 ENDDO 1503 CASE( 'U' ) 1504 1505 CALL wrk_alloc( jpi, jpj, jpk, zsurf3d ) 1506 DO jk = 1, jpk 1507 zsurf3d(:,:,jk) = p_e2(:,:) * p_e3(:,:,jk) 1508 ENDDO 1509 1510 DO jk = 1, jpk 1511 DO ji = nistr, niend, nn_factx 1512 DO jj = njstr, njend, nn_facty 1513 ii = ( ji - mis_crs(2) ) * rfactx_r + 2 1514 ij = ( jj - mjs_crs(2) ) * rfacty_r + 2 1515 ijje = mje_crs(ij) 1516 ijie = mie_crs(ii) 1517 ! 1518 zsfcrs = zsurf3d(ijie,jj,jk) + zsurf3d(ijie,jj+1,jk) + zsurf3d(ijie,jj+2,jk) 1519 ! 1520 zsfcrs_msk = zsurf3d(ijie ,jj,jk) * p_mask(ijie,jj ,jk) & 1521 & + zsurf3d(ijie,jj+1,jk) * p_mask(ijie,jj+1,jk) & 1522 & + zsurf3d(ijie,jj+2,jk) * p_mask(ijie,jj+2,jk) 1523 ! 1524 p_surf_crs (ii,ij,jk) = zsfcrs 1525 p_surf_crs_msk(ii,ij,jk) = zsfcrs_msk 1526 ! 1527 ENDDO 1528 ENDDO 1529 ENDDO 1530 1531 CALL wrk_dealloc( jpi, jpj, jpk, zsurf3d ) 1532 1096 1533 END SELECT 1097 1098 1099 CALL crs_lbc_lnk( p_surf_crs (:,:,:), cd_type, 1.0, pval=1.0 ) 1100 CALL crs_lbc_lnk( p_surf_crs_msk(:,:,:), cd_type, 1.0, pval=1.0 ) 1534 1535 CALL crs_lbc_lnk( p_surf_crs , cd_type, 1.0, pval=1.0 ) 1536 CALL crs_lbc_lnk( p_surf_crs_msk, cd_type, 1.0, pval=1.0 ) 1101 1537 1102 1538 … … 1155 1591 nlej_crs = jpj_crs 1156 1592 1157 !!! Calculs suivant une découpage en j 1158 1593 ! Calculs suivant une découpage en j 1159 1594 DO jn = 1, jpnij, jpni 1160 1161 1595 IF( jn < (jpnij-jpni + 1)) THEN 1162 1596 nlejt_crs(jn) = AINT( REAL( ( jpjglo - (njmppt(jn ) - 1) ) / nn_facty, wp ) ) & … … 1167 1601 1168 1602 SELECT CASE( ibonjt(jn) ) 1169 1170 1603 CASE ( -1 ) 1171 1604 IF( MOD( jpjglo - njmppt(jn), nn_facty) > 0 ) nlejt_crs(jn) = nlejt_crs(jn) + 1 … … 1198 1631 ENDDO 1199 1632 ENDDO 1200 WRITE(numout,*) ' njmppt_crs', njmppt_crs 1201 nlej_crs = nlejt_crs(nproc + 1) 1202 nlcj_crs = nlcjt_crs(nproc + 1) 1203 nldj_crs = nldjt_crs(nproc + 1) 1204 njmpp_crs = njmppt_crs(nproc + 1) 1205 1206 1633 nlej_crs = nlejt_crs(nproc + 1) 1634 nlcj_crs = nlcjt_crs(nproc + 1) 1635 nldj_crs = nldjt_crs(nproc + 1) 1636 njmpp_crs = njmppt_crs(nproc + 1) 1207 1637 1208 1638 !!!! Calcul suivant un decoupage en i … … 1218 1648 1219 1649 CASE ( -1 ) 1220 1221 1650 nleit_crs(jn) = nleit_crs(jn) + jpreci 1222 1651 nlcit_crs(jn) = nleit_crs(jn) + jpreci … … 1224 1653 1225 1654 CASE ( 0 ) 1226 1227 1655 nleit_crs(jn) = nleit_crs(jn) + jpreci 1228 1656 nlcit_crs(jn) = nleit_crs(jn) + jpreci … … 1230 1658 1231 1659 CASE ( 1, 2 ) 1232 1233 1660 IF( MOD( jpiglo - nimppt(jn), nn_factx) > 0 ) nleit_crs(jn) = nleit_crs(jn) + 1 1234 1661 nleit_crs(jn) = nleit_crs(jn) + jpreci … … 1254 1681 nimpp_crs = nimppt_crs(nproc + 1) 1255 1682 1256 1257 1258 !!! rajouter la condition stop 1683 ! rajouter la condition stop 1259 1684 IF( jpizoom /= 1 .OR. jpjzoom /= 1) STOP 1260 1685 DO ji = 1, jpi_crs … … 1265 1690 ENDDO 1266 1691 1267 1268 1269 1692 ENDIF 1270 1693 … … 1434 1857 END SELECT 1435 1858 1436 1437 ! Pad the boundaries, do not know if it is necessary 1438 mis2_crs(1) = 1 ; mis2_crs(jpiglo_crs) = mie2_crs(jpiglo_crs - 1) + 1 1439 mie2_crs(1) = nn_factx ; mie2_crs(jpiglo_crs) = jpiglo 1440 mje2_crs(1) = mjs2_crs(2)-1; mje2_crs(jpjglo_crs) = jpjglo 1441 mjs2_crs(1) = 1 ; mjs2_crs(jpjglo_crs) = mje2_crs(jpjglo_crs) - nn_facty + 1 1442 1443 1444 1859 ! Pad the boundaries, do not know if it is necessary 1860 mis2_crs(1) = 1 ; mis2_crs(jpiglo_crs) = mie2_crs(jpiglo_crs - 1) + 1 1861 mie2_crs(1) = nn_factx ; mie2_crs(jpiglo_crs) = jpiglo 1862 mje2_crs(1) = mjs2_crs(2)-1 ; mje2_crs(jpjglo_crs) = jpjglo 1863 mjs2_crs(1) = 1 ; mjs2_crs(jpjglo_crs) = mje2_crs(jpjglo_crs) - nn_facty + 1 1445 1864 1446 1865 IF( .NOT. lk_mpp ) THEN 1447 njstart = 1 ; njend = jpj_crsm1 1448 mis_crs(:) = mis2_crs(:) 1449 mie_crs(:) = mie2_crs(:) 1450 mjs_crs(:) = mjs2_crs(:) 1451 mje_crs(:) = mje2_crs(:) 1866 mis_crs(:) = mis2_crs(:) 1867 mie_crs(:) = mie2_crs(:) 1868 mjs_crs(:) = mjs2_crs(:) 1869 mje_crs(:) = mje2_crs(:) 1452 1870 ELSE 1453 ! 1454 IF( nldj==1 ) THEN ; njstart = 1 1455 ELSE ; njstart = 2 1456 ENDIF 1457 ! 1458 IF(nlcj == nlej) THEN 1459 njend = nlej_crs - 1 1460 ELSE 1461 njend = nlej_crs 1462 ENDIF 1463 1464 DO jj = 1, nlej_crs 1465 mjs_crs(jj) = mjs2_crs(mjg_crs(jj)) - njmpp + 1 1466 mje_crs(jj) = mje2_crs(mjg_crs(jj)) - njmpp + 1 1467 ENDDO 1468 DO ji = 1, nlei_crs 1469 mis_crs(ji) = mis2_crs(mig_crs(ji)) - nimpp + 1 1470 mie_crs(ji) = mie2_crs(mig_crs(ji)) - nimpp + 1 1471 ENDDO 1472 1473 ! 1871 DO jj = 1, nlej_crs 1872 mjs_crs(jj) = mjs2_crs(mjg_crs(jj)) - njmpp + 1 1873 mje_crs(jj) = mje2_crs(mjg_crs(jj)) - njmpp + 1 1874 ENDDO 1875 DO ji = 1, nlei_crs 1876 mis_crs(ji) = mis2_crs(mig_crs(ji)) - nimpp + 1 1877 mie_crs(ji) = mie2_crs(mig_crs(ji)) - nimpp + 1 1878 ENDDO 1474 1879 ENDIF 1475 WRITE(numout,*) 'crs_init. coarse grid bounds on parent grid' 1476 WRITE(numout,*) 'mjg_crs=' , mjg_crs 1477 WRITE(numout,*) 'mig_crs=' , mig_crs 1478 WRITE(numout,*) 'nimpp_crs=', nimpp_crs 1479 WRITE(numout,*) 'njmpp_crs=', njmpp_crs 1480 WRITE(numout,*) 'njend=' , njend 1481 WRITE(numout,*) 'mis_crs=' , mis_crs 1482 WRITE(numout,*) 'mie_crs=' , mie_crs 1483 WRITE(numout,*) 'mjs_crs=' , mjs_crs 1484 WRITE(numout,*) 'mje_crs=' , mje_crs 1485 1486 1880 njstr = mjs_crs(2) ; njend = mjs_crs(nlcj_crs - 1) 1881 nistr = mis_crs(2) ; niend = mis_crs(nlci_crs - 1) 1882 WRITE(numout,*) 'crs_init. coarse grid bounds on parent grid' 1883 WRITE(numout,*) 'mjg_crs=' , mjg_crs 1884 WRITE(numout,*) 'mig_crs=' , mig_crs 1885 WRITE(numout,*) 'nimpp_crs=', nimpp_crs 1886 WRITE(numout,*) 'njmpp_crs=', njmpp_crs 1887 WRITE(numout,*) 'njend=' , njend 1888 WRITE(numout,*) 'mis_crs=' , mis_crs 1889 WRITE(numout,*) 'mie_crs=' , mie_crs 1890 WRITE(numout,*) 'mjs_crs=' , mjs_crs 1891 WRITE(numout,*) 'mje_crs=' , mje_crs 1892 ! 1487 1893 END SUBROUTINE crs_dom_def 1488 1894 1489 1895 SUBROUTINE crs_dom_bat 1490 !!----------------------------------------------------------------1896 !!---------------------------------------------------------------- 1491 1897 !! *** SUBROUTINE crs_dom_bat *** 1492 1898 !! ** Purpose : coarsenig bathy … … 1494 1900 !! 1495 1901 !! local variables 1496 1902 INTEGER :: ji,jj,jk ! dummy indices 1903 REAL(wp), DIMENSION(:,:) , POINTER :: zmbk 1904 !!---------------------------------------------------------------- 1497 1905 1498 INTEGER :: ji,jj,jk ! dummy indices 1499 REAL(wp), DIMENSION(:,:) , POINTER :: zmbk 1500 1501 CALL wrk_alloc( jpi_crs, jpj_crs, zmbk ) 1906 CALL wrk_alloc( jpi_crs, jpj_crs, zmbk ) 1502 1907 1503 1908 mbathy_crs(:,:) = jpkm1 … … 1538 1943 END DO 1539 1944 1540 WRITE(numout,*) 'crsini. Set mbku, mkbv'1541 1542 1945 ! convert into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk 1543 1544 1946 zmbk(:,:) = 1.e0; 1545 1947 zmbk(:,:) = REAL( mbku_crs(:,:), wp ) ; CALL crs_lbc_lnk(zmbk,'U',1.0) ; mbku_crs (:,:) = MAX( INT( zmbk(:,:) ), 1 ) … … 1547 1949 ! 1548 1950 CALL wrk_dealloc( jpi_crs, jpj_crs, zmbk ) 1549 WRITE(numout,*) 'crs_init = finished section 3d.1 jpi=', jpi, 'jpj=',jpj, ' jpk=', jpk 1550 1951 ! 1551 1952 END SUBROUTINE crs_dom_bat 1552 1953 -
branches/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM/NEMO/OPA_SRC/CRS/crsdomwri.F90
r3864 r3895 21 21 USE lib_mpp ! MPP library 22 22 ! USE wrk_nemo ! Memory allocation 23 USE iom_def 23 24 USE iom 24 25 USE crs ! coarse grid domain … … 295 296 SELECT CASE ( MOD(nn_msh_crs, 3) ) 296 297 CASE ( 1 ) 297 CALL iom_close( inum0 )298 CALL crs_iom_close( inum0 ) 298 299 CASE ( 2 ) 299 CALL iom_close( inum1 )300 CALL iom_close( inum2 )300 CALL crs_iom_close( inum1 ) 301 CALL crs_iom_close( inum2 ) 301 302 CASE ( 0 ) 302 CALL iom_close( inum2 )303 CALL iom_close( inum3 )304 CALL iom_close( inum4 )303 CALL crs_iom_close( inum2 ) 304 CALL crs_iom_close( inum3 ) 305 CALL crs_iom_close( inum4 ) 305 306 END SELECT 306 307 ! -
branches/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM/NEMO/OPA_SRC/CRS/crsini.F90
r3864 r3895 15 15 USE in_out_manager 16 16 USE par_kind, ONLY: wp 17 USE crs18 17 USE crsdom 19 18 USE crsdomwri … … 208 207 209 208 ! 3.d.3 Vertical depth (meters) 210 211 CALL crsfun( p_e1e2t=e1e2t, cd_type='T', cd_op='MAX', p_cmask=tmask_crs, p_ptmask=tmask, & 212 & p_pfield3d_1=gdept, p_cfield3d=gdept_crs ) 213 CALL crsfun( p_e1e2t=e1e2t, cd_type='W', cd_op='MAX', p_cmask=tmask_crs, p_ptmask=tmask, & 214 & p_pfield3d_1=gdepw, p_cfield3d=gdepw_crs ) 209 CALL crs_dom_ope( gdept, 'MAX', 'T', tmask, gdept_crs, p_e3=zfse3t ) 210 CALL crs_dom_ope( gdepw, 'MAX', 'W', tmask, gdepw_crs, p_e3=zfse3w ) 211 215 212 216 213 ! 3.d.4 Surfaces 217 218 CALL crs_dom_sfc( e1t, e2t, zfse3w, 'W', tmask, e1e2w, e1e2w_msk ) 219 CALL crs_dom_sfc( e1u, e2u, zfse3u, 'U', umask, e2e3u, e2e3u_msk ) 220 CALL crs_dom_sfc( e1v, e2v, zfse3v, 'V', vmask, e1e3v, e1e3v_msk ) 214 CALL crs_dom_sfc( tmask, 'T', e1e2w, e1e2w_msk, p_e1=e1t, p_e2=e2t ) 215 CALL crs_dom_sfc( umask, 'U', e2e3u, e2e3u_msk, p_e2=e2u, p_e3=zfse3u ) 216 CALL crs_dom_sfc( vmask, 'V', e1e3v, e1e3v_msk, p_e1=e1v, p_e3=zfse3v ) 221 217 218 facsurfu(:,:,:) = umask_crs(:,:,:) * e2e3u_msk(:,:,:) / e2e3u(:,:,:) 219 facsurfv(:,:,:) = vmask_crs(:,:,:) * e1e3v_msk(:,:,:) / e1e3v(:,:,:) 222 220 223 221 !--------------------------------------------------------- … … 227 225 228 226 !! ! jes. May not need ocean_volume_crs_t, ocean_volume_crs_w as calculated already in trc_init as cvol 229 CALL crsfun_wgt( cd_type='T', cd_op='VOL', p_pmask=tmask, p_e1=e1t, p_e2=e2t, p_fse3=zfse3t, & 230 & p_cfield3d_1=ocean_volume_crs_t, p_cfield3d_2=facvol_t ) 231 232 r1_bt_crs(:,:,:) = 0._wp 233 bt_crs(:,:,:) = ocean_volume_crs_t(:,:,:)* facvol_t(:,:,:) 234 WHERE( bt_crs /= 0._wp ) r1_bt_crs(:,:,:) = 1._wp/bt_crs(:,:,:) 235 236 CALL crsfun_wgt( cd_type='W', cd_op='VOL', p_pmask=tmask, p_e1=e1t, p_e2=e2t, p_fse3=zfse3w, & 237 & p_cfield3d_1=ocean_volume_crs_w, p_cfield3d_2=facvol_w ) 238 239 ! 4.c. T volume weights 240 CALL crsfun_wgt( cd_type='T', cd_op='WGT', p_pmask=tmask, p_e1=e1t, p_e2=e2t, p_fse3=zfse3t, p_cfield3d_1=crs_volt_wgt ) 241 227 CALL crs_dom_facvol( tmask, 'T', e1t, e2t, zfse3t, ocean_volume_crs_t, facvol_t ) 228 ! 229 bt_crs(:,:,:) = ocean_volume_crs_t(:,:,:) * facvol_t(:,:,:) 230 ! 231 r1_bt_crs(:,:,:) = 0._wp 232 WHERE( bt_crs /= 0._wp ) r1_bt_crs(:,:,:) = 1._wp / bt_crs(:,:,:) 233 234 CALL crs_dom_facvol( tmask, 'W', e1t, e2t, zfse3w, ocean_volume_crs_w, facvol_w ) 235 ! 242 236 !--------------------------------------------------------- 243 237 ! 5. Write out coarse meshmask (see OPA_SRC/DOM/domwri.F90 for ideas later) -
branches/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM/NEMO/OPA_SRC/CRS/crsiom.F90
r3864 r3895 31 31 !! jes. 28 Jun 2012. TODO. make sure of variable declarations to be placed here or crs_dom.F90 32 32 !!-------------------------------------------------------------------- 33 USE timing 34 USE crs 33 35 USE dom_oce ! ocean space and time domain 34 USE crs 36 USE iom_def ! iom variables definitions 37 USE netcdf ! NetCDF library 35 38 USE in_out_manager ! I/O manager 39 USE lib_mpp ! MPP library 36 40 USE iom ! I/O library 41 USE par_kind, ONLY: wp 37 42 38 43 … … 40 45 PRIVATE 41 46 42 PUBLIC crs_iom_open, crs_iom_rstput, crs_iom_put 47 PUBLIC crs_iom_open, crs_iom_close, crs_iom_rstput, crs_iom_put 48 49 ! PUBLIC crs_iom_varid, crs_iom_get, crs_iom_gettime 50 51 52 INTEGER, PARAMETER :: jpdomcrs_data = 1 !: ( 1 :jpiglo_crs, 1 :jpjglo_crs) 53 INTEGER, PARAMETER :: jpdomcrs_global = 2 !: ( 1 :jpiglo_crs, 1 :jpjglo_crs) 54 INTEGER, PARAMETER :: jpdomcrs_local = 3 !: One of the 3 following cases 55 INTEGER, PARAMETER :: jpdomcrs_local_full = 4 !: ( 1 :jpi_crs , 1 :jpj_crs ) 56 INTEGER, PARAMETER :: jpdomcrs_local_noextra = 5 !: ( 1 :nlci_crs , 1 :nlcj_crs ) 57 INTEGER, PARAMETER :: jpdomcrs_local_noovlap = 6 !: (nldi_crs:nlei_crs ,nldj_crs:nlej_crs ) 58 INTEGER, PARAMETER :: jpdomcrs_unknown = 7 !: No dimension checking 59 INTEGER, PARAMETER :: jpdomcrs_autoglo = 8 !: 60 INTEGER, PARAMETER :: jpdomcrs_autodta = 9 !: 61 INTEGER :: ipdomcrs_local_noovlap_crs, ipdomcrs_local_full_crs, idomcrs_local_noextra_crs 43 62 44 63 INTEGER :: idomcrs ! Type of domain to be written (default = jpdom_local_noovlap) 64 INTEGER, DIMENSION(2,5) :: idompar_crs ! domain parameters: 45 65 LOGICAL :: llnoov ! local definition to read overlap 46 66 … … 65 85 66 86 llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif 67 IF( llnoov ) THEN ; idomcrs = jpdom _local_noovlap ! default definition68 ELSE ; idomcrs = jpdom _local_full ! default definition87 IF( llnoov ) THEN ; idomcrs = jpdomcrs_local_noovlap ! default definition 88 ELSE ; idomcrs = jpdomcrs_local_full ! default definition 69 89 ENDIF 70 90 IF ( PRESENT(kdom) ) idomcrs = kdom … … 72 92 CALL iom_open( cdname, kiomid, ldwrt, idomcrs, kiolib ) 73 93 94 WRITE(numout,*) 'crs_iom_open. after iom_open call kiomid=', kiomid 95 74 96 CALL dom_grid_glo ! Return to parent grid domain 75 97 76 98 END SUBROUTINE crs_iom_open 99 100 101 SUBROUTINE crs_iom_close( kiomid ) 102 !!-------------------------------------------------------------------- 103 !! *** MODULE crs_iom_open *** 104 !! 105 !! ** Purpose : open an input file with NF90 on coarsened grid 106 !!--------------------------------------------------------------------- 107 !! Arguments 108 INTEGER , INTENT(inout) :: kiomid ! nf90 identifier of the opened file 109 !! Local variable 110 CHARACTER(LEN=100) :: clinfo ! info character 111 !--------------------------------------------------------------------- 112 ! 113 WRITE(numout,*) 'crs_iom_close. kiomid=', kiomid 114 115 CALL iom_close( kiomid ) 116 WRITE(numout,*) 'crs_iom_close. after iom_open call kiomid=', kiomid 117 118 ! 119 END SUBROUTINE crs_iom_close 77 120 78 121 … … 137 180 ELSEIF( PRESENT(pv_r3d) ) THEN ; CALL iom_put( cdvar, pv_r3d ) 138 181 ENDIF 139 140 182 CALL dom_grid_glo ! Return to parent grid domain 141 183
Note: See TracChangeset
for help on using the changeset viewer.