Changeset 987 for LMDZ4/trunk/libf/phylmd/surf_land_orchidee_mod.F90
- Timestamp:
- Jul 30, 2008, 5:57:45 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/trunk/libf/phylmd/surf_land_orchidee_mod.F90
r888 r987 18 18 USE comgeomphy, ONLY : cuphy, cvphy 19 19 USE mod_grid_phy_lmdz 20 USE mod_phys_lmdz_para 20 USE mod_phys_lmdz_para, mpi_root_rank=>mpi_root 21 21 22 22 IMPLICIT NONE … … 25 25 PUBLIC :: surf_land_orchidee 26 26 27 LOGICAL, ALLOCATABLE, SAVE :: flag_omp(:) 27 28 CONTAINS 28 29 ! … … 39 40 tsol_rad, tsurf_new, alb1_new, alb2_new, & 40 41 emis_new, z0_new, qsurf) 42 USE mod_surf_para 43 USE mod_synchro_omp 44 41 45 ! 42 46 ! Cette routine sert d'interface entre le modele atmospherique et le … … 163 167 164 168 REAL, DIMENSION(knon,2) :: albedo_out 165 !$OMP THREADPRIVATE(albedo_out)166 169 167 170 ! Pb de nomenclature … … 188 191 REAL, ALLOCATABLE, DIMENSION(:), SAVE :: riverflow 189 192 !$OMP THREADPRIVATE(riverflow) 193 194 INTEGER :: orch_omp_rank 195 INTEGER :: orch_omp_size 190 196 ! 191 197 ! Fin definition … … 198 204 199 205 IF (debut) THEN 206 CALL Init_surf_para(knon) 200 207 ALLOCATE(ktindex(knon)) 201 208 IF ( .NOT. ALLOCATED(albedo_keep)) THEN 202 ALLOCATE(albedo_keep(klon)) 209 !ym ALLOCATE(albedo_keep(klon)) 210 !ym bizarre que non alloué en knon precedement 211 ALLOCATE(albedo_keep(knon)) 203 212 ALLOCATE(zlev(knon)) 204 213 ENDIF … … 333 342 IF (lafin) lrestart_write = .TRUE. 334 343 IF (check) WRITE(lunout,*)'lafin ',lafin,lrestart_write 335 344 336 345 petA_orc(1:knon) = petBcoef(1:knon) * dtime 337 346 petB_orc(1:knon) = petAcoef(1:knon) … … 352 361 ! write(*,*)'Cdrag = ',minval(cdrag),maxval(cdrag) 353 362 354 !355 ! Init Orchidee356 !357 ! if (pole_nord) then358 ! offset=0359 ! ktindex(:)=ktindex(:)+iim-1360 ! else361 ! offset = klon_mpi_begin-1+iim-1362 ! ktindex(:)=ktindex(:)+MOD(offset,iim)363 ! offset=offset-MOD(offset,iim)364 ! endif365 363 366 364 IF (debut) THEN 367 CALL Get_orchidee_communicator(knon,orch_comm) 368 IF (knon /=0) THEN 369 CALL Init_orchidee_index(knon,orch_comm,knindex,offset,ktindex) 370 371 #ifndef CPP_PARA 372 #define ORC_PREPAR 373 #endif 374 #ifdef ORC_PREPAR 375 ! Interface for ORCHIDEE version 1.9 or earlier compiled in sequential mode(without preprocessing flag CPP_PARA) 365 CALL Init_orchidee_index(knon,knindex,offset,ktindex) 366 CALL Get_orchidee_communicator(orch_comm,orch_omp_size,orch_omp_rank) 367 CALL Init_synchro_omp 368 369 IF (knon_mpi > 0) THEN 370 CALL Init_intersurf(nbp_lon,nbp_lat,knon,ktindex,offset,orch_omp_size,orch_omp_rank,orch_comm) 371 ENDIF 372 373 374 IF (knon > 0) THEN 375 376 376 CALL intersurf_main (itime+itau_phy-1, iim, jjm+1, knon, ktindex, dtime, & 377 377 lrestart_read, lrestart_write, lalo, & … … 383 383 tsol_rad, tsurf_new, qsurf, albedo_out, emis_new, z0_new, & 384 384 lon_scat, lat_scat) 385 386 #else 387 ! Interface for ORCHIDEE version 1.9 compiled in parallel mode(with preprocessing flag CPP_PARA) 388 CALL intersurf_main (itime+itau_phy-1, iim, jjm+1, offset, knon, ktindex, & 389 orch_comm, dtime, lrestart_read, lrestart_write, lalo, & 390 contfrac, neighbours, resolution, date0, & 391 zlev, u1_lay(1:knon), v1_lay(1:knon), spechum(1:knon), temp_air(1:knon), epot_air(1:knon), ccanopy(1:knon), & 392 cdrag(1:knon), petA_orc(1:knon), peqA_orc(1:knon), petB_orc(1:knon), peqB_orc(1:knon), & 393 precip_rain(1:knon), precip_snow(1:knon), lwdown(1:knon), swnet(1:knon), swdown(1:knon), ps(1:knon), & 394 evap(1:knon), fluxsens(1:knon), fluxlat(1:knon), coastalflow(1:knon), riverflow(1:knon), & 395 tsol_rad(1:knon), tsurf_new(1:knon), qsurf(1:knon), albedo_out(1:knon,:), emis_new(1:knon), z0_new(1:knon), & 396 lon_scat, lat_scat) 397 #endif 398 399 ENDIF 385 386 ENDIF 387 388 CALL Synchro_omp 400 389 401 390 albedo_keep(1:knon) = (albedo_out(1:knon,1)+albedo_out(1:knon,2))/2. … … 403 392 ENDIF 404 393 394 405 395 ! swdown_vrai(1:knon) = swnet(1:knon)/(1. - albedo_keep(1:knon)) 406 396 swdown_vrai(1:knon) = swdown(1:knon) 407 397 408 IF (knon /=0) THEN 409 410 #ifdef ORC_PREPAR 411 ! Interface for ORCHIDEE version 1.9 or earlier compiled in sequential mode(without preprocessing flag CPP_PARA) 412 CALL intersurf_main (itime+itau_phy, iim, jjm+1, knon, ktindex, dtime, & 398 IF (knon > 0) THEN 399 400 CALL intersurf_main (itime+itau_phy, iim, jjm+1, knon, ktindex, dtime, & 413 401 lrestart_read, lrestart_write, lalo, & 414 contfrac, neighbours, resolution, date0, &415 zlev, u1_lay, v1_lay, spechum, temp_air, epot_air, ccanopy, &416 cdrag, petA_orc, peqA_orc, petB_orc, peqB_orc, &417 precip_rain, precip_snow, lwdown, swnet, swdown_vrai, ps, &418 evap, fluxsens, fluxlat, coastalflow, riverflow, &419 tsol_rad, tsurf_new, qsurf, albedo_out, emis_new, z0_new, &420 lon_scat, lat_scat)421 422 #else423 ! Interface for ORCHIDEE version 1.9 compiled in parallel mode(with preprocessing flag CPP_PARA)424 CALL intersurf_main (itime+itau_phy, iim, jjm+1,offset, knon, ktindex, &425 orch_comm,dtime, lrestart_read, lrestart_write, lalo, &426 402 contfrac, neighbours, resolution, date0, & 427 403 zlev, u1_lay(1:knon), v1_lay(1:knon), spechum(1:knon), temp_air(1:knon), epot_air(1:knon), ccanopy(1:knon), & … … 431 407 tsol_rad(1:knon), tsurf_new(1:knon), qsurf(1:knon), albedo_out(1:knon,:), emis_new(1:knon), z0_new(1:knon), & 432 408 lon_scat, lat_scat) 433 #endif434 409 435 410 ENDIF 436 411 412 CALL Synchro_omp 413 437 414 albedo_keep(1:knon) = (albedo_out(1:knon,1)+albedo_out(1:knon,2))/2. 438 415 … … 455 432 IF (debut) lrestart_read = .FALSE. 456 433 434 IF (debut) CALL Finalize_surf_para 435 457 436 END SUBROUTINE surf_land_orchidee 458 437 ! 459 438 !**************************************************************************************** 460 439 ! 461 SUBROUTINE Init_orchidee_index(knon,orch_comm,knindex,offset,ktindex) 462 463 INCLUDE "dimensions.h" 464 440 SUBROUTINE Init_orchidee_index(knon,knindex,offset,ktindex) 441 USE mod_surf_para 442 USE mod_grid_phy_lmdz 443 444 INTEGER,INTENT(IN) :: knon 445 INTEGER,INTENT(IN) :: knindex(klon) 446 INTEGER,INTENT(OUT) :: offset 447 INTEGER,INTENT(OUT) :: ktindex(klon) 448 449 INTEGER :: ktindex_glo(knon_glo) 450 INTEGER :: offset_para(0:omp_size*mpi_size-1) 451 INTEGER :: LastPoint 452 INTEGER :: task 453 454 ktindex(1:knon)=knindex(1:knon)+(klon_mpi_begin-1)+(klon_omp_begin-1)+nbp_lon-1 455 456 CALL gather_surf(ktindex(1:knon),ktindex_glo) 457 458 IF (is_mpi_root .AND. is_omp_root) THEN 459 LastPoint=0 460 DO Task=0,mpi_size*omp_size-1 461 IF (knon_glo_para(Task)>0) THEN 462 offset_para(task)= LastPoint-MOD(LastPoint,nbp_lon) 463 LastPoint=ktindex_glo(knon_glo_end_para(task)) 464 ENDIF 465 ENDDO 466 ENDIF 467 468 CALL bcast(offset_para) 469 470 offset=offset_para(omp_size*mpi_rank+omp_rank) 471 472 ktindex(1:knon)=ktindex(1:knon)-offset 473 474 END SUBROUTINE Init_orchidee_index 475 476 ! 477 !************************* *************************************************************** 478 ! 479 480 SUBROUTINE Get_orchidee_communicator(orch_comm,orch_omp_size,orch_omp_rank) 481 USE mod_surf_para 482 465 483 #ifdef CPP_PARA 466 484 INCLUDE 'mpif.h' 467 485 #endif 468 486 469 470 ! Input arguments 471 !**************************************************************************************** 472 INTEGER, INTENT(IN) :: knon 473 INTEGER, INTENT(IN) :: orch_comm 474 INTEGER, DIMENSION(klon), INTENT(IN) :: knindex 475 476 ! Output arguments 477 !**************************************************************************************** 478 INTEGER, INTENT(OUT) :: offset 479 INTEGER, DIMENSION(knon), INTENT(OUT) :: ktindex 480 481 ! Local varables 482 !**************************************************************************************** 483 #ifdef CPP_PARA 484 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: status 487 INTEGER,INTENT(OUT) :: orch_comm 488 INTEGER,INTENT(OUT) :: orch_omp_size 489 INTEGER,INTENT(OUT) :: orch_omp_rank 490 INTEGER :: color 491 INTEGER :: i,ierr 492 ! 493 ! End definition 494 !**************************************************************************************** 495 496 497 IF (is_omp_root) THEN 498 499 IF (knon_mpi==0) THEN 500 color = 0 501 ELSE 502 color = 1 503 ENDIF 504 505 #ifdef CPP_PARA 506 CALL MPI_COMM_SPLIT(COMM_LMDZ_PHY,color,mpi_rank,orch_comm,ierr) 485 507 #endif 486 508 487 INTEGER :: MyLastPoint 488 INTEGER :: LastPoint 489 INTEGER :: mpi_rank_orch 490 INTEGER :: mpi_size_orch 491 INTEGER :: ierr 492 ! 493 ! End definition 494 !**************************************************************************************** 495 496 MyLastPoint=klon_mpi_begin-1+knindex(knon)+iim-1 497 498 IF (is_parallel) THEN 499 #ifdef CPP_PARA 500 CALL MPI_COMM_SIZE(orch_comm,mpi_size_orch,ierr) 501 CALL MPI_COMM_RANK(orch_comm,mpi_rank_orch,ierr) 502 #endif 503 ELSE 504 mpi_rank_orch=0 505 mpi_size_orch=1 506 ENDIF 507 508 IF (is_parallel) THEN 509 IF (mpi_rank_orch /= 0) THEN 510 #ifdef CPP_PARA 511 CALL MPI_RECV(LastPoint,1,MPI_INTEGER,mpi_rank_orch-1,1234,orch_comm,status,ierr) 512 #endif 513 ENDIF 514 515 IF (mpi_rank_orch /= mpi_size_orch-1) THEN 516 #ifdef CPP_PARA 517 CALL MPI_SEND(MyLastPoint,1,MPI_INTEGER,mpi_rank_orch+1,1234,orch_comm,ierr) 518 #endif 519 ENDIF 520 ENDIF 521 522 IF (mpi_rank_orch == 0) THEN 523 offset=0 524 ELSE 525 offset=LastPoint-MOD(LastPoint,iim) 526 ENDIF 527 528 ktindex(1:knon)=knindex(1:knon)+(klon_mpi_begin+iim-1)-offset-1 529 530 531 END SUBROUTINE Init_orchidee_index 532 ! 533 !**************************************************************************************** 534 ! 535 SUBROUTINE Get_orchidee_communicator(knon,orch_comm) 536 509 ENDIF 510 511 IF (knon_mpi /= 0) THEN 512 orch_omp_size=0 513 DO i=0,omp_size-1 514 IF (knon_omp_para(i) /=0) THEN 515 orch_omp_size=orch_omp_size+1 516 IF (i==omp_rank) orch_omp_rank=orch_omp_size-1 517 ENDIF 518 ENDDO 519 ENDIF 520 521 522 END SUBROUTINE Get_orchidee_communicator 523 ! 524 !**************************************************************************************** 525 ! 526 527 SUBROUTINE Init_neighbours(knon,neighbours,knindex,pctsrf) 528 USE mod_grid_phy_lmdz 529 USE mod_surf_para 530 INCLUDE "indicesol.h" 531 537 532 #ifdef CPP_PARA 538 533 INCLUDE 'mpif.h' 539 534 #endif 540 535 541 542 INTEGER,INTENT(IN) :: knon543 INTEGER,INTENT(OUT) :: orch_comm544 545 INTEGER :: color546 INTEGER :: ierr547 !548 ! End definition549 !****************************************************************************************550 551 IF (knon==0) THEN552 color = 0553 ELSE554 color = 1555 ENDIF556 557 #ifdef CPP_PARA558 CALL MPI_COMM_SPLIT(COMM_LMDZ_PHY,color,mpi_rank,orch_comm,ierr)559 #endif560 561 END SUBROUTINE Get_orchidee_communicator562 !563 !****************************************************************************************564 !565 SUBROUTINE Init_neighbours(knon,neighbours,ktindex,pctsrf)566 567 INCLUDE "indicesol.h"568 INCLUDE "dimensions.h"569 #ifdef CPP_PARA570 INCLUDE 'mpif.h'571 #endif572 573 536 ! Input arguments 574 537 !**************************************************************************************** 575 538 INTEGER, INTENT(IN) :: knon 576 INTEGER, DIMENSION(klon), INTENT(IN) :: k tindex539 INTEGER, DIMENSION(klon), INTENT(IN) :: knindex 577 540 REAL, DIMENSION(klon), INTENT(IN) :: pctsrf 578 541 … … 583 546 ! Local variables 584 547 !**************************************************************************************** 585 INTEGER :: knon_g586 548 INTEGER :: i, igrid, jj, ij, iglob 587 549 INTEGER :: ierr, ireal, index 588 INTEGER, DIMENSION(0:mpi_size-1) :: knon_nb589 INTEGER, DIMENSION(0:mpi_size-1) :: displs590 550 INTEGER, DIMENSION(8,3) :: off_ini 591 551 INTEGER, DIMENSION(8) :: offset 592 INTEGER, DIMENSION(knon) :: ktindex_p 593 INTEGER, DIMENSION(iim,jjm+1) :: correspond 594 INTEGER, ALLOCATABLE, DIMENSION(:) :: ktindex_g 595 INTEGER, ALLOCATABLE, DIMENSION(:,:) :: neighbours_g 596 REAL, DIMENSION(klon_glo) :: pctsrf_g 597 552 INTEGER, DIMENSION(nbp_lon,nbp_lat) :: correspond 553 INTEGER, DIMENSION(knon_glo) :: ktindex_glo 554 INTEGER, DIMENSION(knon_glo,8) :: neighbours_glo 555 REAL, DIMENSION(klon_glo) :: pctsrf_glo 556 INTEGER :: ktindex(klon) 598 557 ! 599 558 ! End definition 600 559 !**************************************************************************************** 601 560 602 IF (is_sequential) THEN 603 knon_nb(:)=knon 604 ELSE 605 606 #ifdef CPP_PARA 607 CALL MPI_GATHER(knon,1,MPI_INTEGER,knon_nb,1,MPI_INTEGER,0,COMM_LMDZ_PHY,ierr) 608 #endif 609 610 ENDIF 611 612 IF (is_mpi_root) THEN 613 knon_g=SUM(knon_nb(:)) 614 ALLOCATE(ktindex_g(knon_g)) 615 ALLOCATE(neighbours_g(knon_g,8)) 616 neighbours_g(:,:)=-1 617 displs(0)=0 618 DO i=1,mpi_size-1 619 displs(i)=displs(i-1)+knon_nb(i-1) 620 ENDDO 621 ENDIF 622 623 ktindex_p(1:knon)=ktindex(1:knon)+klon_mpi_begin-1+iim-1 624 625 IF (is_sequential) THEN 626 ktindex_g(:)=ktindex_p(:) 627 ELSE 628 629 #ifdef CPP_PARA 630 CALL MPI_GATHERV(ktindex_p,knon,MPI_INTEGER,ktindex_g,knon_nb,& 631 displs,MPI_INTEGER,0,COMM_LMDZ_PHY,ierr) 632 #endif 633 634 ENDIF 635 636 CALL Gather(pctsrf,pctsrf_g) 637 638 IF (is_mpi_root) THEN 561 ktindex(1:knon)=knindex(1:knon)+(klon_mpi_begin-1)+(klon_omp_begin-1)+nbp_lon-1 562 563 CALL gather_surf(ktindex(1:knon),ktindex_glo) 564 CALL gather(pctsrf,pctsrf_glo) 565 566 IF (is_mpi_root .AND. is_omp_root) THEN 567 neighbours_glo(:,:)=-1 639 568 ! Initialisation des offset 640 569 ! 641 570 ! offset bord ouest 642 off_ini(1,1) = - iim ; off_ini(2,1) = - iim + 1; off_ini(3,1) = 1643 off_ini(4,1) = iim + 1; off_ini(5,1) = iim ; off_ini(6,1) = 2 * iim- 1644 off_ini(7,1) = iim -1 ; off_ini(8,1) = - 1571 off_ini(1,1) = - nbp_lon ; off_ini(2,1) = - nbp_lon + 1 ; off_ini(3,1) = 1 572 off_ini(4,1) = nbp_lon + 1 ; off_ini(5,1) = nbp_lon ; off_ini(6,1) = 2 * nbp_lon - 1 573 off_ini(7,1) = nbp_lon -1 ; off_ini(8,1) = - 1 645 574 ! offset point normal 646 off_ini(1,2) = - iim ; off_ini(2,2) = - iim + 1; off_ini(3,2) = 1647 off_ini(4,2) = iim + 1; off_ini(5,2) = iim ; off_ini(6,2) = iim- 1648 off_ini(7,2) = -1 ; off_ini(8,2) = - iim- 1575 off_ini(1,2) = - nbp_lon ; off_ini(2,2) = - nbp_lon + 1 ; off_ini(3,2) = 1 576 off_ini(4,2) = nbp_lon + 1 ; off_ini(5,2) = nbp_lon ; off_ini(6,2) = nbp_lon - 1 577 off_ini(7,2) = -1 ; off_ini(8,2) = - nbp_lon - 1 649 578 ! offset bord est 650 off_ini(1,3) = - iim; off_ini(2,3) = - 2 * iim + 1; off_ini(3,3) = - iim+ 1651 off_ini(4,3) = 1 ; off_ini(5,3) = iim ; off_ini(6,3) = iim- 1652 off_ini(7,3) = -1 ; off_ini(8,3) = - iim- 1579 off_ini(1,3) = - nbp_lon ; off_ini(2,3) = - 2 * nbp_lon + 1 ; off_ini(3,3) = - nbp_lon + 1 580 off_ini(4,3) = 1 ; off_ini(5,3) = nbp_lon ; off_ini(6,3) = nbp_lon - 1 581 off_ini(7,3) = -1 ; off_ini(8,3) = - nbp_lon - 1 653 582 ! 654 583 ! 655 584 ! Attention aux poles 656 585 ! 657 DO igrid = 1, knon_g 658 index = ktindex_g (igrid)659 jj = INT((index - 1)/ iim) + 1660 ij = index - (jj - 1) * iim586 DO igrid = 1, knon_glo 587 index = ktindex_glo(igrid) 588 jj = INT((index - 1)/nbp_lon) + 1 589 ij = index - (jj - 1) * nbp_lon 661 590 correspond(ij,jj) = igrid 662 591 ENDDO 663 592 664 DO igrid = 1, knon_g 665 iglob = ktindex_g(igrid) 666 IF (MOD(iglob, iim) == 1) THEN 593 DO igrid = 1, knon_glo 594 iglob = ktindex_glo(igrid) 595 596 IF (MOD(iglob, nbp_lon) == 1) THEN 667 597 offset = off_ini(:,1) 668 ELSE IF(MOD(iglob, iim) == 0) THEN598 ELSE IF(MOD(iglob, nbp_lon) == 0) THEN 669 599 offset = off_ini(:,3) 670 600 ELSE 671 601 offset = off_ini(:,2) 672 602 ENDIF 603 673 604 DO i = 1, 8 674 605 index = iglob + offset(i) 675 ireal = (MIN(MAX(1, index - iim+ 1), klon_glo))676 IF (pctsrf_g (ireal) > EPSFRA) THEN677 jj = INT((index - 1)/ iim) + 1678 ij = index - (jj - 1) * iim679 neighbours_g (igrid, i) = correspond(ij, jj)606 ireal = (MIN(MAX(1, index - nbp_lon + 1), klon_glo)) 607 IF (pctsrf_glo(ireal) > EPSFRA) THEN 608 jj = INT((index - 1)/nbp_lon) + 1 609 ij = index - (jj - 1) * nbp_lon 610 neighbours_glo(igrid, i) = correspond(ij, jj) 680 611 ENDIF 681 612 ENDDO … … 684 615 ENDIF 685 616 686 DO i=1,8 687 IF (is_sequential) THEN 688 neighbours(:,i)=neighbours_g(:,i) 689 ELSE 690 #ifdef CPP_PARA 691 CALL MPI_SCATTERV(neighbours_g(:,i),knon_nb,displs,MPI_INTEGER,neighbours(:,i),knon,MPI_INTEGER,0,COMM_LMDZ_PHY,ierr) 617 DO i = 1, 8 618 CALL scatter_surf(neighbours_glo(:,i),neighbours(1:knon,i)) 619 ENDDO 620 END SUBROUTINE Init_neighbours 621 622 ! 623 !**************************************************************************************** 624 ! 625 692 626 #endif 693 ENDIF694 ENDDO695 696 END SUBROUTINE Init_neighbours697 !698 !****************************************************************************************699 !700 701 #endif702 627 703 628 END MODULE surf_land_orchidee_mod
Note: See TracChangeset
for help on using the changeset viewer.