Changeset 5159 for LMDZ6/branches/Amaury_dev/libf/dyn3dmem
- Timestamp:
- Aug 2, 2024, 9:58:25 PM (7 months ago)
- Location:
- LMDZ6/branches/Amaury_dev/libf/dyn3dmem
- Files:
-
- 1 deleted
- 97 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/addfi_loc.f90
r5136 r5159 10 10 USE lmdz_comgeom 11 11 12 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 13 USE lmdz_paramet 12 14 IMPLICIT NONE 13 ! 15 14 16 !======================================================================= 15 ! 17 16 18 ! Addition of the physical tendencies 17 ! 19 18 20 ! Interface : 19 21 ! ----------- 20 ! 22 21 23 ! Input : 22 24 ! ------- … … 32 34 ! pdhfi(ip1jmp1) | tendencies 33 35 ! pdtsfi(ip1jmp1) | 34 ! 36 35 37 ! Output : 36 38 ! -------- … … 39 41 ! ph 40 42 ! pts 41 ! 42 ! 43 44 43 45 !======================================================================= 44 ! 46 45 47 !----------------------------------------------------------------------- 46 ! 48 47 49 ! 0. Declarations : 48 50 ! ------------------ 49 51 ! 50 INCLUDE "dimensions.h" 51 INCLUDE "paramet.h" 52 ! 52 53 54 53 55 ! Arguments : 54 56 ! ----------- 55 ! 57 56 58 REAL, INTENT(IN) :: pdt ! time step for the integration (s) 57 ! 59 58 60 REAL, INTENT(INOUT) :: pvcov(ijb_v:ije_v, llm) ! covariant meridional wind 59 61 REAL, INTENT(INOUT) :: pucov(ijb_u:ije_u, llm) ! covariant zonal wind … … 67 69 REAL, INTENT(IN) :: pdhfi(ijb_u:ije_u, llm) 68 70 REAL, INTENT(IN) :: pdpfi(ijb_u:ije_u) 69 ! 71 70 72 LOGICAL, INTENT(IN) :: leapf, forward ! not used 71 ! 72 ! 73 74 73 75 ! Local variables : 74 76 ! ----------------- 75 ! 77 76 78 REAL :: xpn(iim), xps(iim), tpn, tps 77 79 INTEGER :: j, k, iq, ij … … 80 82 81 83 INTEGER :: ijb, ije 82 ! 84 83 85 !----------------------------------------------------------------------- 84 86 … … 148 150 !$OMP END DO NOWAIT 149 151 150 ! 152 151 153 IF (pole_sud) ije = ij_end 152 154 !$OMP MASTER -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/advect_new_loc.f90
r5136 r5159 11 11 USE lmdz_comgeom 12 12 13 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 14 USE lmdz_paramet 13 15 IMPLICIT NONE 14 16 !======================================================================= 15 ! 17 16 18 ! Auteurs: P. Le Van , Fr. Hourdin . 17 19 ! ------- 18 ! 20 19 21 ! Objet: 20 22 ! ------ 21 ! 23 22 24 ! ************************************************************* 23 25 ! .... calcul des termes d'advection vertic.pour u,v,teta,q ... … … 25 27 ! ces termes sont ajoutes a du,dv,dteta et dq . 26 28 ! Modif F.Forget 03/94 : on retire q de advect 27 ! 29 28 30 !======================================================================= 29 31 !----------------------------------------------------------------------- … … 31 33 ! ------------- 32 34 33 INCLUDE "dimensions.h" 34 INCLUDE "paramet.h" 35 36 35 37 36 38 ! Arguments: … … 230 232 231 233 ! IF( conser) THEN 232 ! 234 233 235 ! DO 17 ij = 1,ip1jmp1 234 236 ! ge(ij) = wsur2(ij) * wsur2(ij) * unsaire2(ij) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/advect_new_mod.F90
r1907 r5159 17 17 USE allocate_field_mod 18 18 USE parallel_lmdz 19 USE dimensions_mod 19 USE lmdz_dimensions 20 USE lmdz_paramet 20 21 IMPLICIT NONE 21 22 TYPE(distrib),POINTER :: d -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/advtrac_loc.f90
r5136 r5159 24 24 USE lmdz_comgeom2 25 25 26 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 27 USE lmdz_paramet 26 28 IMPLICIT NONE 27 29 28 INCLUDE "dimensions.h" 29 INCLUDE "paramet.h" 30 31 30 32 31 33 !--------------------------------------------------------------------------- -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/advtrac_mod.F90
r4050 r5159 10 10 USE parallel_lmdz 11 11 USE vlspltgen_mod 12 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 13 USE lmdz_paramet 12 14 IMPLICIT NONE 13 INCLUDE "dimensions.h" 14 INCLUDE "paramet.h" 15 16 15 17 TYPE(distrib),POINTER :: d 16 18 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/allocate_field_mod.F90
r5082 r5159 158 158 SUBROUTINE allocate1d_u2d(field,d) 159 159 USE parallel_lmdz 160 USE dimensions_mod 160 USE lmdz_dimensions 161 USE lmdz_paramet 161 162 IMPLICIT NONE 162 163 REAL,POINTER :: field(:,:) … … 175 176 SUBROUTINE allocate2d_u2d(field,dim1,d) 176 177 USE parallel_lmdz 177 USE dimensions_mod 178 USE lmdz_dimensions 179 USE lmdz_paramet 178 180 IMPLICIT NONE 179 181 REAL,POINTER :: field(:,:,:) … … 192 194 SUBROUTINE allocate3d_u2d(field,dim1,dim2,d) 193 195 USE parallel_lmdz 194 USE dimensions_mod 196 USE lmdz_dimensions 197 USE lmdz_paramet 195 198 IMPLICIT NONE 196 199 REAL,POINTER :: field(:,:,:,:) … … 211 214 SUBROUTINE allocate1d_v2d(field,d) 212 215 USE parallel_lmdz 213 USE dimensions_mod 216 USE lmdz_dimensions 217 USE lmdz_paramet 214 218 IMPLICIT NONE 215 219 REAL,POINTER :: field(:,:) … … 228 232 SUBROUTINE allocate2d_v2d(field,dim1,d) 229 233 USE parallel_lmdz 230 USE dimensions_mod 234 USE lmdz_dimensions 235 USE lmdz_paramet 231 236 IMPLICIT NONE 232 237 REAL,POINTER :: field(:,:,:) … … 245 250 SUBROUTINE allocate3d_v2d(field,dim1,dim2,d) 246 251 USE parallel_lmdz 247 USE dimensions_mod 252 USE lmdz_dimensions 253 USE lmdz_paramet 248 254 IMPLICIT NONE 249 255 REAL,POINTER :: field(:,:,:,:) … … 511 517 USE parallel_lmdz 512 518 USE mod_hallo 513 USE dimensions_mod 519 USE lmdz_dimensions 520 USE lmdz_paramet 514 521 IMPLICIT NONE 515 522 REAL,POINTER :: field(:,:) … … 548 555 USE parallel_lmdz 549 556 USE mod_hallo 550 USE dimensions_mod 557 USE lmdz_dimensions 558 USE lmdz_paramet 551 559 IMPLICIT NONE 552 560 REAL,POINTER :: field(:,:,:) … … 585 593 USE parallel_lmdz 586 594 USE mod_hallo 587 USE dimensions_mod 595 USE lmdz_dimensions 596 USE lmdz_paramet 588 597 IMPLICIT NONE 589 598 REAL,POINTER :: field(:,:,:,:) … … 625 634 USE parallel_lmdz 626 635 USE mod_hallo 627 USE dimensions_mod 636 USE lmdz_dimensions 637 USE lmdz_paramet 628 638 IMPLICIT NONE 629 639 REAL,POINTER :: field(:,:) … … 662 672 USE parallel_lmdz 663 673 USE mod_hallo 664 USE dimensions_mod 674 USE lmdz_dimensions 675 USE lmdz_paramet 665 676 IMPLICIT NONE 666 677 REAL,POINTER :: field(:,:,:) … … 699 710 USE parallel_lmdz 700 711 USE mod_hallo 701 USE dimensions_mod 712 USE lmdz_dimensions 713 USE lmdz_paramet 702 714 IMPLICIT NONE 703 715 REAL,POINTER :: field(:,:,:,:) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/bands.F90
r5158 r5159 42 42 SUBROUTINE Read_distrib 43 43 USE parallel_lmdz 44 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 44 45 IMPLICIT NONE 45 46 46 INCLUDE "dimensions.h" 47 47 48 INTEGER :: i,j 48 49 CHARACTER (LEN=4) :: siim,sjjm,sllm,sproc … … 104 105 SUBROUTINE Set_Bands 105 106 USE parallel_lmdz 107 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 106 108 IMPLICIT NONE 107 INCLUDE 'dimensions.h' 109 108 110 INTEGER :: i, ij 109 111 INTEGER :: jj_para_begin(0:mpi_size-1) … … 437 439 SUBROUTINE WriteBands 438 440 USE parallel_lmdz 441 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 439 442 IMPLICIT NONE 440 INCLUDE "dimensions.h" 443 441 444 442 445 INTEGER :: i,j -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/bernoui_loc.f90
r5134 r5159 2 2 USE parallel_lmdz 3 3 USE lmdz_filtreg_p 4 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 5 USE lmdz_paramet 4 6 IMPLICIT NONE 5 7 6 8 !======================================================================= 7 ! 9 8 10 ! Auteur: P. Le Van 9 11 ! ------- 10 ! 12 11 13 ! Objet: 12 14 ! ------ … … 14 16 ! phi et ecin sont des arguments d'entree pour le s-pg ....... 15 17 ! bern est un argument de sortie pour le s-pg ...... 16 ! 18 17 19 ! fonction de Bernouilli = bern = filtre de( geopotentiel + 18 20 ! energ.cinet.) 19 ! 21 20 22 !======================================================================= 21 ! 23 22 24 !----------------------------------------------------------------------- 23 25 ! Decalrations: 24 26 ! ------------- 25 27 ! 26 INCLUDE "dimensions.h" 27 INCLUDE "paramet.h" 28 ! 28 29 30 29 31 ! Arguments: 30 32 ! ---------- 31 ! 33 32 34 INTEGER :: nlay,ngrid 33 35 REAL :: pphi(ijb_u:ije_u,nlay),pecin(ijb_u:ije_u,nlay) 34 36 REAL :: pbern(ijb_u:ije_u,nlay) 35 ! 37 36 38 ! Local: 37 39 ! ------ 38 ! 40 39 41 INTEGER :: ij,l,ijb,ije,jjb,jje 40 ! 42 41 43 !----------------------------------------------------------------------- 42 44 ! calcul de Bernouilli: 43 45 ! --------------------- 44 ! 46 45 47 ijb=ij_begin 46 48 ije=ij_end+iip1 … … 60 62 ENDDO 61 63 !$OMP END DO NOWAIT 62 ! 64 63 65 !----------------------------------------------------------------------- 64 66 ! filtre: … … 69 71 CALL filtreg_p( pbern,jjb_u,jje_u,jjb,jje, jjp1, llm, & 70 72 2,1, .TRUE., 1 ) 71 ! 73 72 74 !----------------------------------------------------------------------- 73 75 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/bilan_dyn_loc.f90
r5158 r5159 21 21 USE lmdz_comgeom2 22 22 23 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 24 USE lmdz_paramet 23 25 IMPLICIT NONE 24 26 25 INCLUDE "dimensions.h" 26 INCLUDE "paramet.h" 27 28 27 29 28 30 !==================================================================== 29 ! 31 30 32 ! Sous-programme consacre à des diagnostics dynamiques de base 31 ! 32 ! 33 34 33 35 ! De facon generale, les moyennes des scalaires Q sont ponderees par 34 36 ! la masse. 35 ! 37 36 38 ! Les flux de masse sont eux simplement moyennes. 37 ! 39 38 40 !==================================================================== 39 41 … … 145 147 146 148 ! Variables locales 147 ! 149 148 150 INTEGER :: tau0 149 151 REAL :: zjulian … … 152 154 INTEGER :: ii,jj 153 155 INTEGER :: zan, dayref 154 ! 156 155 157 REAL,SAVE,ALLOCATABLE :: rlong(:),rlatg(:) 156 158 INTEGER :: jjb,jje,jjn,ijb,ije … … 287 289 bilan_dyn_domain_id) 288 290 289 ! 291 290 292 ! Appel a histvert pour la grille verticale 291 ! 293 292 294 CALL histvert(fileid, 'presnivs', 'Niveaux sigma','mb', & 293 295 llm, presnivs, zvertiid) 294 ! 296 295 297 ! Appels a histdef pour la definition des variables a sauvegarder 296 298 DO iQ=1,nQ … … 403 405 ! Cumul 404 406 !===================================================================== 405 ! 407 406 408 IF(icum==0) THEN 407 409 jjb=jj_begin … … 689 691 ! calcul de la moyenne zonale du transport : 690 692 ! ------------------------------------------ 691 ! 693 692 694 ! -- 693 695 ! TOT : la circulation totale [ vq ] 694 ! 696 695 697 ! - - 696 698 ! MMC : mean meridional circulation [ v ] [ q ] 697 ! 699 698 700 ! ---- -- - - 699 701 ! TRS : transitoires [ v'q'] = [ vq ] - [ v q ] 700 ! 702 701 703 ! - * - * - - - - 702 704 ! STT : stationaires [ v q ] = [ v q ] - [ v ] [ q ] 703 ! 705 704 706 ! - - 705 707 ! on utilise aussi l'intermediaire TMP : [ v q ] 706 ! 708 707 709 ! la variable zfactv transforme un transport meridien cumule 708 710 ! en kg/s * unte-du-champ-transporte en m/s * unite-du-champ-transporte 709 ! 711 710 712 ! -------------------------------------------------------------- 711 713 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/caladvtrac_loc.f90
r5134 r5159 1 1 ! $Id: caladvtrac_p.F 1299 2010-01-20 14:27:21Z fairhead $ 2 2 3 ! 4 ! 3 4 5 5 SUBROUTINE caladvtrac_loc(q, pbaru, pbarv, & 6 6 p, masse, dq, teta, & … … 17 17 USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO 18 18 19 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 20 USE lmdz_paramet 19 21 IMPLICIT NONE 20 ! 22 21 23 ! Auteurs: F.Hourdin , P.Le Van, F.Forget, F.Codron 22 ! 24 23 25 ! F.Codron (10/99) : ajout humidite specifique pour eau vapeur 24 26 !======================================================================= 25 ! 27 26 28 ! Shema de Van Leer 27 ! 29 28 30 !======================================================================= 29 31 30 INCLUDE "dimensions.h" 31 INCLUDE "paramet.h" 32 33 32 34 33 35 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/caladvtrac_mod.F90
r5101 r5159 34 34 USE advtrac_mod, ONLY: advtrac_allocate 35 35 USE groupe_mod 36 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 37 USE lmdz_paramet 36 38 IMPLICIT NONE 37 INCLUDE "dimensions.h" 38 INCLUDE "paramet.h" 39 40 39 41 TYPE(distrib),POINTER :: d 40 42 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/caldyn_loc.f90
r5136 r5159 12 12 USE lmdz_comgeom 13 13 14 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 15 USE lmdz_paramet 14 16 IMPLICIT NONE 15 17 … … 30 32 ! ---------------- 31 33 32 INCLUDE "dimensions.h" 33 INCLUDE "paramet.h" 34 35 34 36 35 37 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/caldyn_mod.F90
r5101 r5159 22 22 USE allocate_field_mod 23 23 USE parallel_lmdz 24 USE dimensions_mod 24 USE lmdz_dimensions 25 USE lmdz_paramet 25 26 USE advect_new_mod,ONLY: advect_new_allocate 26 27 IMPLICIT NONE -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/call_dissip_mod.f90
r5136 r5159 23 23 USE allocate_field_mod 24 24 USE parallel_lmdz 25 USE dimensions_mod 25 USE lmdz_dimensions 26 USE lmdz_paramet 26 27 USE dissip_mod, ONLY: dissip_allocate 27 28 IMPLICIT NONE … … 77 78 78 79 SUBROUTINE call_dissip(ucov_dyn, vcov_dyn, teta_dyn, p_dyn, pk_dyn, ps_dyn) 79 USE dimensions_mod 80 USE lmdz_dimensions 81 USE lmdz_paramet 80 82 USE parallel_lmdz 81 83 USE times -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/check_isotopes_loc.F90
r5134 r5159 6 6 7 7 8 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 8 9 IMPLICIT NONE 9 INCLUDE "dimensions.h" 10 10 11 REAL, INTENT(INOUT) :: q(ijb_u:ije_u,llm,nqtot) 11 12 INTEGER, INTENT(IN) :: ijb, ije !--- Can be local and different from ijb_u,ije_u, for example in qminimum -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/conf_gcm.F90
r5134 r5159 25 25 tetagrot, tetatemp, coefdis, vert_prof_dissip 26 26 27 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 28 USE lmdz_paramet 27 29 IMPLICIT NONE 28 30 !----------------------------------------------------------------------- … … 32 34 33 35 ! tapedef : 34 ! etatinit : = TRUE , on ne compare pas les valeurs des para- 36 ! etatinit : = TRUE , on ne compare pas les valeurs des para- 35 37 ! -metres du zoom avec celles lues sur le fichier start . 36 38 … … 40 42 ! Declarations : 41 43 ! -------------- 42 INCLUDE "dimensions.h" 43 INCLUDE "paramet.h" 44 45 44 46 45 47 ! local: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/convflu_loc.f90
r5136 r5159 1 1 SUBROUTINE convflu_loc( xflu,yflu,nbniv,convfl ) 2 ! 2 3 3 ! P. Le Van 4 ! 5 ! 4 5 6 6 ! ******************************************************************* 7 7 ! ... calcule la (convergence horiz. * aire locale)du flux ayant pour … … 10 10 ! xflu , yflu et nbniv sont des arguments d'entree pour le s-pg .. 11 11 ! convfl est un argument de sortie pour le s-pg . 12 ! 12 13 13 ! njxflu est le nombre de lignes de latitude de xflu, 14 14 ! ( = jjm ou jjp1 ) 15 15 ! nbniv est le nombre de niveaux vert. de xflu et de yflu . 16 ! 16 17 17 USE parallel_lmdz 18 18 USE lmdz_ssum_scopy, ONLY: ssum 19 19 USE lmdz_comgeom 20 20 21 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 22 USE lmdz_paramet 21 23 IMPLICIT NONE 22 24 ! 23 INCLUDE "dimensions.h" 24 INCLUDE "paramet.h" 25 26 25 27 REAL :: xflu,yflu,convfl,convpn,convps 26 28 INTEGER :: l,ij,nbniv 27 29 DIMENSION xflu( ijb_u:ije_u,nbniv ),yflu( ijb_v:ije_v,nbniv ) , & 28 30 convfl( ijb_u:ije_u,nbniv ) 29 ! 31 30 32 INTEGER :: ijb,ije 31 33 32 34 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 33 35 DO l = 1,nbniv 34 ! 36 35 37 ijb=ij_begin 36 38 ije=ij_end+iip1 … … 43 45 yflu(ij +1,l ) - yflu( ij -iim,l ) 44 46 END DO 45 ! 47 46 48 ! 47 49 48 50 ! .... correction pour convfl( 1,j,l) ...... 49 51 ! .... convfl(1,j,l)= convfl(iip1,j,l) ... 50 ! 52 51 53 !DIR$ IVDEP 52 54 DO ij = ijb,ije,iip1 53 55 convfl( ij,l ) = convfl( ij + iim,l ) 54 56 END DO 55 ! 57 56 58 ! ...... calcul aux poles ....... 57 ! 59 58 60 IF (pole_nord) THEN 59 61 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/convmas1_loc.F90
r5136 r5159 10 10 USE lmdz_comgeom 11 11 12 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 13 USE lmdz_paramet 12 14 IMPLICIT NONE 13 INCLUDE "dimensions.h" 14 INCLUDE "paramet.h" 15 16 15 17 !=============================================================================== 16 18 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/convmas2_loc.F90
r5136 r5159 9 9 USE lmdz_comgeom 10 10 11 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 12 USE lmdz_paramet 11 13 IMPLICIT NONE 12 INCLUDE "dimensions.h" 13 INCLUDE "paramet.h" 14 15 14 16 !=============================================================================== 15 17 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/convmas_loc.F90
r5136 r5159 9 9 USE lmdz_comgeom 10 10 11 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 12 USE lmdz_paramet 11 13 IMPLICIT NONE 12 INCLUDE "dimensions.h" 13 INCLUDE "paramet.h" 14 15 14 16 !=============================================================================== 15 17 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/covcont_loc.f90
r5136 r5159 3 3 USE lmdz_comgeom 4 4 5 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 6 USE lmdz_paramet 5 7 IMPLICIT NONE 6 8 7 9 !======================================================================= 8 ! 10 9 11 ! Auteur: P. Le Van 10 12 ! ------- 11 ! 13 12 14 ! Objet: 13 15 ! ------ 14 ! 16 15 17 ! ********************************************************************* 16 18 ! calcul des compos. contravariantes a partir des comp.covariantes 17 19 ! ******************************************************************** 18 ! 20 19 21 !======================================================================= 20 22 21 INCLUDE "dimensions.h" 22 INCLUDE "paramet.h" 23 24 23 25 24 26 INTEGER :: klevel -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/covnat_loc.f90
r5136 r5159 6 6 USE lmdz_comgeom 7 7 8 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 9 USE lmdz_paramet 8 10 IMPLICIT NONE 9 11 10 12 !======================================================================= 11 ! 13 12 14 ! Auteur: F Hourdin Phu LeVan 13 15 ! ------- 14 ! 16 15 17 ! Objet: 16 18 ! ------ 17 ! 19 18 20 ! ********************************************************************* 19 21 ! calcul des compos. naturelles a partir des comp.covariantes 20 22 ! ******************************************************************** 21 ! 23 22 24 !======================================================================= 23 25 24 INCLUDE "dimensions.h" 25 INCLUDE "paramet.h" 26 27 26 28 27 29 INTEGER :: klevel -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dissip_loc.f90
r5136 r5159 2 2 3 3 SUBROUTINE dissip_loc(vcov, ucov, teta, p, dv, du, dh) 4 ! 4 5 5 USE parallel_lmdz 6 6 USE write_field_loc … … 13 13 USE lmdz_comgeom 14 14 15 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 16 USE lmdz_paramet 15 17 IMPLICIT NONE 16 18 … … 20 22 21 23 !======================================================================= 22 ! 24 23 25 ! Auteur: P. Le Van 24 26 ! ------- 25 ! 27 26 28 ! Objet: 27 29 ! ------ 28 ! 30 29 31 ! Dissipation horizontale 30 ! 32 31 33 !======================================================================= 32 34 !----------------------------------------------------------------------- … … 34 36 ! ------------- 35 37 36 INCLUDE "dimensions.h" 37 INCLUDE "paramet.h" 38 39 38 40 39 41 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dissip_mod.F90
r5101 r5159 9 9 USE allocate_field_mod 10 10 USE parallel_lmdz 11 USE dimensions_mod 11 USE lmdz_dimensions 12 USE lmdz_paramet 12 13 USE gradiv2_mod, ONLY: gradiv2_allocate 13 14 USE nxgraro2_mod, ONLY: nxgraro2_allocate -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/diverg_gam_loc.f90
r5140 r5159 1 1 SUBROUTINE diverg_gam_loc(klevel,cuvscvgam,cvuscugam,unsairegam, & 2 2 unsapolnga,unsapolsga, x, y, div ) 3 ! 3 4 4 ! P. Le Van 5 ! 5 6 6 ! ********************************************************************* 7 7 ! ... calcule la divergence a tous les niveaux d'1 vecteur de compos. … … 13 13 USE lmdz_comgeom 14 14 15 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 16 USE lmdz_paramet 15 17 IMPLICIT NONE 16 ! 18 17 19 ! x et y sont des arguments d'entree pour le s-prog 18 20 ! div est un argument de sortie pour le s-prog 19 21 20 INCLUDE "dimensions.h" 21 INCLUDE "paramet.h" 22 ! 22 23 24 23 25 ! .......... variables en arguments ................... 24 ! 26 25 27 INTEGER :: klevel 26 28 REAL :: x( ijb_u:ije_u,klevel ),y( ijb_v:ije_v,klevel ) … … 28 30 REAL :: cuvscvgam(ip1jm),cvuscugam(ip1jmp1),unsairegam(ip1jmp1) 29 31 REAL :: unsapolnga,unsapolsga 30 ! 32 31 33 ! ............... variables locales ......................... 32 34 … … 36 38 ! ................................................................... 37 39 INTEGER :: ijb,ije,jjb,jje 38 ! 39 ! 40 41 40 42 ijb=ij_begin 41 43 ije=ij_end … … 45 47 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 46 48 DO l = 1,klevel 47 ! 49 48 50 DO ij = ijb, ije - 1 49 51 div( ij + 1, l ) = ( & … … 52 54 unsairegam( ij+1 ) 53 55 ENDDO 54 ! 56 55 57 ! .... correction pour div( 1,j,l) ...... 56 58 ! .... div(1,j,l)= div(iip1,j,l) .... 57 ! 59 58 60 !DIR$ IVDEP 59 61 DO ij = ijb,ije,iip1 60 62 div( ij,l ) = div( ij + iim,l ) 61 63 ENDDO 62 ! 64 63 65 ! .... calcul aux poles ..... 64 ! 66 65 67 IF (pole_nord) THEN 66 68 DO ij = 1,iim … … 68 70 ENDDO 69 71 sumypn = SSUM ( iim,aiy1,1 ) * unsapolnga 70 ! 72 71 73 DO ij = 1,iip1 72 74 div( ij , l ) = - sumypn … … 79 81 ENDDO 80 82 sumyps = SSUM ( iim,aiy2,1 ) * unsapolsga 81 ! 83 82 84 DO ij = 1,iip1 83 85 div( ij + ip1jm, l ) = sumyps -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/diverg_p.f90
r5140 r5159 1 1 SUBROUTINE diverg_p(klevel,x,y,div) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! ********************************************************************* 6 6 ! ... calcule la divergence a tous les niveaux d'1 vecteur de compos. … … 12 12 USE lmdz_comgeom 13 13 14 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 15 USE lmdz_paramet 14 16 IMPLICIT NONE 15 ! 17 16 18 ! x et y sont des arguments d'entree pour le s-prog 17 19 ! div est un argument de sortie pour le s-prog 18 20 ! 19 21 20 INCLUDE "dimensions.h" 21 INCLUDE "paramet.h" 22 ! 22 23 24 23 25 ! .......... variables en arguments ................... 24 ! 26 25 27 INTEGER :: klevel 26 28 REAL :: x( ip1jmp1,klevel ),y( ip1jm,klevel ),div( ip1jmp1,klevel ) 27 29 INTEGER :: l,ij 28 ! 30 29 31 ! ............... variables locales ......................... 30 32 … … 33 35 INTEGER :: ijb,ije 34 36 ! ................................................................... 35 ! 36 ! 37 38 37 39 ijb=ij_begin 38 40 ije=ij_end … … 42 44 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 43 45 DO l = 1,klevel 44 ! 46 45 47 DO ij = ijb, ije - 1 46 48 div( ij + 1, l ) = & … … 48 50 cuvsurcv(ij-iim) * y(ij-iim,l) - cuvsurcv(ij+1) * y(ij+1,l) 49 51 ENDDO 50 ! 52 51 53 ! .... correction pour div( 1,j,l) ...... 52 54 ! .... div(1,j,l)= div(iip1,j,l) .... 53 ! 55 54 56 !DIR$ IVDEP 55 57 DO ij = ijb,ije,iip1 56 58 div( ij,l ) = div( ij + iim,l ) 57 59 ENDDO 58 ! 60 59 61 ! .... calcul aux poles ..... 60 ! 62 61 63 IF (pole_nord) THEN 62 64 DO ij = 1,iim … … 64 66 ENDDO 65 67 sumypn = SSUM ( iim,aiy1,1 ) / apoln 66 ! 68 67 69 DO ij = 1,iip1 68 70 div( ij , l ) = - sumypn … … 75 77 ENDDO 76 78 sumyps = SSUM ( iim,aiy2,1 ) / apols 77 ! 79 78 80 DO ij = 1,iip1 79 81 div( ij + ip1jm, l ) = sumyps … … 88 90 !cc CALL filtreg( div, jjp1, klevel, 2, 2, .TRUE., 1 ) 89 91 90 ! 92 91 93 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 92 94 DO l = 1, klevel -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/divergf_loc.f90
r5140 r5159 1 1 SUBROUTINE divergf_loc(klevel,x,y,div) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! ********************************************************************* 6 6 ! ... calcule la divergence a tous les niveaux d'1 vecteur de compos. … … 13 13 USE lmdz_comgeom 14 14 15 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 16 USE lmdz_paramet 15 17 IMPLICIT NONE 16 ! 18 17 19 ! x et y sont des arguments d'entree pour le s-prog 18 20 ! div est un argument de sortie pour le s-prog 19 21 ! 20 INCLUDE "dimensions.h" 21 INCLUDE "paramet.h" 22 ! 22 23 24 23 25 ! .......... variables en arguments ................... 24 ! 26 25 27 INTEGER :: klevel 26 28 REAL :: x( ijb_u:ije_u,klevel ),y( ijb_v:ije_v,klevel ) 27 29 REAL :: div( ijb_u:ije_u,klevel ) 28 30 INTEGER :: l,ij 29 ! 31 30 32 ! ............... variables locales ......................... 31 33 … … 34 36 ! ................................................................... 35 37 INTEGER :: ijb,ije,jjb,jje 36 ! 37 ! 38 39 38 40 ijb=ij_begin 39 41 ije=ij_end … … 43 45 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 44 46 DO l = 1,klevel 45 ! 47 46 48 DO ij = ijb, ije - 1 47 49 div( ij + 1, l ) = & … … 50 52 ENDDO 51 53 52 ! 54 53 55 ! .... correction pour div( 1,j,l) ...... 54 56 ! .... div(1,j,l)= div(iip1,j,l) .... 55 ! 57 56 58 !DIR$ IVDEP 57 59 DO ij = ijb,ije,iip1 58 60 div( ij,l ) = div( ij + iim,l ) 59 61 ENDDO 60 ! 62 61 63 ! .... calcul aux poles ..... 62 ! 64 63 65 IF (pole_nord) THEN 64 66 DO ij = 1,iim … … 67 69 sumypn = SSUM ( iim,aiy1,1 ) / apoln 68 70 69 ! 71 70 72 DO ij = 1,iip1 71 73 div( ij , l ) = - sumypn … … 79 81 ENDDO 80 82 sumyps = SSUM ( iim,aiy2,1 ) / apols 81 ! 83 82 84 DO ij = 1,iip1 83 85 div( ij + ip1jm, l ) = sumyps … … 89 91 !$OMP END DO NOWAIT 90 92 91 ! 93 92 94 jjb=jj_begin 93 95 jje=jj_end … … 97 99 klevel, 2, 2, .TRUE., 1 ) 98 100 99 ! 101 100 102 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 101 103 DO l = 1, klevel -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/divgrad2_loc.f90
r5136 r5159 1 1 SUBROUTINE divgrad2_loc( klevel, h, deltapres, lh, divgra_out ) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! *************************************************************** 6 ! 6 7 7 ! ..... calcul de (div( grad )) de ( pext * h ) ..... 8 8 ! **************************************************************** 9 9 ! h ,klevel,lh et pext sont des arguments d'entree pour le s-prg 10 10 ! divgra est un argument de sortie pour le s-prg 11 ! 11 12 12 USE parallel_lmdz 13 13 USE times … … 17 17 USE lmdz_comgeom2 18 18 19 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 20 USE lmdz_paramet 19 21 IMPLICIT NONE 20 22 ! 21 INCLUDE "dimensions.h" 22 INCLUDE "paramet.h" 23 24 23 25 24 26 ! ....... variables en arguments ....... 25 ! 27 26 28 INTEGER :: klevel 27 29 REAL :: h( ijb_u:ije_u,klevel ), deltapres( ijb_u:ije_u,klevel ) 28 30 REAL :: divgra_out( ijb_u:ije_u,klevel) 29 31 ! ....... variables locales .......... 30 ! 32 31 33 REAL :: signe, nudivgrs, sqrtps( ijb_u:ije_u,llm ) 32 34 INTEGER :: l,ij,iter,lh … … 36 38 INTEGER :: ijb,ije 37 39 38 ! 39 ! 40 41 40 42 signe = (-1.)**lh 41 43 nudivgrs = signe * cdivh … … 49 51 ENDDO 50 52 !$OMP END DO NOWAIT 51 ! 53 52 54 !$OMP BARRIER 53 55 CALL Register_Hallo_u(divgra,llm,1,1,1,1,Request_dissip) … … 67 69 !$OMP END DO NOWAIT 68 70 69 ! 71 70 72 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 71 73 DO l = 1, klevel … … 77 79 78 80 ! ........ Iteration de l'operateur laplacien_gam ........ 79 ! 81 80 82 DO iter = 1, lh - 2 81 83 !$OMP BARRIER … … 91 93 unsapolnga2, unsapolsga2, divgra, divgra ) 92 94 ENDDO 93 ! 95 94 96 ! ............................................................... 95 97 … … 101 103 ENDDO 102 104 !$OMP END DO NOWAIT 103 ! 105 104 106 !$OMP BARRIER 105 107 CALL Register_Hallo_u(divgra,llm,1,1,1,1,Request_dissip) … … 110 112 111 113 CALL laplacien_loc ( klevel, divgra, divgra ) 112 ! 114 113 115 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 114 116 DO l = 1,klevel -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/divgrad2_mod.F90
r1907 r5159 9 9 USE allocate_field_mod 10 10 USE parallel_lmdz 11 USE dimensions_mod 11 USE lmdz_dimensions 12 USE lmdz_paramet 12 13 IMPLICIT NONE 13 14 TYPE(distrib),POINTER :: d -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dteta1_loc.f90
r5158 r5159 3 3 USE write_field_p 4 4 USE lmdz_filtreg_p 5 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 6 USE lmdz_paramet 5 7 IMPLICIT NONE 6 8 7 9 !======================================================================= 8 ! 10 9 11 ! Auteur: P. Le Van 10 12 ! ------- 11 13 ! Modif F.Forget 03/94 (on retire q et dq pour construire dteta1) 12 ! 14 13 15 ! ******************************************************************** 14 16 ! ... calcul du terme de convergence horizontale du flux d'enthalpie … … 17 19 ! .. teta,pbaru et pbarv sont des arguments d'entree pour le s-pg .... 18 20 ! dteta sont des arguments de sortie pour le s-pg .... 19 ! 21 20 22 !======================================================================= 21 23 22 24 23 INCLUDE "dimensions.h" 24 INCLUDE "paramet.h" 25 26 25 27 26 28 REAL :: teta( ijb_u:ije_u,llm ) … … 31 33 REAL :: hbyv( ijb_v:ije_v,llm ), hbxu( ijb_u:ije_u,llm ) 32 34 33 ! 35 34 36 INTEGER :: ijb,ije,jjb,jje 35 37 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dudv1_loc.f90
r5117 r5159 1 1 SUBROUTINE dudv1_loc( vorpot, pbaru, pbarv, du, dv ) 2 2 USE parallel_lmdz 3 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 4 USE lmdz_paramet 3 5 IMPLICIT NONE 4 ! 6 5 7 !----------------------------------------------------------------------- 6 ! 8 7 9 ! Auteur: P. Le Van 8 10 ! ------- 9 ! 11 10 12 ! Objet: 11 13 ! ------ … … 14 16 ! vorpot, pbaru et pbarv sont des arguments d'entree pour le s-pg .. 15 17 ! du et dv sont des arguments de sortie pour le s-pg .. 16 ! 18 17 19 !----------------------------------------------------------------------- 18 20 19 INCLUDE "dimensions.h" 20 INCLUDE "paramet.h" 21 22 21 23 22 24 REAL :: vorpot( ijb_v:ije_v,llm ) ,pbaru( ijb_u:ije_u,llm ) , & … … 24 26 REAL :: du( ijb_u:ije_u,llm ) ,dv( ijb_v:ije_v,llm ) 25 27 INTEGER :: l,ij,ijb,ije 26 ! 28 27 29 ! 28 30 29 31 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 30 32 DO l = 1,llm 31 ! 33 32 34 ijb=ij_begin 33 35 ije=ij_end … … 43 45 44 46 45 ! 47 46 48 IF (pole_nord) ijb=ij_begin 47 49 … … 51 53 pbaru(ij+iip1, l) + pbaru(ij+iip2, l) ) 52 54 END DO 53 ! 55 54 56 ! .... correction pour dv( 1,j,l ) ..... 55 57 ! .... dv(1,j,l)= dv(iip1,j,l) .... 56 ! 58 57 59 !DIR$ IVDEP 58 60 DO ij = ijb, ije, iip1 59 61 dv( ij,l ) = dv( ij + iim, l ) 60 62 END DO 61 ! 63 62 64 END DO 63 65 !$OMP END DO NOWAIT -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dudv2_loc.f90
r5134 r5159 1 1 SUBROUTINE dudv2_loc( teta, pkf, bern, du, dv ) 2 2 USE parallel_lmdz 3 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 4 USE lmdz_paramet 3 5 IMPLICIT NONE 4 ! 6 5 7 !======================================================================= 6 ! 8 7 9 ! Auteur: P. Le Van 8 10 ! ------- 9 ! 11 10 12 ! Objet: 11 13 ! ------ 12 ! 14 13 15 ! ***************************************************************** 14 16 ! ..... calcul du terme de pression (gradient de p/densite ) et … … 16 18 ! ***************************************************************** 17 19 ! Ces termes sont ajoutes a d(ucov)/dt et a d(vcov)/dt .. 18 ! 19 ! 20 21 20 22 ! teta , pkf, bern sont des arguments d'entree pour le s-pg .... 21 23 ! du et dv sont des arguments de sortie pour le s-pg .... 22 ! 24 23 25 !======================================================================= 24 26 ! 25 INCLUDE "dimensions.h" 26 INCLUDE "paramet.h" 27 28 27 29 28 30 REAL :: teta( ijb_u:ije_u,llm ),pkf( ijb_u:ije_u,llm ) … … 30 32 REAL :: du( ijb_u:ije_u,llm ), dv( ijb_v:ije_v,llm ) 31 33 INTEGER :: l,ij,ijb,ije 32 ! 33 ! 34 35 34 36 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 35 37 DO l = 1,llm 36 ! 38 37 39 ijb=ij_begin 38 40 ije=ij_end … … 44 46 ( pkf( ij,l ) - pkf(ij+1,l) ) + bern(ij,l) - bern(ij+1,l) 45 47 END DO 46 ! 47 ! 48 49 48 50 ! ..... correction pour du(iip1,j,l), j=2,jjm ...... 49 51 ! ... du(iip1,j,l) = du(1,j,l) ... 50 ! 52 51 53 !DIR$ IVDEP 52 54 DO ij = ijb+iip1-1, ije, iip1 53 55 du( ij,l ) = du( ij - iim,l ) 54 56 END DO 55 ! 56 ! 57 58 57 59 IF (pole_nord) ijb=ijb-iip1 58 60 … … 62 64 + bern( ij+iip1,l ) - bern( ij ,l ) 63 65 END DO 64 ! 66 65 67 END DO 66 68 !$OMP END DO NOWAIT -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dynetat0_loc.F90
r5136 r5159 25 25 USE lmdz_comgeom 26 26 27 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 28 USE lmdz_paramet 27 29 IMPLICIT NONE 28 INCLUDE "dimensions.h" 29 INCLUDE "paramet.h" 30 31 30 32 !=============================================================================== 31 33 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dynredem_loc.F90
r5136 r5159 25 25 USE lmdz_comgeom 26 26 27 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 28 USE lmdz_paramet 27 29 IMPLICIT NONE 28 INCLUDE "dimensions.h" 29 INCLUDE "paramet.h" 30 31 30 32 !=============================================================================== 31 33 ! Arguments: … … 178 180 USE lmdz_comgeom 179 181 182 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 183 USE lmdz_paramet 180 184 IMPLICIT NONE 181 INCLUDE "dimensions.h" 182 INCLUDE "paramet.h" 185 186 183 187 !=============================================================================== 184 188 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dynredem_mod.F90
r5128 r5159 1 1 MODULE dynredem_mod 2 2 3 USE dimensions_mod 3 USE lmdz_dimensions 4 USE lmdz_paramet 4 5 USE parallel_lmdz 5 6 USE mod_hallo -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/enercin_loc.F90
r5136 r5159 8 8 USE lmdz_comgeom 9 9 10 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 11 USE lmdz_paramet 10 12 IMPLICIT NONE 11 INCLUDE "dimensions.h" 12 INCLUDE "paramet.h" 13 14 13 15 !=============================================================================== 14 16 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/exner_hyb_loc_m.F90
r5136 r5159 39 39 USE lmdz_comgeom 40 40 41 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 42 USE lmdz_paramet 41 43 IMPLICIT NONE 42 44 43 INCLUDE "dimensions.h" 44 INCLUDE "paramet.h" 45 46 45 47 46 48 INTEGER ngrid -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/exner_milieu_loc_m.F90
r5136 r5159 35 35 USE lmdz_comgeom 36 36 37 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 38 USE lmdz_paramet 37 39 IMPLICIT NONE 38 40 39 INCLUDE "dimensions.h" 40 INCLUDE "paramet.h" 41 42 41 43 42 44 INTEGER ngrid -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/flumass_loc.F90
r5136 r5159 8 8 USE lmdz_comgeom 9 9 10 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 11 USE lmdz_paramet 10 12 IMPLICIT NONE 11 INCLUDE "dimensions.h" 12 INCLUDE "paramet.h" 13 14 13 15 !=============================================================================== 14 16 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/fluxstokenc_p.f90
r5137 r5159 1 1 ! $Id: caladvtrac_p.F 1299 2010-01-20 14:27:21Z fairhead $ 2 2 3 ! 4 ! 3 4 5 5 SUBROUTINE fluxstokenc_p(pbaru, pbarv, masse, teta, phi) 6 6 USE parallel_lmdz … … 14 14 USE lmdz_tracstoke 15 15 16 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 17 USE lmdz_paramet 16 18 IMPLICIT NONE 17 ! 19 18 20 ! Auteurs: F.Hourdin , P.Le Van, F.Forget, F.Codron 19 ! 20 !======================================================================= 21 ! 22 ! Shema de Van Leer 23 ! 21 24 22 !======================================================================= 25 23 26 INCLUDE "dimensions.h" 27 INCLUDE "paramet.h" 24 ! Shema de Van Leer 25 26 !======================================================================= 27 28 29 28 30 29 31 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/friction_loc.f90
r5158 r5159 11 11 USE lmdz_comgeom2 12 12 13 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 14 USE lmdz_paramet 13 15 IMPLICIT NONE 14 16 … … 25 27 !======================================================================= 26 28 27 INCLUDE "dimensions.h" 28 INCLUDE "paramet.h" 29 30 29 31 30 32 ! arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/gcm.F90
r5137 r5159 32 32 USE lmdz_tracstoke 33 33 34 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 35 USE lmdz_paramet 34 36 IMPLICIT NONE 35 37 36 38 ! ...... Version du 10/01/98 .......... 37 39 38 ! avec coordonnees verticales hybrides 40 ! avec coordonnees verticales hybrides 39 41 ! avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 ) 40 42 … … 63 65 ! Declarations: 64 66 ! ------------- 65 INCLUDE "dimensions.h" 66 INCLUDE "paramet.h" 67 68 67 69 68 70 REAL zdtvr -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/geopot_loc.f90
r5134 r5159 1 1 SUBROUTINE geopot_loc( ngrid, teta, pk, pks, phis, phi ) 2 2 USE parallel_lmdz 3 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 4 USE lmdz_paramet 3 5 IMPLICIT NONE 4 6 5 7 6 8 !======================================================================= 7 ! 9 8 10 ! Auteur: P. Le Van 9 11 ! ------- 10 ! 12 11 13 ! Objet: 12 14 ! ------ 13 ! 15 14 16 ! ******************************************************************* 15 17 ! .... calcul du geopotentiel aux milieux des couches ..... 16 18 ! ******************************************************************* 17 ! 19 18 20 ! .... l'integration se fait de bas en haut .... 19 ! 21 20 22 ! .. ngrid,teta,pk,pks,phis sont des argum. d'entree pour le s-pg .. 21 23 ! phi est un argum. de sortie pour le s-pg . 22 ! 24 23 25 !======================================================================= 24 26 !----------------------------------------------------------------------- … … 26 28 ! ------------- 27 29 28 INCLUDE "dimensions.h" 29 INCLUDE "paramet.h" 30 31 30 32 31 33 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/gr_u_scal_loc.f90
r5136 r5159 5 5 !%W% %G% 6 6 !======================================================================= 7 ! 7 8 8 ! Author: Frederic Hourdin original: 11/11/92 9 9 ! ------- 10 ! 10 11 11 ! Subject: 12 12 ! ------ 13 ! 13 14 14 ! Method: 15 15 ! -------- 16 ! 16 17 17 ! Interface: 18 18 ! ---------- 19 ! 19 20 20 ! Input: 21 21 ! ------ 22 ! 22 23 23 ! Output: 24 24 ! ------- 25 ! 25 26 26 !======================================================================= 27 27 USE parallel_lmdz 28 28 USE lmdz_comgeom 29 29 30 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 31 USE lmdz_paramet 30 32 IMPLICIT NONE 31 33 !----------------------------------------------------------------------- … … 33 35 ! --------------- 34 36 35 INCLUDE "dimensions.h" 36 INCLUDE "paramet.h" 37 38 37 39 38 40 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/gr_v_scal_loc.f90
r5136 r5159 5 5 !%W% %G% 6 6 !======================================================================= 7 ! 7 8 8 ! Author: Frederic Hourdin original: 11/11/92 9 9 ! ------- 10 ! 10 11 11 ! Subject: 12 12 ! ------ 13 ! 13 14 14 ! Method: 15 15 ! -------- 16 ! 16 17 17 ! Interface: 18 18 ! ---------- 19 ! 19 20 20 ! Input: 21 21 ! ------ 22 ! 22 23 23 ! Output: 24 24 ! ------- 25 ! 25 26 26 !======================================================================= 27 27 USE parallel_lmdz 28 28 USE lmdz_comgeom 29 29 30 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 31 USE lmdz_paramet 30 32 IMPLICIT NONE 31 33 !----------------------------------------------------------------------- … … 33 35 ! --------------- 34 36 35 INCLUDE "dimensions.h" 36 INCLUDE "paramet.h" 37 38 37 39 38 40 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/grad_loc.f90
r5117 r5159 1 1 SUBROUTINE grad_loc(klevel, pg,pgx,pgy ) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! ****************************************************************** 6 6 ! .. calcul des composantes covariantes en x et y du gradient de g 7 ! 7 8 8 ! ****************************************************************** 9 9 ! pg est un argument d'entree pour le s-prog 10 10 ! pgx et pgy sont des arguments de sortie pour le s-prog 11 ! 11 12 12 USE parallel_lmdz 13 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 14 USE lmdz_paramet 13 15 IMPLICIT NONE 14 16 ! 15 INCLUDE "dimensions.h" 16 INCLUDE "paramet.h" 17 18 17 19 INTEGER :: klevel 18 20 REAL :: pg( ijb_u:ije_u,klevel ) … … 20 22 INTEGER :: l,ij 21 23 INTEGER :: ijb,ije,jjb,jje 22 ! 23 ! 24 25 24 26 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 25 27 DO l = 1,klevel 26 ! 28 27 29 ijb=ij_begin 28 30 ije=ij_end … … 30 32 pgx( ij,l ) = pg( ij +1,l ) - pg( ij,l ) 31 33 END DO 32 ! 34 33 35 ! .... correction pour pgx(ip1,j,l) .... 34 36 ! ... pgx(iip1,j,l)= pgx(1,j,l) .... … … 37 39 pgx( ij,l ) = pgx( ij -iim,l ) 38 40 END DO 39 ! 41 40 42 ijb=ij_begin-iip1 41 43 ije=ij_end … … 46 48 pgy( ij,l ) = pg( ij,l ) - pg( ij +iip1,l ) 47 49 END DO 48 ! 50 49 51 END DO 50 52 !$OMP END DO NOWAIT -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/grad_p.f90
r5117 r5159 1 1 SUBROUTINE grad_p(klevel, pg,pgx,pgy ) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! ****************************************************************** 6 6 ! .. calcul des composantes covariantes en x et y du gradient de g 7 ! 7 8 8 ! ****************************************************************** 9 9 ! pg est un argument d'entree pour le s-prog 10 10 ! pgx et pgy sont des arguments de sortie pour le s-prog 11 ! 11 12 12 USE parallel_lmdz 13 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 14 USE lmdz_paramet 13 15 IMPLICIT NONE 14 16 ! 15 INCLUDE "dimensions.h" 16 INCLUDE "paramet.h" 17 18 17 19 INTEGER :: klevel 18 20 REAL :: pg( ip1jmp1,klevel ) … … 20 22 INTEGER :: l,ij 21 23 INTEGER :: ijb,ije,jjb,jje 22 ! 23 ! 24 25 24 26 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 25 27 DO l = 1,klevel 26 ! 28 27 29 ijb=ij_begin 28 30 ije=ij_end … … 30 32 pgx( ij,l ) = pg( ij +1,l ) - pg( ij,l ) 31 33 END DO 32 ! 34 33 35 ! .... correction pour pgx(ip1,j,l) .... 34 36 ! ... pgx(iip1,j,l)= pgx(1,j,l) .... … … 37 39 pgx( ij,l ) = pgx( ij -iim,l ) 38 40 END DO 39 ! 41 40 42 ijb=ij_begin-iip1 41 43 ije=ij_end … … 46 48 pgy( ij,l ) = pg( ij,l ) - pg( ij +iip1,l ) 47 49 END DO 48 ! 50 49 51 END DO 50 52 !$OMP END DO NOWAIT -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/gradiv2_loc.f90
r5136 r5159 1 1 SUBROUTINE gradiv2_loc(klevel, xcov, ycov, ld, gdx_out, gdy_out ) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! ********************************************************** 6 6 ! ld 7 7 ! calcul de (grad (div) ) du vect. v .... 8 ! 8 9 9 ! xcov et ycov etant les composant.covariantes de v 10 10 ! ********************************************************** 11 11 ! xcont , ycont et ld sont des arguments d'entree pour le s-prog 12 12 ! gdx et gdy sont des arguments de sortie pour le s-prog 13 ! 14 ! 13 14 15 15 USE parallel_lmdz 16 16 USE times … … 22 22 USE lmdz_comgeom 23 23 24 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 25 USE lmdz_paramet 24 26 IMPLICIT NONE 25 27 ! 26 INCLUDE "dimensions.h" 27 INCLUDE "paramet.h" 28 ! 28 29 30 29 31 ! ........ variables en arguments ........ 30 32 … … 32 34 REAL :: xcov( ijb_u:ije_u,klevel ), ycov( ijb_v:ije_v,klevel ) 33 35 REAL :: gdx_out( ijb_u:ije_u,klevel ), gdy_out( ijb_v:ije_v,klevel) 34 ! 36 35 37 ! ........ variables locales ......... 36 ! 38 37 39 REAL :: tmp_div2(ijb_u:ije_u,llm) 38 40 REAL :: signe, nugrads … … 42 44 !$OMP THREADPRIVATE(request_dissip) 43 45 ! ........................................................ 44 ! 45 ! 46 47 46 48 ! CALL SCOPY( ip1jmp1 * klevel, xcov, 1, gdx, 1 ) 47 49 ! CALL SCOPY( ip1jm * klevel, ycov, 1, gdy, 1 ) … … 72 74 CALL WaitRequest(Request_dissip) 73 75 !$OMP BARRIER 74 ! 75 ! 76 77 76 78 signe = (-1.)**ld 77 79 nugrads = signe * cdivu … … 127 129 CALL grad_loc( klevel, div, gdx, gdy ) 128 130 129 ! 131 130 132 ijb=ij_begin 131 133 ije=ij_end -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/gradiv2_mod.F90
r1907 r5159 11 11 USE allocate_field_mod 12 12 USE parallel_lmdz 13 USE dimensions_mod 13 USE lmdz_dimensions 14 USE lmdz_paramet 14 15 IMPLICIT NONE 15 16 TYPE(distrib),POINTER :: d -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/groupe_loc.f90
r5158 r5159 7 7 USE lmdz_comgeom2 8 8 9 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 10 USE lmdz_paramet 9 11 IMPLICIT NONE 10 12 … … 12 14 ! poles en "regroupant" les mailles 2 par 2 puis 4 par 4 etc. au fur 13 15 ! et a mesure qu'on se rapproche du pole. 14 ! 16 15 17 ! en entree: pext, pbaru et pbarv 16 ! 18 17 19 ! en sortie: pbarum,pbarvm et wm. 18 ! 20 19 21 ! remarque, le wm est recalcule a partir des pbaru pbarv et on n'a donc 20 22 ! pas besoin de w en entree. 21 23 22 INCLUDE "dimensions.h" 23 INCLUDE "paramet.h" 24 25 24 26 25 27 ! integer ngroup … … 46 48 CALL convflu_loc(pbaru, pbarv, llm, zconvm) 47 49 48 ! 50 49 51 ! CALL scopy(ijp1llm,zconvm,1,zconvmm,1) 50 52 ! CALL scopy(ijmllm,pbarv,1,pbarvm,1) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/groupe_mod.F90
r5101 r5159 12 12 ! USE infotrac 13 13 USE advtrac_mod, ONLY: advtrac_allocate 14 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 15 USE lmdz_paramet 14 16 IMPLICIT NONE 15 INCLUDE "dimensions.h" 16 INCLUDE "paramet.h" 17 18 17 19 TYPE(distrib),POINTER :: d 18 20 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/groupeun_loc.f90
r5136 r5159 5 5 USE lmdz_comgeom2 6 6 7 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 8 USE lmdz_paramet 7 9 IMPLICIT NONE 8 10 9 INCLUDE "dimensions.h" 10 INCLUDE "paramet.h" 11 12 11 13 12 14 INTEGER :: jjmax,llmax,sb,se,jjb,jje … … 140 142 USE lmdz_comgeom2 141 143 144 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 145 USE lmdz_paramet 142 146 IMPLICIT NONE 143 147 144 INCLUDE "dimensions.h" 145 INCLUDE "paramet.h" 148 149 146 150 147 151 ! INTEGER ngroup -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/guide_loc_mod.F90
r5158 r5159 78 78 USE serre_mod, ONLY: grossismx 79 79 80 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 81 USE lmdz_paramet 80 82 IMPLICIT NONE 81 83 82 INCLUDE "dimensions.h" 83 INCLUDE "paramet.h" 84 85 84 86 85 87 INTEGER :: error, ncidpl, rid, rcod … … 362 364 USE comvert_mod, ONLY: ap, bp, preff, presnivs, pressure_exner 363 365 366 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 367 USE lmdz_paramet 364 368 IMPLICIT NONE 365 369 366 INCLUDE "dimensions.h" 367 INCLUDE "paramet.h" 370 371 368 372 369 373 ! Variables entree … … 722 726 ! field1=a*field1+alpha*field2 723 727 728 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 729 USE lmdz_paramet 724 730 IMPLICIT NONE 725 INCLUDE "dimensions.h" 726 INCLUDE "paramet.h" 731 732 727 733 728 734 ! input variables … … 745 751 ! field1=a*field1+alpha*field2 746 752 753 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 754 USE lmdz_paramet 747 755 IMPLICIT NONE 748 INCLUDE "dimensions.h" 749 INCLUDE "paramet.h" 756 757 750 758 751 759 ! input variables … … 771 779 USE lmdz_comgeom 772 780 781 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 782 USE lmdz_paramet 773 783 IMPLICIT NONE 774 784 775 INCLUDE "dimensions.h" 776 INCLUDE "paramet.h" 785 786 777 787 778 788 ! input/output variables … … 843 853 USE lmdz_comgeom 844 854 855 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 856 USE lmdz_paramet 845 857 IMPLICIT NONE 846 858 847 INCLUDE "dimensions.h" 848 INCLUDE "paramet.h" 859 860 849 861 850 862 ! input/output variables … … 916 928 USE lmdz_comgeom2 917 929 930 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 931 USE lmdz_paramet 918 932 IMPLICIT NONE 919 933 920 INCLUDE "dimensions.h" 921 INCLUDE "paramet.h" 934 935 922 936 923 937 REAL, DIMENSION (iip1, jjb_u:jje_u), INTENT(IN) :: psi ! Psol gcm … … 1400 1414 USE lmdz_comgeom2 1401 1415 1416 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 1417 USE lmdz_paramet 1402 1418 IMPLICIT NONE 1403 1419 1404 INCLUDE "dimensions.h" 1405 INCLUDE "paramet.h" 1420 1421 1406 1422 1407 1423 ! input arguments : … … 1565 1581 SUBROUTINE guide_read(timestep) 1566 1582 1583 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 1584 USE lmdz_paramet 1567 1585 IMPLICIT NONE 1568 1586 1569 INCLUDE "dimensions.h" 1570 INCLUDE "paramet.h" 1587 1588 1571 1589 1572 1590 INTEGER, INTENT(IN) :: timestep … … 1880 1898 SUBROUTINE guide_read2D(timestep) 1881 1899 1900 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 1901 USE lmdz_paramet 1882 1902 IMPLICIT NONE 1883 1903 1884 INCLUDE "dimensions.h" 1885 INCLUDE "paramet.h" 1904 1905 1886 1906 1887 1907 INTEGER, INTENT(IN) :: timestep … … 2159 2179 USE lmdz_comgeom2 2160 2180 2181 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 2182 USE lmdz_paramet 2161 2183 IMPLICIT NONE 2162 2184 2163 INCLUDE "dimensions.h" 2164 INCLUDE "paramet.h" 2185 2186 2165 2187 2166 2188 ! Variables entree … … 2380 2402 USE parallel_lmdz 2381 2403 USE mod_hallo 2404 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 2405 USE lmdz_paramet 2382 2406 IMPLICIT NONE 2383 INCLUDE 'dimensions.h' 2384 INCLUDE 'paramet.h' 2407 2408 2385 2409 2386 2410 CHARACTER (len = *) :: varname … … 2410 2434 USE lmdz_comgeom 2411 2435 2436 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 2437 USE lmdz_paramet 2412 2438 IMPLICIT NONE 2413 INCLUDE "dimensions.h" 2414 INCLUDE "paramet.h" 2439 2440 2415 2441 CALL barrier 2416 2442 CALL dump2du(alpha_u(ijb_u:ije_u), ' alpha_u couche 1') -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/iniacademic_loc.F90
r5158 r5159 27 27 ! of the American Meteorological Society, 75, 1825. 28 28 29 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 30 USE lmdz_paramet 29 31 IMPLICIT NONE 30 32 … … 32 34 ! --------------- 33 35 34 INCLUDE "dimensions.h" 35 INCLUDE "paramet.h" 36 37 36 38 37 39 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/initdynav_loc.f90
r5158 r5159 18 18 USE lmdz_comgeom 19 19 20 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 21 USE lmdz_paramet 20 22 IMPLICIT NONE 21 23 22 ! 24 23 25 ! Routine d'initialisation des ecritures des fichiers histoires LMDZ 24 26 ! au format IOIPSL. Initialisation du fichier histoire moyenne. 25 ! 27 26 28 ! Appels succesifs des routines: histbeg 27 29 ! histhori … … 29 31 ! histdef 30 32 ! histend 31 ! 33 32 34 ! Entree: 33 ! 35 34 36 ! day0,anne0: date de reference 35 37 ! tstep : frequence d'ecriture 36 38 ! t_ops: frequence de l'operation pour IOIPSL 37 39 ! t_wrt: frequence d'ecriture sur le fichier 38 ! 40 39 41 ! Sortie: 40 42 ! fileid: ID du fichier netcdf cree 41 ! 43 42 44 ! L. Fairhead, LMD, 03/99 43 ! 45 44 46 ! ===================================================================== 45 ! 47 46 48 ! Declarations 47 INCLUDE "dimensions.h" 48 INCLUDE "paramet.h" 49 50 49 51 50 52 ! Arguments 51 ! 53 52 54 INTEGER(kind = 4) day0, anne0 53 55 REAL :: tstep, t_ops, t_wrt … … 55 57 ! This routine needs IOIPSL 56 58 ! Variables locales 57 ! 59 58 60 INTEGER :: tau0 59 61 REAL :: zjulian … … 82 84 IF (adjust) return 83 85 84 ! 86 85 87 ! Initialisations 86 ! 88 87 89 pi = 4. * atan (1.) 88 ! 90 89 91 ! Appel a histbeg: creation du fichier netcdf et initialisations diverses 90 92 ! … … 192 194 193 195 194 ! 196 195 197 ! Appel a histvert pour la grille verticale 196 ! 198 197 199 CALL histvert(histaveid, 'presnivs', 'Niveaux Pression& 198 200 & approximatifs', 'mb', llm, presnivs / 100., zvertiid, 'down') … … 202 204 & approximatifs', 'mb', llm, presnivs / 100., zvertiidu, 'down') 203 205 204 ! 206 205 207 ! Appels a histdef pour la definition des variables a sauvegarder 206 ! 208 207 209 ! Vents U 208 ! 210 209 211 jjn = jj_nb 210 212 CALL histdef(histuaveid, 'u', 'vent u moyen ', & … … 212 214 32, 'ave(X)', t_ops, t_wrt) 213 215 214 ! 216 215 217 ! Vents V 216 ! 218 217 219 IF (pole_sud) jjn = jj_nb - 1 218 220 CALL histdef(histvaveid, 'v', 'vent v moyen', & … … 220 222 32, 'ave(X)', t_ops, t_wrt) 221 223 222 ! 224 223 225 ! Temperature 224 ! 226 225 227 jjn = jj_nb 226 228 CALL histdef(histaveid, 'temp', 'temperature moyenne', 'K', & 227 229 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & 228 230 32, 'ave(X)', t_ops, t_wrt) 229 ! 231 230 232 ! Temperature potentielle 231 ! 233 232 234 CALL histdef(histaveid, 'theta', 'temperature potentielle', 'K', & 233 235 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & … … 235 237 236 238 237 ! 239 238 240 ! Geopotentiel 239 ! 241 240 242 CALL histdef(histaveid, 'phi', 'geopotentiel moyen', '-', & 241 243 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & 242 244 32, 'ave(X)', t_ops, t_wrt) 243 ! 245 244 246 ! Traceurs 245 ! 247 246 248 ! DO iq=1,nqtot 247 249 ! CALL histdef(histaveid, tracers(iq)%name, … … 250 252 ! . 32, 'ave(X)', t_ops, t_wrt) 251 253 ! enddo 252 ! 254 253 255 ! Masse 254 ! 256 255 257 CALL histdef(histaveid, 'masse', 'masse moyenne', 'kg', & 256 258 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & 257 259 32, 'ave(X)', t_ops, t_wrt) 258 ! 260 259 261 ! Pression au sol 260 ! 262 261 263 CALL histdef(histaveid, 'ps', 'pression naturelle au sol', 'Pa', & 262 264 iip1, jjn, thoriid, 1, 1, 1, -99, & 263 265 32, 'ave(X)', t_ops, t_wrt) 264 ! 266 265 267 ! Geopotentiel au sol 266 ! 268 267 269 ! CALL histdef(histaveid, 'phis', 'geopotentiel au sol', '-', 268 270 ! . iip1, jjn, thoriid, 1, 1, 1, -99, 269 271 ! . 32, 'ave(X)', t_ops, t_wrt) 270 ! 272 271 273 ! Fin 272 ! 274 273 275 CALL histend(histaveid) 274 276 CALL histend(histuaveid) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/initfluxsto_p.f90
r5158 r5159 13 13 USE lmdz_comgeom 14 14 15 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 16 USE lmdz_paramet 15 17 IMPLICIT NONE 16 18 17 ! 19 18 20 ! Routine d'initialisation des ecritures des fichiers histoires LMDZ 19 21 ! au format IOIPSL 20 ! 22 21 23 ! Appels succesifs des routines: histbeg 22 24 ! histhori … … 24 26 ! histdef 25 27 ! histend 26 ! 28 27 29 ! Entree: 28 ! 30 29 31 ! infile: nom du fichier histoire a creer 30 32 ! day0,anne0: date de reference … … 32 34 ! t_ops: frequence de l'operation pour IOIPSL 33 35 ! t_wrt: frequence d'ecriture sur le fichier 34 ! 36 35 37 ! Sortie: 36 38 ! fileid: ID du fichier netcdf cree 37 39 ! filevid:ID du fichier netcdf pour la grille v 38 ! 40 39 41 ! L. Fairhead, LMD, 03/99 40 ! 42 41 43 ! ===================================================================== 42 ! 44 43 45 ! Declarations 44 INCLUDE "dimensions.h" 45 INCLUDE "paramet.h" 46 47 46 48 47 49 ! Arguments 48 ! 50 49 51 CHARACTER(LEN = *) :: infile 50 52 REAL :: tstep, t_ops, t_wrt … … 53 55 ! This routine needs IOIPSL 54 56 ! Variables locales 55 ! 57 56 58 REAL :: nivd(1) 57 59 INTEGER :: tau0 … … 80 82 INTEGER :: dynv_domain_id 81 83 82 ! 84 83 85 ! Initialisations 84 ! 86 85 87 pi = 4. * atan (1.) 86 88 str = 'q ' 87 89 ctrac = 'traceur ' 88 90 ok_sync = .TRUE. 89 ! 91 90 92 ! Appel a histbeg: creation du fichier netcdf et initialisations diverses 91 93 ! … … 121 123 1, iip1, 1, jjn, tau0, zjulian, tstep, uhoriid, & 122 124 fileid, dynu_domain_id) 123 ! 125 124 126 ! Creation du fichier histoire pour la grille en V (oblige pour l'instant, 125 127 ! IOIPSL ne permet pas de grilles avec des nombres de point differents dans … … 162 164 163 165 ENDIF 164 ! 166 165 167 ! Appel a histhori pour rajouter les autres grilles horizontales 166 ! 168 167 169 DO jj = 1, jjp1 168 170 DO ii = 1, iip1 … … 179 181 'scalar', 'Grille points scalaires', thoriid) 180 182 181 ! 183 182 184 ! Appel a histvert pour la grille verticale 183 ! 185 184 186 CALL histvert(fileid, 'sig_s', 'Niveaux sigma', & 185 187 'sigma_level', & … … 196 198 1, nivd, dvertiid) 197 199 ENDIF 198 ! 200 199 201 ! Appels a histdef pour la definition des variables a sauvegarder 200 202 … … 221 223 222 224 ENDIF 223 ! 225 224 226 ! Masse 225 ! 227 226 228 CALL histdef(fileid, 'masse', 'Masse', 'kg', & 227 229 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & 228 230 32, 'inst(X)', t_ops, t_wrt) 229 ! 231 230 232 ! Pbaru 231 ! 233 232 234 CALL histdef(fileid, 'pbaru', 'flx de masse zonal', 'kg m/s', & 233 235 iip1, jjn, uhoriid, llm, 1, llm, zvertiid, & 234 236 32, 'inst(X)', t_ops, t_wrt) 235 237 236 ! 238 237 239 ! Pbarv 238 ! 240 239 241 IF (pole_sud) jjn = jj_nb - 1 240 242 … … 242 244 iip1, jjn, vhoriid, llm, 1, llm, zvertiid, & 243 245 32, 'inst(X)', t_ops, t_wrt) 244 ! 246 245 247 ! w 246 ! 248 247 249 IF (pole_sud) jjn = jj_nb 248 250 CALL histdef(fileid, 'w', 'flx de masse vert', 'kg m/s', & … … 250 252 32, 'inst(X)', t_ops, t_wrt) 251 253 254 255 ! Temperature potentielle 256 257 CALL histdef(fileid, 'teta', 'temperature potentielle', '-', & 258 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & 259 32, 'inst(X)', t_ops, t_wrt) 252 260 ! 253 ! Temperature potentielle 254 ! 255 CALL histdef(fileid, 'teta', 'temperature potentielle', '-', & 256 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & 257 32, 'inst(X)', t_ops, t_wrt) 258 ! 259 260 ! 261 262 261 263 ! Geopotentiel 262 ! 264 263 265 CALL histdef(fileid, 'phi', 'geopotentiel instantane', '-', & 264 266 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & 265 267 32, 'inst(X)', t_ops, t_wrt) 266 ! 268 267 269 ! Fin 268 ! 270 269 271 CALL histend(fileid) 270 272 CALL histend(filevid) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/inithist_loc.F90
r5158 r5159 17 17 USE lmdz_comgeom 18 18 19 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 20 USE lmdz_paramet 19 21 IMPLICIT NONE 20 22 21 ! 23 22 24 ! Routine d'initialisation des ecritures des fichiers histoires LMDZ 23 25 ! au format IOIPSL 24 ! 26 25 27 ! Appels succesifs des routines: histbeg 26 28 ! histhori … … 28 30 ! histdef 29 31 ! histend 30 ! 32 31 33 ! Entree: 32 ! 34 33 35 ! day0,anne0: date de reference 34 36 ! tstep: duree du pas de temps en seconde … … 36 38 ! t_wrt: frequence d'ecriture sur le fichier 37 39 ! nq: nombre de traceurs 38 ! 39 ! 40 41 40 42 ! L. Fairhead, LMD, 03/99 41 ! 43 42 44 ! ===================================================================== 43 ! 45 44 46 ! Declarations 45 INCLUDE "dimensions.h" 46 INCLUDE "paramet.h" 47 48 47 49 48 50 ! Arguments 49 ! 51 50 52 INTEGER :: day0, anne0 51 53 REAL :: tstep, t_ops, t_wrt … … 53 55 ! This routine needs IOIPSL 54 56 ! Variables locales 55 ! 57 56 58 INTEGER :: tau0 57 59 REAL :: zjulian … … 80 82 IF (adjust) return 81 83 82 ! 84 83 85 ! Initialisations 84 ! 86 85 87 pi = 4. * atan (1.) 86 ! 88 87 89 ! Appel a histbeg: creation du fichier netcdf et initialisations diverses 88 90 ! … … 200 202 llm, presnivs / 100., zvertiidu, 'down') 201 203 202 ! 204 203 205 ! ------------------------------------------------------------- 204 206 ! Appels a histdef pour la definition des variables a sauvegarder 205 207 ! ------------------------------------------------------------- 206 ! 208 207 209 ! Vents U 208 ! 210 209 211 jjn = jj_nb 210 212 CALL histdef(histuid, 'u', 'vent u', & … … 212 214 32, 'inst(X)', t_ops, t_wrt) 213 215 214 ! 216 215 217 ! Vents V 216 ! 218 217 219 IF (pole_sud) jjn = jj_nb - 1 218 220 CALL histdef(histvid, 'v', 'vent v', & … … 220 222 32, 'inst(X)', t_ops, t_wrt) 221 223 222 ! 224 223 225 ! Temperature 224 ! 226 225 227 jjn = jj_nb 226 228 CALL histdef(histid, 'temp', 'temperature', 'K', & 227 229 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & 228 230 32, 'inst(X)', t_ops, t_wrt) 229 ! 231 230 232 ! Temperature potentielle 231 ! 233 232 234 CALL histdef(histid, 'theta', 'temperature potentielle', 'K', & 233 235 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & … … 235 237 236 238 237 ! 239 238 240 ! Geopotentiel 239 ! 241 240 242 CALL histdef(histid, 'phi', 'geopotentiel', '-', & 241 243 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & 242 244 32, 'inst(X)', t_ops, t_wrt) 243 ! 245 244 246 ! Traceurs 245 ! 247 246 248 ! DO iq=1,nqtot 247 249 ! CALL histdef(histid, tracers(iq)%name, … … 250 252 ! . 32, 'inst(X)', t_ops, t_wrt) 251 253 ! enddo 252 ! 254 253 255 ! Masse 254 ! 256 255 257 CALL histdef(histid, 'masse', 'masse', 'kg', & 256 258 iip1, jjn, thoriid, llm, 1, llm, zvertiid, & 257 259 32, 'inst(X)', t_ops, t_wrt) 258 ! 260 259 261 ! Pression au sol 260 ! 262 261 263 CALL histdef(histid, 'ps', 'pression naturelle au sol', 'Pa', & 262 264 iip1, jjn, thoriid, 1, 1, 1, -99, & 263 265 32, 'inst(X)', t_ops, t_wrt) 264 ! 266 265 267 ! Geopotentiel au sol 266 ! 268 267 269 ! CALL histdef(histid, 'phis', 'geopotentiel au sol', '-', 268 270 ! . iip1, jjn, thoriid, 1, 1, 1, -99, 269 271 ! . 32, 'inst(X)', t_ops, t_wrt) 270 ! 272 271 273 ! Fin 272 ! 274 273 275 CALL histend(histid) 274 276 CALL histend(histuid) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/integrd_loc.f90
r5158 r5159 20 20 USE lmdz_comgeom 21 21 22 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 23 USE lmdz_paramet 22 24 IMPLICIT NONE 23 25 24 26 25 27 !======================================================================= 26 ! 28 27 29 ! Auteur: P. Le Van 28 30 ! ------- 29 ! 31 30 32 ! objet: 31 33 ! ------ 32 ! 34 33 35 ! Incrementation des tendances dynamiques 34 ! 36 35 37 !======================================================================= 36 38 !----------------------------------------------------------------------- … … 38 40 ! ------------- 39 41 40 INCLUDE "dimensions.h" 41 INCLUDE "paramet.h" 42 43 42 44 43 45 ! Arguments: … … 191 193 192 194 193 ! 195 194 196 ! !WRITE(*,*) 'integrd 200' 195 197 !$OMP MASTER … … 220 222 !$OMP BARRIER 221 223 !WRITE(*,*) 'integrd 217' 222 ! 224 223 225 ! ... Calcul de la nouvelle masse d'air au dernier temps integre t+1 ... 224 226 ! … … 281 283 282 284 ! .... Calcul de la valeur moyenne, unique aux poles pour teta ...... 283 ! 284 ! 285 286 285 287 ! !WRITE(*,*) 'integrd 291' 286 288 IF (pole_nord) THEN … … 327 329 !$OMP END DO NOWAIT 328 330 329 ! 331 330 332 ! ....... integration de q ...... 331 ! 333 332 334 ijb=ij_begin 333 335 ije=ij_end … … 353 355 354 356 CALL check_isotopes(q,ijb,ije,'integrd 346') 355 ! 357 356 358 ! ..... Calcul de la valeur moyenne, unique aux poles pour q ..... 357 ! 359 358 360 !$OMP BARRIER 359 361 IF (pole_nord) THEN … … 416 418 ENDIF ! of if (planet_type.EQ."earth") 417 419 418 ! 419 ! 420 421 420 422 ! ..... FIN de l'integration de q ....... 421 423 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/integrd_mod.F90
r5101 r5159 13 13 USE allocate_field_mod 14 14 USE parallel_lmdz 15 USE dimensions_mod 15 USE lmdz_dimensions 16 USE lmdz_paramet 16 17 USE advect_new_mod,ONLY: advect_new_allocate 17 18 IMPLICIT NONE -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/laplacien_gam_loc.f90
r5136 r5159 3 3 4 4 ! P. Le Van 5 ! 5 6 6 ! ************************************************************ 7 ! 7 8 8 ! .... calcul de (div( grad )) de teta ..... 9 9 ! ************************************************************ 10 10 ! klevel et teta sont des arguments d'entree pour le s-prog 11 11 ! divgra est un argument de sortie pour le s-prog 12 ! 12 13 13 USE parallel_lmdz 14 14 USE lmdz_comgeom 15 15 16 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 17 USE lmdz_paramet 16 18 IMPLICIT NONE 17 19 ! 18 INCLUDE "dimensions.h"19 INCLUDE "paramet.h"20 20 21 ! 21 22 23 22 24 ! ............ variables en arguments .......... 23 ! 25 24 26 INTEGER :: klevel 25 27 REAL :: teta( ijb_u:ije_u,klevel ), divgra( ijb_u:ije_u,klevel ) … … 27 29 REAL :: unsaigam(ip1jmp1) 28 30 REAL :: unsapolnga, unsapolsga 29 ! 31 30 32 ! ........... variables locales ................. 31 ! 33 32 34 REAL :: ghy(ijb_v:ije_v,llm), ghx(ijb_u:ije_u,llm) 33 35 ! ...................................................... … … 35 37 INTEGER :: ijb,ije 36 38 INTEGER :: l 37 ! 38 ! 39 40 39 41 ! ... cvuscugam = ( cvu/ cu ) ** (- gamdissip ) 40 42 ! ... cuvscvgam = ( cuv/ cv ) ** (- gamdissip ) calcules dans inigeom .. … … 55 57 !$OMP END DO NOWAIT 56 58 57 ! 59 58 60 CALL grad_loc ( klevel, divgra, ghx, ghy ) 59 ! 61 60 62 CALL diverg_gam_loc ( klevel, cuvsga, cvusga, unsaigam , & 61 63 unsapolnga, unsapolsga, ghx , ghy , divgra ) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/laplacien_loc.f90
r5136 r5159 1 1 SUBROUTINE laplacien_loc( klevel, teta, divgra ) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! ************************************************************ 6 6 ! .... calcul de (div( grad )) de teta ..... … … 8 8 ! klevel et teta sont des arguments d'entree pour le s-prog 9 9 ! divgra est un argument de sortie pour le s-prog 10 ! 10 11 11 USE parallel_lmdz 12 12 USE lmdz_filtreg_p 13 13 USE lmdz_comgeom 14 14 15 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 16 USE lmdz_paramet 15 17 IMPLICIT NONE 16 18 ! 17 INCLUDE "dimensions.h"18 INCLUDE "paramet.h"19 19 20 ! 20 21 22 21 23 ! ......... variables en arguments .............. 22 ! 24 23 25 INTEGER :: klevel 24 26 REAL :: teta( ijb_u:ije_u,klevel ), divgra( ijb_u:ije_u,klevel ) 25 27 INTEGER :: l 26 ! 28 27 29 ! ............ variables locales .............. 28 ! 30 29 31 REAL :: ghy(ijb_v:ije_v,llm), ghx(ijb_u:ije_u,llm) 30 32 ! ....................................................... … … 32 34 33 35 INTEGER :: ijb,ije,jjb,jje 34 ! 36 35 37 ! CALL SCOPY ( ip1jmp1 * klevel, teta, 1, divgra, 1 ) 36 38 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/laplacien_rot_loc.f90
r5136 r5159 1 1 SUBROUTINE laplacien_rot_loc( klevel, rotin, rotout,ghx,ghy ) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! ************************************************************ 6 6 ! ... calcul de ( rotat x nxgrad ) du rotationnel rotin . 7 7 ! ************************************************************ 8 ! 8 9 9 ! klevel et rotin sont des arguments d'entree pour le s-prog 10 10 ! rotout est un argument de sortie pour le s-prog 11 ! 11 12 12 USE parallel_lmdz 13 13 USE lmdz_filtreg_p 14 14 USE lmdz_comgeom 15 15 16 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 17 USE lmdz_paramet 16 18 IMPLICIT NONE 17 19 ! 18 INCLUDE "dimensions.h"19 INCLUDE "paramet.h"20 20 21 ! 21 22 23 22 24 ! .......... variables en arguments ............. 23 ! 25 24 26 INTEGER :: klevel 25 27 REAL :: rotin(ijb_v:ije_v,klevel ), rotout( ijb_v:ije_v,klevel ) 26 ! 28 27 29 ! .......... variables locales ................ 28 ! 30 29 31 REAL :: ghy(ijb_v:ije_v,klevel), ghx(ijb_u:ije_u,klevel) 30 32 ! ........................................................ 31 ! 32 ! 33 34 33 35 INTEGER :: ijb,ije,jjb,jje 34 36 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/laplacien_rotgam_loc.f90
r5136 r5159 1 1 SUBROUTINE laplacien_rotgam_loc( klevel, rotin, rotout ) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! ************************************************************ 6 6 ! ... calcul de (rotat x nxgrad)_gam du rotationnel rotin .. … … 8 8 ! klevel et teta sont des arguments d'entree pour le s-prog 9 9 ! divgra est un argument de sortie pour le s-prog 10 ! 10 11 11 USE parallel_lmdz 12 12 USE lmdz_comgeom 13 13 14 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 15 USE lmdz_paramet 14 16 IMPLICIT NONE 15 17 ! 16 INCLUDE "dimensions.h"17 INCLUDE "paramet.h"18 18 19 ! 19 20 21 20 22 ! ............. variables en arguments ........... 21 ! 23 22 24 INTEGER :: klevel 23 25 REAL :: rotin( ijb_v:ije_v,klevel ), rotout( ijb_v:ije_v,klevel ) 24 ! 26 25 27 ! ............ variables locales ............... 26 ! 28 27 29 INTEGER :: l, ij 28 30 REAL :: ghy(ijb_v:ije_v,llm), ghx(ijb_u:ije_u,llm) 29 31 ! ........................................................ 30 ! 32 31 33 INTEGER :: ijb,ije 32 34 … … 35 37 CALL nxgrad_gam_loc ( klevel, rotin, ghx , ghy ) 36 38 CALL rotat_nfil_loc ( klevel, ghx , ghy , rotout ) 37 ! 39 38 40 ijb=ij_begin 39 41 ije=ij_end -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/leapfrog_loc.F90
r5158 r5159 47 47 USE lmdz_comgeom 48 48 49 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 50 USE lmdz_paramet 49 51 IMPLICIT NONE 50 52 … … 55 57 56 58 !======================================================================= 57 ! 59 58 60 ! Auteur: P. Le Van /L. Fairhead/F.Hourdin 59 61 ! ------- 60 ! 62 61 63 ! Objet: 62 64 ! ------ 63 ! 65 64 66 ! GCM LMD nouvelle grille 65 ! 67 66 68 !======================================================================= 67 ! 69 68 70 ! ... Dans inigeom , nouveaux calculs pour les elongations cu , cv 69 71 ! et possibilite d'appeler une fonction f(y) a derivee tangente … … 72 74 ! ... Possibilite de choisir le shema pour l'advection de 73 75 ! q , en modifiant iadv dans traceur.def (10/02) . 74 ! 76 75 77 ! Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99) 76 78 ! Pour Van-Leer iadv=10 77 ! 79 78 80 !----------------------------------------------------------------------- 79 81 ! Declarations: 80 82 ! ------------- 81 83 82 INCLUDE "dimensions.h" 83 INCLUDE "paramet.h" 84 85 84 86 85 87 REAL, INTENT(IN) :: time_0 ! not used … … 130 132 131 133 REAL :: tppn(iim), tpps(iim), tpn, tps 132 ! 134 133 135 INTEGER :: itau, itaufinp1, iav 134 136 ! INTEGER iday ! jour julien … … 322 324 323 325 324 ! 326 325 327 ! IF( MOD( itau, 10* day_step ).EQ.0 ) THEN 326 328 ! CALL test_period ( ucov,vcov,teta,q,p,phis ) 327 329 ! PRINT *,' ---- Test_period apres continue OK ! -----', itau 328 330 ! ENDIF 329 ! 331 330 332 !ym CALL SCOPY( ijmllm ,vcov , 1, vcovm1 , 1 ) 331 333 !ym CALL SCOPY( ijp1llm,ucov , 1, ucovm1 , 1 ) … … 422 424 ! gestion des appels de la physique et des dissipations: 423 425 ! ------------------------------------------------------ 424 ! 426 425 427 ! ... P.Le Van ( 6/02/95 ) .... 426 428 … … 780 782 !$OMP END MASTER 781 783 ! .P.Le Van (26/04/94 ajout de finvpold dans l'appel d'integrd) 782 ! 784 783 785 !----------------------------------------------------------------------- 784 786 ! calcul des tendances physiques: 785 787 ! ------------------------------- 786 788 ! ######## P.Le Van ( Modif le 6/02/95 ) ########### 787 ! 789 788 790 IF(purmats) THEN 789 791 IF(itau==itaufin.AND..NOT.forward) lafin = .TRUE. … … 794 796 !c$OMP END PARALLEL 795 797 796 ! 797 ! 798 799 798 800 IF(apphys) THEN 799 801 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/leapfrog_mod.F90
r5101 r5159 39 39 USE allocate_field_mod 40 40 USE parallel_lmdz 41 USE dimensions_mod 41 USE lmdz_dimensions 42 USE lmdz_paramet 42 43 USE infotrac 43 44 USE caldyn_mod,ONLY: caldyn_allocate -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/lmdz_call_calfis.F90
r5118 r5159 34 34 USE allocate_field_mod 35 35 USE parallel_lmdz 36 USE dimensions_mod 36 USE lmdz_dimensions 37 USE lmdz_paramet 37 38 USE infotrac, ONLY: nqtot 38 39 IMPLICIT NONE … … 70 71 SUBROUTINE call_calfis(itau, lafin, ucov_dyn, vcov_dyn, teta_dyn, masse_dyn, ps_dyn, & 71 72 phis_dyn, q_dyn, flxw_dyn) 72 USE dimensions_mod 73 USE lmdz_dimensions 74 USE lmdz_paramet 73 75 USE exner_hyb_loc_m, ONLY: exner_hyb_loc 74 76 USE exner_milieu_loc_m, ONLY: exner_milieu_loc -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/lmdz_filtreg_p.F90
r5128 r5159 2 2 USE lmdz_filtreg, ONLY: matrinvn, matrinvs, matriceun, matriceus, matricevn, matricevs 3 3 4 USE lmdz_paramet 4 5 IMPLICIT NONE; PRIVATE 5 6 PUBLIC filtreg_p … … 12 13 USE lmdz_filtre_fft_loc, ONLY: use_filtre_fft, filtre_u_fft, & 13 14 filtre_v_fft, filtre_inv_fft 15 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 14 16 USE lmdz_timer_filtre, ONLY: init_timer, start_timer, stop_timer 15 17 USE lmdz_coefils, ONLY: jfiltnu, jfiltnv, jfiltsu, jfiltsv, sddu, sddv, unsddu, unsddv, modfrstv, modfrstu … … 17 19 18 20 !======================================================================= 19 ! 21 20 22 ! Auteur: P. Le Van 07/10/97 21 23 ! ------ 22 ! 24 23 25 ! Objet: filtre matriciel longitudinal ,avec les matrices precalculees 24 26 ! pour l'operateur Filtre . 25 27 ! ------ 26 ! 28 27 29 ! Arguments: 28 30 ! ---------- 29 ! 30 ! 31 32 31 33 ! ibeg..iend lattitude a filtrer 32 34 ! nlat nombre de latitudes du champ … … 38 40 ! +2 Filtre directe 39 41 ! -2 Filtre inverse 40 ! 42 41 43 ! iaire 1 si champ intensif 42 44 ! 2 si champ extensif (pondere par les aires) 43 ! 45 44 46 ! iter 1 filtre simple 45 ! 47 46 48 !======================================================================= 47 ! 48 ! 49 50 49 51 ! Variable Intensive 50 52 ! ifiltre = 1 filtre directe 51 53 ! ifiltre =-1 filtre inverse 52 ! 54 53 55 ! Variable Extensive 54 56 ! ifiltre = 2 filtre directe 55 57 ! ifiltre =-2 filtre inverse 58 56 59 ! 57 ! 58 INCLUDE "dimensions.h" 59 INCLUDE "paramet.h" 60 ! 60 61 62 61 63 INTEGER, INTENT(IN) :: jjb, jje, ibeg, iend, nlat, nbniv, ifiltre, iter 62 64 INTEGER, INTENT(IN) :: iaire … … 128 130 iim2 = iim * iim 129 131 immjm = iim * jjm 130 ! 131 ! 132 133 132 134 IF(griscal) THEN 133 135 IF(nlat /= jjp1) THEN 134 136 CALL abort_gcm("lmdz_filtreg_p", " nlat. NE. jjp1", 1) 135 137 ELSE 136 ! 138 137 139 IF(iaire==1) THEN 138 140 sdd1_type = type_sddv … … 142 144 sdd2_type = type_sddv 143 145 ENDIF 144 ! 146 145 147 jdfil1 = 2 146 148 jffil1 = jfiltnu … … 152 154 CALL abort_gcm("lmdz_filtreg_p", " nlat. NE. jjm", 1) 153 155 ELSE 154 ! 156 155 157 IF(iaire==1) THEN 156 158 sdd1_type = type_sddu … … 160 162 sdd2_type = type_sddu 161 163 ENDIF 162 ! 164 163 165 jdfil1 = 1 164 166 jffil1 = jfiltnv … … 167 169 ENDIF 168 170 ENDIF 169 ! 171 170 172 DO hemisph = 1, 2 171 ! 173 172 174 IF (hemisph==1) THEN 173 175 !ym … … 402 404 !$OMP END DO NOWAIT 403 405 ENDIF 404 ! 406 405 407 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 406 408 DO l = 1, nbniv … … 427 429 ! & sum(champ-champ_fft)/sum(champ) 428 430 429 ! 431 430 432 !$OMP MASTER 431 433 CALL stop_timer -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/lmdz_paramet.f90
r5158 r5159 1 MODULE lmdz_paramet 2 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 1 3 2 ! $Id$ 4 IMPLICIT NONE; PRIVATE 5 PUBLIC iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, & 6 ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm 3 7 8 INTEGER iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1 9 INTEGER kftd, ip1jm, ip1jmp1, ip1jmi1, ijp1llm 10 INTEGER ijmllm, mvar 11 INTEGER jcfil, jcfllm 4 12 5 ! ATTENTION!!!!: ce fichier INCLUDE est compatible format fixe/format libre 6 ! veillez n'utiliser que des ! pour les commentaires 7 ! et bien positionner les & des lignes de continuation 8 ! (les placer en colonne 6 et en colonne 73) 13 PARAMETER(iip1 = iim + 1 - 1 / iim, iip2 = iim + 2, iip3 = iim + 3, jjp1 = jjm + 1 - 1 / jjm) 14 PARAMETER(llmp1 = llm + 1, llmp2 = llm + 2, llmm1 = llm - 1) 15 PARAMETER(kftd = iim / 2 - ndm) 16 PARAMETER(ip1jm = iip1 * jjm, ip1jmp1 = iip1 * jjp1) 17 PARAMETER(ip1jmi1 = ip1jm - iip1) 18 PARAMETER(ijp1llm = ip1jmp1 * llm, ijmllm = ip1jm * llm) 19 PARAMETER(mvar = ip1jmp1 * (2 * llm + 1) + ijmllm) 20 PARAMETER(jcfil = jjm / 2 + 5, jcfllm = jcfil * llm) 9 21 10 11 !----------------------------------------------------------------------- 12 ! INCLUDE 'paramet.h' 13 14 INTEGER iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1 15 INTEGER kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm 16 INTEGER ijmllm,mvar 17 INTEGER jcfil,jcfllm 18 19 PARAMETER( iip1= iim+1-1/iim,iip2=iim+2,iip3=iim+3 & 20 ,jjp1=jjm+1-1/jjm) 21 PARAMETER( llmp1 = llm+1, llmp2 = llm+2, llmm1 = llm-1 ) 22 PARAMETER( kftd = iim/2 -ndm ) 23 PARAMETER( ip1jm = iip1*jjm, ip1jmp1= iip1*jjp1 ) 24 PARAMETER( ip1jmi1= ip1jm - iip1 ) 25 PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm ) 26 PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm ) 27 PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm ) 28 29 !----------------------------------------------------------------------- 22 END MODULE lmdz_paramet -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/massbar_loc.F90
r5136 r5159 9 9 USE lmdz_comgeom 10 10 11 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 12 USE lmdz_paramet 11 13 IMPLICIT NONE 12 INCLUDE "dimensions.h" 13 INCLUDE "paramet.h" 14 15 14 16 !=============================================================================== 15 17 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/massbarxy_loc.F90
r5136 r5159 9 9 USE lmdz_comgeom 10 10 11 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 12 USE lmdz_paramet 11 13 IMPLICIT NONE 12 INCLUDE "dimensions.h" 13 INCLUDE "paramet.h" 14 15 14 16 !=============================================================================== 15 17 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/massdair_loc.f90
r5136 r5159 3 3 USE lmdz_comgeom 4 4 5 ! 5 6 6 ! ********************************************************************* 7 7 ! .... Calcule la masse d'air dans chaque maille .... 8 8 ! ********************************************************************* 9 ! 9 10 10 ! Auteurs : P. Le Van , Fr. Hourdin . 11 11 ! .......... 12 ! 12 13 13 ! .. p est un argum. d'entree pour le s-pg ... 14 14 ! .. masse est un argum.de sortie pour le s-pg ... 15 ! 15 16 16 ! .... p est defini aux interfaces des llm couches ..... 17 ! 17 18 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 19 USE lmdz_paramet 18 20 IMPLICIT NONE 19 21 ! 20 INCLUDE "dimensions.h" 21 INCLUDE "paramet.h" 22 ! 22 23 24 23 25 ! ..... arguments .... 24 ! 26 25 27 REAL :: p(ijb_u:ije_u,llmp1), masse(ijb_u:ije_u,llm) 26 28 … … 31 33 REAL :: massemoyn, massemoys 32 34 33 ! 34 ! 35 36 35 37 ! Methode pour calculer massebx et masseby . 36 38 ! ---------------------------------------- 37 ! 39 38 40 ! A chaque point scalaire P (i,j) est affecte 4 coefficients d'aires 39 41 ! alpha1(i,j) calcule au point ( i+1/4,j-1/4 ) … … 41 43 ! alpha3(i,j) calcule au point ( i-1/4,j+1/4 ) 42 44 ! alpha4(i,j) calcule au point ( i-1/4,j-1/4 ) 43 ! 45 44 46 ! Avec alpha1(i,j) = aire(i+1/4,j-1/4)/ aire(i,j) 45 ! 47 46 48 ! N.B . Pour plus de details, voir s-pg ... iniconst ... 47 ! 48 ! 49 ! 49 50 51 50 52 ! alpha4 . . alpha1 . alpha4 51 53 ! (i,j) (i,j) (i+1,j) 52 ! 54 53 55 ! P . U . . P 54 56 ! (i,j) (i,j) (i+1,j) 55 ! 57 56 58 ! alpha3 . . alpha2 .alpha3 57 59 ! (i,j) (i,j) (i+1,j) 58 ! 60 59 61 ! V . Z . . V 60 62 ! (i,j) 61 ! 63 62 64 ! alpha4 . . alpha1 .alpha4 63 65 ! (i,j+1) (i,j+1) (i+1,j+1) 64 ! 66 65 67 ! P . U . . P 66 68 ! (i,j+1) (i+1,j+1) 67 ! 68 ! 69 ! 69 70 71 70 72 ! On a : 71 ! 73 72 74 ! massebx(i,j) = masse(i ,j) * ( alpha1(i ,j) + alpha2(i,j)) + 73 75 ! masse(i+1,j) * ( alpha3(i+1,j) + alpha4(i+1,j) ) 74 76 ! localise au point ... U (i,j) ... 75 ! 77 76 78 ! masseby(i,j) = masse(i,j ) * ( alpha2(i,j ) + alpha3(i,j ) + 77 79 ! masse(i,j+1) * ( alpha1(i,j+1) + alpha4(i,j+1) 78 80 ! localise au point ... V (i,j) ... 79 ! 80 ! 81 82 81 83 !======================================================================= 82 84 … … 92 94 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 93 95 DO l = 1 , llm 94 ! 96 95 97 DO ij = ijb, ije 96 98 masse(ij,l) = airesurg(ij) * ( p(ij,l) - p(ij,l+1) ) 97 99 ENDDO 98 ! 100 99 101 DO ij = ijb, ije,iip1 100 102 masse(ij+ iim,l) = masse(ij,l) 101 103 ENDDO 102 ! 104 103 105 ! DO ij = 1, iim 104 106 ! masse( ij ,l) = masse( ij ,l) * aire( ij ) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/mod_hallo.F90
r5158 r5159 1 1 module mod_Hallo 2 USE parallel_lmdz3 IMPLICIT NONE4 logical, save :: use_mpi_alloc5 INTEGER, parameter :: MaxProc =5126 INTEGER, parameter :: DefaultMaxBufferSize =1024*1024*1007 INTEGER, SAVE :: MaxBufferSize =08 INTEGER, parameter :: ListSize =10009 10 INTEGER, save:: MaxBufferSize_Used11 !$OMP THREADPRIVATE( MaxBufferSize_Used)12 13 REAL,SAVE,pointer,DIMENSION(:) :: Buffer14 !$OMP THREADPRIVATE(Buffer)15 16 INTEGER,SAVE,DIMENSION(Listsize) :: Buffer_Pos17 INTEGER,save :: Index_Pos18 !$OMP THREADPRIVATE(Buffer_Pos,Index_pos)19 2 USE parallel_lmdz 3 IMPLICIT NONE 4 logical, save :: use_mpi_alloc 5 INTEGER, parameter :: MaxProc = 512 6 INTEGER, parameter :: DefaultMaxBufferSize = 1024 * 1024 * 100 7 INTEGER, SAVE :: MaxBufferSize = 0 8 INTEGER, parameter :: ListSize = 1000 9 10 INTEGER, save :: MaxBufferSize_Used 11 !$OMP THREADPRIVATE( MaxBufferSize_Used) 12 13 REAL, SAVE, pointer, DIMENSION(:) :: Buffer 14 !$OMP THREADPRIVATE(Buffer) 15 16 INTEGER, SAVE, DIMENSION(Listsize) :: Buffer_Pos 17 INTEGER, save :: Index_Pos 18 !$OMP THREADPRIVATE(Buffer_Pos,Index_pos) 19 20 20 type Hallo 21 REAL, DIMENSION(:, :),pointer :: Field21 REAL, DIMENSION(:, :), pointer :: Field 22 22 INTEGER :: offset 23 23 INTEGER :: size … … 25 25 INTEGER :: Stride 26 26 end type Hallo 27 27 28 28 type request_SR 29 INTEGER :: NbRequest =030 INTEGER :: NbRequestMax =029 INTEGER :: NbRequest = 0 30 INTEGER :: NbRequestMax = 0 31 31 INTEGER :: BufferSize 32 32 INTEGER :: Pos … … 37 37 38 38 type request 39 type(request_SR), DIMENSION(0:MaxProc-1) :: RequestSend40 type(request_SR), DIMENSION(0:MaxProc-1) :: RequestRecv41 INTEGER :: tag =139 type(request_SR), DIMENSION(0:MaxProc - 1) :: RequestSend 40 type(request_SR), DIMENSION(0:MaxProc - 1) :: RequestRecv 41 INTEGER :: tag = 1 42 42 end type request 43 44 TYPE(distrib),SAVE :: distrib_gather 45 43 44 TYPE(distrib), SAVE :: distrib_gather 46 45 47 46 INTERFACE Register_SwapField_u 48 MODULE PROCEDURE Register_SwapField1d_u, Register_SwapField2d_u1d,Register_SwapField3d_u, &49 Register_SwapField1d_u_bis,Register_SwapField2d_u1d_bis,Register_SwapField3d_u_bis47 MODULE PROCEDURE Register_SwapField1d_u, Register_SwapField2d_u1d, Register_SwapField3d_u, & 48 Register_SwapField1d_u_bis, Register_SwapField2d_u1d_bis, Register_SwapField3d_u_bis 50 49 END INTERFACE Register_SwapField_u 51 50 52 51 INTERFACE Register_SwapField_v 53 MODULE PROCEDURE Register_SwapField1d_v, Register_SwapField2d_v1d,Register_SwapField3d_v,&54 Register_SwapField1d_v_bis,Register_SwapField2d_v1d_bis,Register_SwapField3d_v_bis52 MODULE PROCEDURE Register_SwapField1d_v, Register_SwapField2d_v1d, Register_SwapField3d_v, & 53 Register_SwapField1d_v_bis, Register_SwapField2d_v1d_bis, Register_SwapField3d_v_bis 55 54 END INTERFACE Register_SwapField_v 56 55 57 56 INTERFACE Register_SwapField2d_u 58 MODULE PROCEDURE Register_SwapField1d_u2d, Register_SwapField2d_u2d,Register_SwapField3d_u2d, &59 Register_SwapField1d_u2d_bis,Register_SwapField2d_u2d_bis,Register_SwapField3d_u2d_bis57 MODULE PROCEDURE Register_SwapField1d_u2d, Register_SwapField2d_u2d, Register_SwapField3d_u2d, & 58 Register_SwapField1d_u2d_bis, Register_SwapField2d_u2d_bis, Register_SwapField3d_u2d_bis 60 59 END INTERFACE Register_SwapField2d_u 61 60 62 61 INTERFACE Register_SwapField2d_v 63 MODULE PROCEDURE Register_SwapField1d_v2d, Register_SwapField2d_v2d,Register_SwapField3d_v2d, &64 Register_SwapField1d_v2d_bis,Register_SwapField2d_v2d_bis,Register_SwapField3d_v2d_bis62 MODULE PROCEDURE Register_SwapField1d_v2d, Register_SwapField2d_v2d, Register_SwapField3d_v2d, & 63 Register_SwapField1d_v2d_bis, Register_SwapField2d_v2d_bis, Register_SwapField3d_v2d_bis 65 64 END INTERFACE Register_SwapField2d_v 66 65 67 66 CONTAINS 68 67 69 68 SUBROUTINE Init_mod_hallo 70 USE dimensions_mod 71 USE IOIPSL 72 IMPLICIT NONE 73 INTEGER :: jj_nb_gather(0:mpi_size-1) 74 75 Index_Pos=1 76 Buffer_Pos(Index_Pos)=1 77 MaxBufferSize_Used=0 78 !$OMP MASTER 79 MaxBufferSize=DefaultMaxBufferSize 80 CALL getin("mpi_buffer_size",MaxBufferSize) 81 !$OMP END MASTER 82 !$OMP BARRIER 83 69 USE lmdz_dimensions 70 USE lmdz_paramet 71 USE IOIPSL 72 IMPLICIT NONE 73 INTEGER :: jj_nb_gather(0:mpi_size - 1) 74 75 Index_Pos = 1 76 Buffer_Pos(Index_Pos) = 1 77 MaxBufferSize_Used = 0 78 !$OMP MASTER 79 MaxBufferSize = DefaultMaxBufferSize 80 CALL getin("mpi_buffer_size", MaxBufferSize) 81 !$OMP END MASTER 82 !$OMP BARRIER 83 84 84 IF (use_mpi_alloc .AND. using_mpi) THEN 85 85 CALL create_global_mpi_buffer 86 ELSE 86 ELSE 87 87 CALL create_standard_mpi_buffer 88 88 ENDIF 89 90 !$OMP MASTER 91 jj_nb_gather(:)=092 jj_nb_gather(0)=jjp193 94 CALL create_distrib(jj_nb_gather,distrib_gather)95 !$OMP END MASTER96 !$OMP BARRIER89 90 !$OMP MASTER 91 jj_nb_gather(:) = 0 92 jj_nb_gather(0) = jjp1 93 94 CALL create_distrib(jj_nb_gather, distrib_gather) 95 !$OMP END MASTER 96 !$OMP BARRIER 97 97 98 98 END SUBROUTINE init_mod_hallo 99 99 100 100 SUBROUTINE create_standard_mpi_buffer 101 IMPLICIT NONE102 101 IMPLICIT NONE 102 103 103 ALLOCATE(Buffer(MaxBufferSize)) 104 104 105 105 END SUBROUTINE create_standard_mpi_buffer 106 106 107 107 SUBROUTINE create_global_mpi_buffer 108 USE lmdz_mpi109 IMPLICIT NONE110 POINTER (Pbuffer, MPI_Buffer(MaxBufferSize))108 USE lmdz_mpi 109 IMPLICIT NONE 110 POINTER (Pbuffer, MPI_Buffer(MaxBufferSize)) 111 111 REAL :: MPI_Buffer 112 INTEGER(KIND =MPI_ADDRESS_KIND) :: BS113 INTEGER :: i, ierr114 115 ! Allocation du buffer MPI116 Bs=8*MaxBufferSize117 !$OMP CRITICAL (MPI)118 CALL MPI_ALLOC_MEM(BS,MPI_INFO_NULL,Pbuffer,ierr)119 !$OMP END CRITICAL (MPI)120 DO i=1,MaxBufferSize121 MPI_Buffer(i)=i122 123 124 125 112 INTEGER(KIND = MPI_ADDRESS_KIND) :: BS 113 INTEGER :: i, ierr 114 115 ! Allocation du buffer MPI 116 Bs = 8 * MaxBufferSize 117 !$OMP CRITICAL (MPI) 118 CALL MPI_ALLOC_MEM(BS, MPI_INFO_NULL, Pbuffer, ierr) 119 !$OMP END CRITICAL (MPI) 120 DO i = 1, MaxBufferSize 121 MPI_Buffer(i) = i 122 ENDDO 123 124 CALL Associate_buffer(MPI_Buffer) 125 126 126 CONTAINS 127 128 129 IMPLICIT NONE130 REAL,DIMENSION(:),target :: MPI_Buffer131 132 Buffer=>MPI_Buffer133 134 135 127 128 SUBROUTINE Associate_buffer(MPI_Buffer) 129 IMPLICIT NONE 130 REAL, DIMENSION(:), target :: MPI_Buffer 131 132 Buffer => MPI_Buffer 133 134 END SUBROUTINE Associate_buffer 135 136 136 END SUBROUTINE create_global_mpi_buffer 137 138 139 SUBROUTINE allocate_buffer(Size, Index,Pos)140 141 IMPLICIT NONE137 138 139 SUBROUTINE allocate_buffer(Size, Index, Pos) 140 141 IMPLICIT NONE 142 142 INTEGER :: Size 143 143 INTEGER :: Index 144 144 INTEGER :: Pos 145 145 146 IF (Buffer_pos(Index_pos) +Size>MaxBufferSize_Used) MaxBufferSize_Used=Buffer_pos(Index_pos)+Size147 IF (Buffer_pos(Index_pos) +Size>MaxBufferSize) THEN148 print *, 'STOP :: La taille de MaxBufferSize dans mod_hallo.F90 est trop petite !!!!'149 CALL abort_gcm("mod_hallo", "stopped",1)146 IF (Buffer_pos(Index_pos) + Size>MaxBufferSize_Used) MaxBufferSize_Used = Buffer_pos(Index_pos) + Size 147 IF (Buffer_pos(Index_pos) + Size>MaxBufferSize) THEN 148 print *, 'STOP :: La taille de MaxBufferSize dans mod_hallo.F90 est trop petite !!!!' 149 CALL abort_gcm("mod_hallo", "stopped", 1) 150 150 endif 151 151 152 152 IF (Index_pos>=ListSize) THEN 153 print *, 'STOP :: La taille de ListSize dans mod_hallo.F90 est trop petite !!!!'154 CALL abort_gcm("mod_hallo", "stopped",1)153 print *, 'STOP :: La taille de ListSize dans mod_hallo.F90 est trop petite !!!!' 154 CALL abort_gcm("mod_hallo", "stopped", 1) 155 155 endif 156 157 Pos =Buffer_Pos(Index_Pos)158 Buffer_Pos(Index_pos +1)=Buffer_Pos(Index_Pos)+Size159 Index_Pos =Index_Pos+1160 Index =Index_Pos161 156 157 Pos = Buffer_Pos(Index_Pos) 158 Buffer_Pos(Index_pos + 1) = Buffer_Pos(Index_Pos) + Size 159 Index_Pos = Index_Pos + 1 160 Index = Index_Pos 161 162 162 END SUBROUTINE allocate_buffer 163 163 164 164 SUBROUTINE deallocate_buffer(Index) 165 IMPLICIT NONE165 IMPLICIT NONE 166 166 INTEGER :: Index 167 168 Buffer_Pos(Index) =-1169 167 168 Buffer_Pos(Index) = -1 169 170 170 DO while (Buffer_Pos(Index_Pos)==-1 .AND. Index_Pos>1) 171 Index_Pos =Index_Pos-1171 Index_Pos = Index_Pos - 1 172 172 END DO 173 173 174 174 END SUBROUTINE deallocate_buffer 175 176 SUBROUTINE SetTag(a_request, tag)177 IMPLICIT NONE178 type(request) :: a_request175 176 SUBROUTINE SetTag(a_request, tag) 177 IMPLICIT NONE 178 type(request) :: a_request 179 179 INTEGER :: tag 180 181 a_request%tag =tag180 181 a_request%tag = tag 182 182 END SUBROUTINE SetTag 183 184 185 SUBROUTINE New_Hallo(Field, Stride,NbLevel,offset,size,Ptr_request)183 184 185 SUBROUTINE New_Hallo(Field, Stride, NbLevel, offset, size, Ptr_request) 186 186 INTEGER :: Stride 187 187 INTEGER :: NbLevel 188 188 INTEGER :: size 189 189 INTEGER :: offset 190 REAL, DIMENSION(Stride, NbLevel),target :: Field191 type(request_SR), pointer :: Ptr_request192 type(Hallo), POINTER :: NewHallos(:),HalloSwitch(:), NewHallo193 194 Ptr_Request%NbRequest =Ptr_Request%NbRequest+1190 REAL, DIMENSION(Stride, NbLevel), target :: Field 191 type(request_SR), pointer :: Ptr_request 192 type(Hallo), POINTER :: NewHallos(:), HalloSwitch(:), NewHallo 193 194 Ptr_Request%NbRequest = Ptr_Request%NbRequest + 1 195 195 IF(Ptr_Request%NbRequestMax==0) THEN 196 Ptr_Request%NbRequestMax=10197 198 ELSE IF ( 199 Ptr_Request%NbRequestMax =INT(Ptr_Request%NbRequestMax*1.2)196 Ptr_Request%NbRequestMax = 10 197 ALLOCATE(Ptr_Request%Hallo(Ptr_Request%NbRequestMax)) 198 ELSE IF (Ptr_Request%NbRequest > Ptr_Request%NbRequestMax) THEN 199 Ptr_Request%NbRequestMax = INT(Ptr_Request%NbRequestMax * 1.2) 200 200 ALLOCATE(NewHallos(Ptr_Request%NbRequestMax)) 201 NewHallos(1:Ptr_Request%NbRequest -1)=Ptr_Request%hallo(1:Ptr_Request%NbRequest-1)202 HalloSwitch =>Ptr_Request%hallo203 Ptr_Request%hallo =>NewHallos201 NewHallos(1:Ptr_Request%NbRequest - 1) = Ptr_Request%hallo(1:Ptr_Request%NbRequest - 1) 202 HalloSwitch => Ptr_Request%hallo 203 Ptr_Request%hallo => NewHallos 204 204 DEALLOCATE(HalloSwitch) 205 205 ENDIF 206 207 NewHallo =>Ptr_Request%hallo(Ptr_Request%NbRequest)208 209 NewHallo%Field =>Field210 NewHallo%Stride =Stride211 NewHallo%NbLevel =NbLevel212 NewHallo%size =size213 NewHallo%offset =offset214 206 207 NewHallo => Ptr_Request%hallo(Ptr_Request%NbRequest) 208 209 NewHallo%Field => Field 210 NewHallo%Stride = Stride 211 NewHallo%NbLevel = NbLevel 212 NewHallo%size = size 213 NewHallo%offset = offset 214 215 215 END SUBROUTINE New_Hallo 216 217 SUBROUTINE Register_SendField(Field,ij,ll,offset,size,target,a_request) 218 USE dimensions_mod 219 IMPLICIT NONE 220 221 222 INTEGER :: ij,ll,offset,size,target 223 REAL, DIMENSION(ij,ll) :: Field 224 type(request),target :: a_request 225 type(request_SR),pointer :: Ptr_request 226 227 Ptr_Request=>a_request%RequestSend(target) 228 229 CALL New_Hallo(Field,ij,ll,offset,size,Ptr_request) 230 231 END SUBROUTINE Register_SendField 232 233 SUBROUTINE Register_RecvField(Field,ij,ll,offset,size,target,a_request) 234 USE dimensions_mod 235 IMPLICIT NONE 236 237 238 INTEGER :: ij,ll,offset,size,target 239 REAL, DIMENSION(ij,ll) :: Field 240 type(request),target :: a_request 241 type(request_SR),pointer :: Ptr_request 242 243 Ptr_Request=>a_request%RequestRecv(target) 244 245 CALL New_Hallo(Field,ij,ll,offset,size,Ptr_request) 246 247 248 END SUBROUTINE Register_RecvField 249 250 SUBROUTINE Register_SwapField(FieldS,FieldR,ij,ll,jj_Nb_New,a_request) 251 USE dimensions_mod 252 IMPLICIT NONE 253 254 255 INTEGER :: ij,ll 256 REAL, DIMENSION(ij,ll) :: FieldS 257 REAL, DIMENSION(ij,ll) :: FieldR 216 217 SUBROUTINE Register_SendField(Field, ij, ll, offset, size, target, a_request) 218 USE lmdz_dimensions 219 USE lmdz_paramet 220 IMPLICIT NONE 221 222 INTEGER :: ij, ll, offset, size, target 223 REAL, DIMENSION(ij, ll) :: Field 224 type(request), target :: a_request 225 type(request_SR), pointer :: Ptr_request 226 227 Ptr_Request => a_request%RequestSend(target) 228 229 CALL New_Hallo(Field, ij, ll, offset, size, Ptr_request) 230 231 END SUBROUTINE Register_SendField 232 233 SUBROUTINE Register_RecvField(Field, ij, ll, offset, size, target, a_request) 234 USE lmdz_dimensions 235 USE lmdz_paramet 236 IMPLICIT NONE 237 238 INTEGER :: ij, ll, offset, size, target 239 REAL, DIMENSION(ij, ll) :: Field 240 type(request), target :: a_request 241 type(request_SR), pointer :: Ptr_request 242 243 Ptr_Request => a_request%RequestRecv(target) 244 245 CALL New_Hallo(Field, ij, ll, offset, size, Ptr_request) 246 247 END SUBROUTINE Register_RecvField 248 249 SUBROUTINE Register_SwapField(FieldS, FieldR, ij, ll, jj_Nb_New, a_request) 250 USE lmdz_dimensions 251 USE lmdz_paramet 252 IMPLICIT NONE 253 254 INTEGER :: ij, ll 255 REAL, DIMENSION(ij, ll) :: FieldS 256 REAL, DIMENSION(ij, ll) :: FieldR 258 257 type(request) :: a_request 259 INTEGER, DIMENSION(0:MPI_Size-1) :: jj_Nb_New260 INTEGER, DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New261 262 INTEGER :: i,jje,jjb263 264 jj_begin_New(0) =1265 jj_End_New(0) =jj_Nb_New(0)266 DO i =1,MPI_Size-1267 jj_begin_New(i) =jj_end_New(i-1)+1268 jj_end_New(i) =jj_begin_new(i)+jj_Nb_New(i)-1258 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Nb_New 259 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Begin_New, jj_End_New 260 261 INTEGER :: i, jje, jjb 262 263 jj_begin_New(0) = 1 264 jj_End_New(0) = jj_Nb_New(0) 265 DO i = 1, MPI_Size - 1 266 jj_begin_New(i) = jj_end_New(i - 1) + 1 267 jj_end_New(i) = jj_begin_new(i) + jj_Nb_New(i) - 1 269 268 enddo 270 271 DO i =0,MPI_Size-1269 270 DO i = 0, MPI_Size - 1 272 271 IF (i /= MPI_Rank) THEN 273 jjb =max(jj_begin_new(i),jj_begin)274 jje =min(jj_end_new(i),jj_end)275 276 IF (ij==ip1jm .AND. jje==jjp1) jje =jjm277 272 jjb = max(jj_begin_new(i), jj_begin) 273 jje = min(jj_end_new(i), jj_end) 274 275 IF (ij==ip1jm .AND. jje==jjp1) jje = jjm 276 278 277 IF (jje >= jjb) THEN 279 CALL Register_SendField(FieldS, ij,ll,jjb,jje-jjb+1,i,a_request)278 CALL Register_SendField(FieldS, ij, ll, jjb, jje - jjb + 1, i, a_request) 280 279 endif 281 282 jjb =max(jj_begin_new(MPI_Rank),jj_begin_Para(i))283 jje =min(jj_end_new(MPI_Rank),jj_end_Para(i))284 285 IF (ij==ip1jm .AND. jje==jjp1) jje =jjm286 280 281 jjb = max(jj_begin_new(MPI_Rank), jj_begin_Para(i)) 282 jje = min(jj_end_new(MPI_Rank), jj_end_Para(i)) 283 284 IF (ij==ip1jm .AND. jje==jjp1) jje = jjm 285 287 286 IF (jje >= jjb) THEN 288 CALL Register_RecvField(FieldR, ij,ll,jjb,jje-jjb+1,i,a_request)287 CALL Register_RecvField(FieldR, ij, ll, jjb, jje - jjb + 1, i, a_request) 289 288 endif 290 289 291 290 endif 292 291 enddo 293 292 294 293 END SUBROUTINE Register_SwapField 295 296 297 298 SUBROUTINE Register_SwapFieldHallo(FieldS,FieldR,ij,ll,jj_Nb_New,Up,Down,a_request)299 USE dimensions_mod300 301 302 303 INTEGER :: ij, ll,Up,Down304 REAL, DIMENSION(ij, ll) :: FieldS305 REAL, DIMENSION(ij, ll) :: FieldR294 295 296 SUBROUTINE Register_SwapFieldHallo(FieldS, FieldR, ij, ll, jj_Nb_New, Up, Down, a_request) 297 USE lmdz_dimensions 298 USE lmdz_paramet 299 300 IMPLICIT NONE 301 302 INTEGER :: ij, ll, Up, Down 303 REAL, DIMENSION(ij, ll) :: FieldS 304 REAL, DIMENSION(ij, ll) :: FieldR 306 305 type(request) :: a_request 307 INTEGER, DIMENSION(0:MPI_Size-1) :: jj_Nb_New308 INTEGER, DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New309 310 INTEGER :: i,jje,jjb311 312 jj_begin_New(0) =1313 jj_End_New(0) =jj_Nb_New(0)314 DO i =1,MPI_Size-1315 jj_begin_New(i) =jj_end_New(i-1)+1316 jj_end_New(i) =jj_begin_new(i)+jj_Nb_New(i)-1306 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Nb_New 307 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Begin_New, jj_End_New 308 309 INTEGER :: i, jje, jjb 310 311 jj_begin_New(0) = 1 312 jj_End_New(0) = jj_Nb_New(0) 313 DO i = 1, MPI_Size - 1 314 jj_begin_New(i) = jj_end_New(i - 1) + 1 315 jj_end_New(i) = jj_begin_new(i) + jj_Nb_New(i) - 1 317 316 enddo 318 319 DO i =0,MPI_Size-1320 jj_begin_New(i) =max(1,jj_begin_New(i)-Up)321 jj_end_New(i) =min(jjp1,jj_end_new(i)+Down)317 318 DO i = 0, MPI_Size - 1 319 jj_begin_New(i) = max(1, jj_begin_New(i) - Up) 320 jj_end_New(i) = min(jjp1, jj_end_new(i) + Down) 322 321 enddo 323 324 DO i =0,MPI_Size-1322 323 DO i = 0, MPI_Size - 1 325 324 IF (i /= MPI_Rank) THEN 326 jjb =max(jj_begin_new(i),jj_begin)327 jje =min(jj_end_new(i),jj_end)328 329 IF (ij==ip1jm .AND. jje==jjp1) jje =jjm330 325 jjb = max(jj_begin_new(i), jj_begin) 326 jje = min(jj_end_new(i), jj_end) 327 328 IF (ij==ip1jm .AND. jje==jjp1) jje = jjm 329 331 330 IF (jje >= jjb) THEN 332 CALL Register_SendField(FieldS, ij,ll,jjb,jje-jjb+1,i,a_request)331 CALL Register_SendField(FieldS, ij, ll, jjb, jje - jjb + 1, i, a_request) 333 332 endif 334 335 jjb =max(jj_begin_new(MPI_Rank),jj_begin_Para(i))336 jje =min(jj_end_new(MPI_Rank),jj_end_Para(i))337 338 IF (ij==ip1jm .AND. jje==jjp1) jje =jjm339 333 334 jjb = max(jj_begin_new(MPI_Rank), jj_begin_Para(i)) 335 jje = min(jj_end_new(MPI_Rank), jj_end_Para(i)) 336 337 IF (ij==ip1jm .AND. jje==jjp1) jje = jjm 338 340 339 IF (jje >= jjb) THEN 341 CALL Register_RecvField(FieldR, ij,ll,jjb,jje-jjb+1,i,a_request)340 CALL Register_RecvField(FieldR, ij, ll, jjb, jje - jjb + 1, i, a_request) 342 341 endif 343 342 344 343 endif 345 344 enddo 346 345 347 346 END SUBROUTINE Register_SwapFieldHallo 348 347 349 348 350 351 SUBROUTINE Register_SwapField1d_u(FieldS,FieldR,new_dist,a_request,up,down) 352 USE parallel_lmdz 353 USE dimensions_mod 354 IMPLICIT NONE 355 356 TYPE(distrib),INTENT(IN) :: new_dist 357 REAL, DIMENSION(current_dist%ijb_u:),INTENT(IN) :: FieldS 358 REAL, DIMENSION(new_dist%ijb_u:),INTENT(OUT) :: FieldR 359 INTEGER,OPTIONAL,INTENT(IN) :: up 360 INTEGER,OPTIONAL,INTENT(IN) :: down 361 TYPE(request),INTENT(INOUT) :: a_request 362 363 INTEGER :: halo_up 364 INTEGER :: halo_down 365 366 367 halo_up=0 368 halo_down=0 369 IF (PRESENT(up)) halo_up=up 370 IF (PRESENT(down)) halo_down=down 371 372 CALL Register_SwapField_gen_u(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request) 373 374 END SUBROUTINE Register_SwapField1d_u 375 376 SUBROUTINE Register_SwapField1d_u_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down) 377 USE parallel_lmdz 378 USE dimensions_mod 379 IMPLICIT NONE 380 381 TYPE(distrib),INTENT(IN) :: new_dist 382 TYPE(distrib),INTENT(IN) :: old_dist 383 REAL, DIMENSION(old_dist%ijb_u:),INTENT(IN) :: FieldS 384 REAL, DIMENSION(new_dist%ijb_u:),INTENT(OUT) :: FieldR 385 INTEGER,OPTIONAL,INTENT(IN) :: up 386 INTEGER,OPTIONAL,INTENT(IN) :: down 387 TYPE(request),INTENT(INOUT) :: a_request 388 389 INTEGER :: halo_up 390 INTEGER :: halo_down 391 392 393 halo_up=0 394 halo_down=0 395 IF (PRESENT(up)) halo_up=up 396 IF (PRESENT(down)) halo_down=down 397 398 CALL Register_SwapField_gen_u(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request) 399 400 END SUBROUTINE Register_SwapField1d_u_bis 401 402 403 SUBROUTINE Register_SwapField2d_u1d(FieldS,FieldR,new_dist,a_request,up,down) 404 USE parallel_lmdz 405 USE dimensions_mod 406 IMPLICIT NONE 407 408 TYPE(distrib),INTENT(IN) :: new_dist 409 REAL, DIMENSION(current_dist%ijb_u:,:),INTENT(IN) :: FieldS 410 REAL, DIMENSION(new_dist%ijb_u:,:),INTENT(OUT) :: FieldR 411 INTEGER,OPTIONAL,INTENT(IN) :: up 412 INTEGER,OPTIONAL,INTENT(IN) :: down 413 TYPE(request),INTENT(INOUT) :: a_request 414 415 INTEGER :: halo_up 416 INTEGER :: halo_down 417 INTEGER :: ll 418 419 420 halo_up=0 421 halo_down=0 422 IF (PRESENT(up)) halo_up=up 423 IF (PRESENT(down)) halo_down=down 424 425 ll=size(FieldS,2) 426 427 CALL Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request) 428 349 SUBROUTINE Register_SwapField1d_u(FieldS, FieldR, new_dist, a_request, up, down) 350 USE parallel_lmdz 351 USE lmdz_dimensions 352 USE lmdz_paramet 353 IMPLICIT NONE 354 355 TYPE(distrib), INTENT(IN) :: new_dist 356 REAL, DIMENSION(current_dist%ijb_u:), INTENT(IN) :: FieldS 357 REAL, DIMENSION(new_dist%ijb_u:), INTENT(OUT) :: FieldR 358 INTEGER, OPTIONAL, INTENT(IN) :: up 359 INTEGER, OPTIONAL, INTENT(IN) :: down 360 TYPE(request), INTENT(INOUT) :: a_request 361 362 INTEGER :: halo_up 363 INTEGER :: halo_down 364 365 halo_up = 0 366 halo_down = 0 367 IF (PRESENT(up)) halo_up = up 368 IF (PRESENT(down)) halo_down = down 369 370 CALL Register_SwapField_gen_u(FieldS, FieldR, 1, current_dist, new_dist, halo_up, halo_down, a_request) 371 372 END SUBROUTINE Register_SwapField1d_u 373 374 SUBROUTINE Register_SwapField1d_u_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 375 USE parallel_lmdz 376 USE lmdz_dimensions 377 USE lmdz_paramet 378 IMPLICIT NONE 379 380 TYPE(distrib), INTENT(IN) :: new_dist 381 TYPE(distrib), INTENT(IN) :: old_dist 382 REAL, DIMENSION(old_dist%ijb_u:), INTENT(IN) :: FieldS 383 REAL, DIMENSION(new_dist%ijb_u:), INTENT(OUT) :: FieldR 384 INTEGER, OPTIONAL, INTENT(IN) :: up 385 INTEGER, OPTIONAL, INTENT(IN) :: down 386 TYPE(request), INTENT(INOUT) :: a_request 387 388 INTEGER :: halo_up 389 INTEGER :: halo_down 390 391 halo_up = 0 392 halo_down = 0 393 IF (PRESENT(up)) halo_up = up 394 IF (PRESENT(down)) halo_down = down 395 396 CALL Register_SwapField_gen_u(FieldS, FieldR, 1, old_dist, new_dist, halo_up, halo_down, a_request) 397 398 END SUBROUTINE Register_SwapField1d_u_bis 399 400 401 SUBROUTINE Register_SwapField2d_u1d(FieldS, FieldR, new_dist, a_request, up, down) 402 USE parallel_lmdz 403 USE lmdz_dimensions 404 USE lmdz_paramet 405 IMPLICIT NONE 406 407 TYPE(distrib), INTENT(IN) :: new_dist 408 REAL, DIMENSION(current_dist%ijb_u:, :), INTENT(IN) :: FieldS 409 REAL, DIMENSION(new_dist%ijb_u:, :), INTENT(OUT) :: FieldR 410 INTEGER, OPTIONAL, INTENT(IN) :: up 411 INTEGER, OPTIONAL, INTENT(IN) :: down 412 TYPE(request), INTENT(INOUT) :: a_request 413 414 INTEGER :: halo_up 415 INTEGER :: halo_down 416 INTEGER :: ll 417 418 halo_up = 0 419 halo_down = 0 420 IF (PRESENT(up)) halo_up = up 421 IF (PRESENT(down)) halo_down = down 422 423 ll = size(FieldS, 2) 424 425 CALL Register_SwapField_gen_u(FieldS, FieldR, ll, current_dist, new_dist, halo_up, halo_down, a_request) 426 429 427 END SUBROUTINE Register_SwapField2d_u1d 430 428 431 SUBROUTINE Register_SwapField2d_u1d_bis(FieldS, FieldR,new_dist,a_request,old_dist,up,down)432 USE parallel_lmdz433 USE dimensions_mod434 IMPLICIT NONE435 436 TYPE(distrib),INTENT(IN) :: new_dist 437 TYPE(distrib), INTENT(IN) :: old_dist438 REAL, DIMENSION(old_dist%ijb_u:,:),INTENT(IN) :: FieldS439 REAL, DIMENSION( new_dist%ijb_u:,:),INTENT(OUT) :: FieldR440 INTEGER,OPTIONAL,INTENT(IN) :: up441 INTEGER, OPTIONAL,INTENT(IN) :: down442 TYPE(request),INTENT(INOUT) :: a_request443 444 INTEGER :: halo_up 445 INTEGER :: halo_down446 INTEGER :: ll447 448 449 halo_up =0450 halo_down =0451 IF (PRESENT(up)) halo_up =up452 IF (PRESENT(down)) halo_down =down453 454 ll =size(FieldS,2)455 456 CALL Register_SwapField_gen_u(FieldS, FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)457 429 SUBROUTINE Register_SwapField2d_u1d_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 430 USE parallel_lmdz 431 USE lmdz_dimensions 432 USE lmdz_paramet 433 IMPLICIT NONE 434 435 TYPE(distrib), INTENT(IN) :: new_dist 436 TYPE(distrib), INTENT(IN) :: old_dist 437 REAL, DIMENSION(old_dist%ijb_u:, :), INTENT(IN) :: FieldS 438 REAL, DIMENSION(new_dist%ijb_u:, :), INTENT(OUT) :: FieldR 439 INTEGER, OPTIONAL, INTENT(IN) :: up 440 INTEGER, OPTIONAL, INTENT(IN) :: down 441 TYPE(request), INTENT(INOUT) :: a_request 442 443 INTEGER :: halo_up 444 INTEGER :: halo_down 445 INTEGER :: ll 446 447 halo_up = 0 448 halo_down = 0 449 IF (PRESENT(up)) halo_up = up 450 IF (PRESENT(down)) halo_down = down 451 452 ll = size(FieldS, 2) 453 454 CALL Register_SwapField_gen_u(FieldS, FieldR, ll, old_dist, new_dist, halo_up, halo_down, a_request) 455 458 456 END SUBROUTINE Register_SwapField2d_u1d_bis 459 460 461 SUBROUTINE Register_SwapField3d_u(FieldS,FieldR,new_dist,a_request,up,down) 462 USE parallel_lmdz 463 USE dimensions_mod 464 IMPLICIT NONE 465 466 TYPE(distrib),INTENT(IN) :: new_dist 467 REAL, DIMENSION(current_dist%ijb_u:,:,:),INTENT(IN) :: FieldS 468 REAL, DIMENSION(new_dist%ijb_u:,:,:),INTENT(OUT) :: FieldR 469 INTEGER,OPTIONAL,INTENT(IN) :: up 470 INTEGER,OPTIONAL,INTENT(IN) :: down 471 TYPE(request),INTENT(INOUT) :: a_request 472 473 INTEGER :: halo_up 474 INTEGER :: halo_down 475 INTEGER :: ll 476 477 478 halo_up=0 479 halo_down=0 480 IF (PRESENT(up)) halo_up=up 481 IF (PRESENT(down)) halo_down=down 482 483 ll=size(FieldS,2)*size(FieldS,3) 484 485 CALL Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request) 486 487 END SUBROUTINE Register_SwapField3d_u 488 489 SUBROUTINE Register_SwapField3d_u_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down) 490 USE parallel_lmdz 491 USE dimensions_mod 492 IMPLICIT NONE 493 494 TYPE(distrib),INTENT(IN) :: new_dist 495 TYPE(distrib),INTENT(IN) :: old_dist 496 REAL, DIMENSION(old_dist%ijb_u:,:,:),INTENT(IN) :: FieldS 497 REAL, DIMENSION(new_dist%ijb_u:,:,:),INTENT(OUT) :: FieldR 498 INTEGER,OPTIONAL,INTENT(IN) :: up 499 INTEGER,OPTIONAL,INTENT(IN) :: down 500 TYPE(request),INTENT(INOUT) :: a_request 501 502 INTEGER :: halo_up 503 INTEGER :: halo_down 504 INTEGER :: ll 505 506 507 halo_up=0 508 halo_down=0 509 IF (PRESENT(up)) halo_up=up 510 IF (PRESENT(down)) halo_down=down 511 512 ll=size(FieldS,2)*size(FieldS,3) 513 514 CALL Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request) 515 516 END SUBROUTINE Register_SwapField3d_u_bis 517 518 519 520 SUBROUTINE Register_SwapField1d_u2d(FieldS,FieldR,new_dist,a_request,up,down) 521 USE parallel_lmdz 522 USE dimensions_mod 523 524 IMPLICIT NONE 525 526 TYPE(distrib),INTENT(IN) :: new_dist !LF 527 REAL, DIMENSION(current_dist%jjb_u:,:),INTENT(IN) :: FieldS 528 REAL, DIMENSION(new_dist%jjb_u:,:),INTENT(OUT) :: FieldR 529 INTEGER,OPTIONAL,INTENT(IN) :: up 530 INTEGER,OPTIONAL,INTENT(IN) :: down 531 TYPE(request),INTENT(INOUT) :: a_request 532 533 INTEGER :: halo_up 534 INTEGER :: halo_down 535 536 537 halo_up=0 538 halo_down=0 539 IF (PRESENT(up)) halo_up=up 540 IF (PRESENT(down)) halo_down=down 541 542 CALL Register_SwapField_gen_u(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request) 543 544 END SUBROUTINE Register_SwapField1d_u2d 545 546 SUBROUTINE Register_SwapField1d_u2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down) 547 USE parallel_lmdz 548 USE dimensions_mod 549 550 IMPLICIT NONE 551 552 TYPE(distrib),INTENT(IN) :: new_dist !LF 553 TYPE(distrib),INTENT(IN) :: old_dist 554 REAL, DIMENSION(old_dist%jjb_u:,:),INTENT(IN) :: FieldS 555 REAL, DIMENSION(new_dist%jjb_u:,:),INTENT(OUT) :: FieldR 556 INTEGER,OPTIONAL,INTENT(IN) :: up 557 INTEGER,OPTIONAL,INTENT(IN) :: down 558 TYPE(request),INTENT(INOUT) :: a_request 559 560 INTEGER :: halo_up 561 INTEGER :: halo_down 562 563 564 halo_up=0 565 halo_down=0 566 IF (PRESENT(up)) halo_up=up 567 IF (PRESENT(down)) halo_down=down 568 569 CALL Register_SwapField_gen_u(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request) 570 571 END SUBROUTINE Register_SwapField1d_u2d_bis 572 573 574 SUBROUTINE Register_SwapField2d_u2d(FieldS,FieldR,new_dist,a_request,up,down) 575 USE parallel_lmdz 576 USE dimensions_mod 577 578 IMPLICIT NONE 579 580 TYPE(distrib),INTENT(IN) :: new_dist 581 REAL, DIMENSION(current_dist%jjb_u:,:,:),INTENT(IN) :: FieldS 582 REAL, DIMENSION(new_dist%jjb_u:,:,:),INTENT(OUT) :: FieldR 583 INTEGER,OPTIONAL,INTENT(IN) :: up 584 INTEGER,OPTIONAL,INTENT(IN) :: down 585 TYPE(request),INTENT(INOUT) :: a_request 586 587 INTEGER :: halo_up 588 INTEGER :: halo_down 589 INTEGER :: ll 590 591 592 halo_up=0 593 halo_down=0 594 IF (PRESENT(up)) halo_up=up 595 IF (PRESENT(down)) halo_down=down 596 597 ll=size(FieldS,3) 598 599 CALL Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request) 600 457 458 459 SUBROUTINE Register_SwapField3d_u(FieldS, FieldR, new_dist, a_request, up, down) 460 USE parallel_lmdz 461 USE lmdz_dimensions 462 USE lmdz_paramet 463 IMPLICIT NONE 464 465 TYPE(distrib), INTENT(IN) :: new_dist 466 REAL, DIMENSION(current_dist%ijb_u:, :, :), INTENT(IN) :: FieldS 467 REAL, DIMENSION(new_dist%ijb_u:, :, :), INTENT(OUT) :: FieldR 468 INTEGER, OPTIONAL, INTENT(IN) :: up 469 INTEGER, OPTIONAL, INTENT(IN) :: down 470 TYPE(request), INTENT(INOUT) :: a_request 471 472 INTEGER :: halo_up 473 INTEGER :: halo_down 474 INTEGER :: ll 475 476 halo_up = 0 477 halo_down = 0 478 IF (PRESENT(up)) halo_up = up 479 IF (PRESENT(down)) halo_down = down 480 481 ll = size(FieldS, 2) * size(FieldS, 3) 482 483 CALL Register_SwapField_gen_u(FieldS, FieldR, ll, current_dist, new_dist, halo_up, halo_down, a_request) 484 485 END SUBROUTINE Register_SwapField3d_u 486 487 SUBROUTINE Register_SwapField3d_u_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 488 USE parallel_lmdz 489 USE lmdz_dimensions 490 USE lmdz_paramet 491 IMPLICIT NONE 492 493 TYPE(distrib), INTENT(IN) :: new_dist 494 TYPE(distrib), INTENT(IN) :: old_dist 495 REAL, DIMENSION(old_dist%ijb_u:, :, :), INTENT(IN) :: FieldS 496 REAL, DIMENSION(new_dist%ijb_u:, :, :), INTENT(OUT) :: FieldR 497 INTEGER, OPTIONAL, INTENT(IN) :: up 498 INTEGER, OPTIONAL, INTENT(IN) :: down 499 TYPE(request), INTENT(INOUT) :: a_request 500 501 INTEGER :: halo_up 502 INTEGER :: halo_down 503 INTEGER :: ll 504 505 halo_up = 0 506 halo_down = 0 507 IF (PRESENT(up)) halo_up = up 508 IF (PRESENT(down)) halo_down = down 509 510 ll = size(FieldS, 2) * size(FieldS, 3) 511 512 CALL Register_SwapField_gen_u(FieldS, FieldR, ll, old_dist, new_dist, halo_up, halo_down, a_request) 513 514 END SUBROUTINE Register_SwapField3d_u_bis 515 516 517 SUBROUTINE Register_SwapField1d_u2d(FieldS, FieldR, new_dist, a_request, up, down) 518 USE parallel_lmdz 519 USE lmdz_dimensions 520 USE lmdz_paramet 521 522 IMPLICIT NONE 523 524 TYPE(distrib), INTENT(IN) :: new_dist !LF 525 REAL, DIMENSION(current_dist%jjb_u:, :), INTENT(IN) :: FieldS 526 REAL, DIMENSION(new_dist%jjb_u:, :), INTENT(OUT) :: FieldR 527 INTEGER, OPTIONAL, INTENT(IN) :: up 528 INTEGER, OPTIONAL, INTENT(IN) :: down 529 TYPE(request), INTENT(INOUT) :: a_request 530 531 INTEGER :: halo_up 532 INTEGER :: halo_down 533 534 halo_up = 0 535 halo_down = 0 536 IF (PRESENT(up)) halo_up = up 537 IF (PRESENT(down)) halo_down = down 538 539 CALL Register_SwapField_gen_u(FieldS, FieldR, 1, current_dist, new_dist, halo_up, halo_down, a_request) 540 541 END SUBROUTINE Register_SwapField1d_u2d 542 543 SUBROUTINE Register_SwapField1d_u2d_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 544 USE parallel_lmdz 545 USE lmdz_dimensions 546 USE lmdz_paramet 547 548 IMPLICIT NONE 549 550 TYPE(distrib), INTENT(IN) :: new_dist !LF 551 TYPE(distrib), INTENT(IN) :: old_dist 552 REAL, DIMENSION(old_dist%jjb_u:, :), INTENT(IN) :: FieldS 553 REAL, DIMENSION(new_dist%jjb_u:, :), INTENT(OUT) :: FieldR 554 INTEGER, OPTIONAL, INTENT(IN) :: up 555 INTEGER, OPTIONAL, INTENT(IN) :: down 556 TYPE(request), INTENT(INOUT) :: a_request 557 558 INTEGER :: halo_up 559 INTEGER :: halo_down 560 561 halo_up = 0 562 halo_down = 0 563 IF (PRESENT(up)) halo_up = up 564 IF (PRESENT(down)) halo_down = down 565 566 CALL Register_SwapField_gen_u(FieldS, FieldR, 1, old_dist, new_dist, halo_up, halo_down, a_request) 567 568 END SUBROUTINE Register_SwapField1d_u2d_bis 569 570 571 SUBROUTINE Register_SwapField2d_u2d(FieldS, FieldR, new_dist, a_request, up, down) 572 USE parallel_lmdz 573 USE lmdz_dimensions 574 USE lmdz_paramet 575 576 IMPLICIT NONE 577 578 TYPE(distrib), INTENT(IN) :: new_dist 579 REAL, DIMENSION(current_dist%jjb_u:, :, :), INTENT(IN) :: FieldS 580 REAL, DIMENSION(new_dist%jjb_u:, :, :), INTENT(OUT) :: FieldR 581 INTEGER, OPTIONAL, INTENT(IN) :: up 582 INTEGER, OPTIONAL, INTENT(IN) :: down 583 TYPE(request), INTENT(INOUT) :: a_request 584 585 INTEGER :: halo_up 586 INTEGER :: halo_down 587 INTEGER :: ll 588 589 halo_up = 0 590 halo_down = 0 591 IF (PRESENT(up)) halo_up = up 592 IF (PRESENT(down)) halo_down = down 593 594 ll = size(FieldS, 3) 595 596 CALL Register_SwapField_gen_u(FieldS, FieldR, ll, current_dist, new_dist, halo_up, halo_down, a_request) 597 601 598 END SUBROUTINE Register_SwapField2d_u2d 602 599 603 SUBROUTINE Register_SwapField2d_u2d_bis(FieldS, FieldR,new_dist,a_request,old_dist,up,down)604 USE parallel_lmdz605 USE dimensions_mod606 607 IMPLICIT NONE 608 609 TYPE(distrib),INTENT(IN) :: new_dist 610 TYPE(distrib), INTENT(IN) :: old_dist611 REAL, DIMENSION(old_dist%jjb_u:,:,:),INTENT(IN) :: FieldS612 REAL, DIMENSION( new_dist%jjb_u:,:,:),INTENT(OUT) :: FieldR613 INTEGER,OPTIONAL,INTENT(IN) :: up614 INTEGER, OPTIONAL,INTENT(IN) :: down615 TYPE(request),INTENT(INOUT) :: a_request616 617 INTEGER :: halo_up 618 INTEGER :: halo_down619 INTEGER :: ll620 621 622 halo_up =0623 halo_down =0624 IF (PRESENT(up)) halo_up =up625 IF (PRESENT(down)) halo_down =down626 627 ll =size(FieldS,3)628 629 CALL Register_SwapField_gen_u(FieldS, FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)630 600 SUBROUTINE Register_SwapField2d_u2d_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 601 USE parallel_lmdz 602 USE lmdz_dimensions 603 USE lmdz_paramet 604 605 IMPLICIT NONE 606 607 TYPE(distrib), INTENT(IN) :: new_dist 608 TYPE(distrib), INTENT(IN) :: old_dist 609 REAL, DIMENSION(old_dist%jjb_u:, :, :), INTENT(IN) :: FieldS 610 REAL, DIMENSION(new_dist%jjb_u:, :, :), INTENT(OUT) :: FieldR 611 INTEGER, OPTIONAL, INTENT(IN) :: up 612 INTEGER, OPTIONAL, INTENT(IN) :: down 613 TYPE(request), INTENT(INOUT) :: a_request 614 615 INTEGER :: halo_up 616 INTEGER :: halo_down 617 INTEGER :: ll 618 619 halo_up = 0 620 halo_down = 0 621 IF (PRESENT(up)) halo_up = up 622 IF (PRESENT(down)) halo_down = down 623 624 ll = size(FieldS, 3) 625 626 CALL Register_SwapField_gen_u(FieldS, FieldR, ll, old_dist, new_dist, halo_up, halo_down, a_request) 627 631 628 END SUBROUTINE Register_SwapField2d_u2d_bis 632 633 634 SUBROUTINE Register_SwapField3d_u2d(FieldS,FieldR,new_dist,a_request,up,down) 635 USE parallel_lmdz 636 USE dimensions_mod 637 IMPLICIT NONE 638 639 TYPE(distrib),INTENT(IN) :: new_dist 640 REAL, DIMENSION(current_dist%jjb_u:,:,:,:),INTENT(IN) :: FieldS 641 REAL, DIMENSION(new_dist%jjb_u:,:,:,:),INTENT(OUT) :: FieldR 642 INTEGER,OPTIONAL,INTENT(IN) :: up 643 INTEGER,OPTIONAL,INTENT(IN) :: down 644 TYPE(request),INTENT(INOUT) :: a_request 645 646 INTEGER :: halo_up 647 INTEGER :: halo_down 648 INTEGER :: ll 649 650 651 halo_up=0 652 halo_down=0 653 IF (PRESENT(up)) halo_up=up 654 IF (PRESENT(down)) halo_down=down 655 656 ll=size(FieldS,3)*size(FieldS,4) 657 658 CALL Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request) 659 660 END SUBROUTINE Register_SwapField3d_u2d 661 662 SUBROUTINE Register_SwapField3d_u2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down) 663 USE parallel_lmdz 664 USE dimensions_mod 665 IMPLICIT NONE 666 667 TYPE(distrib),INTENT(IN) :: new_dist 668 TYPE(distrib),INTENT(IN) :: old_dist 669 REAL, DIMENSION(old_dist%jjb_u:,:,:,:),INTENT(IN) :: FieldS 670 REAL, DIMENSION(new_dist%jjb_u:,:,:,:),INTENT(OUT) :: FieldR 671 INTEGER,OPTIONAL,INTENT(IN) :: up 672 INTEGER,OPTIONAL,INTENT(IN) :: down 673 TYPE(request),INTENT(INOUT) :: a_request 674 675 INTEGER :: halo_up 676 INTEGER :: halo_down 677 INTEGER :: ll 678 679 680 halo_up=0 681 halo_down=0 682 IF (PRESENT(up)) halo_up=up 683 IF (PRESENT(down)) halo_down=down 684 685 ll=size(FieldS,3)*size(FieldS,4) 686 687 CALL Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request) 688 689 END SUBROUTINE Register_SwapField3d_u2d_bis 690 691 692 693 694 695 696 697 SUBROUTINE Register_SwapField1d_v(FieldS,FieldR,new_dist,a_request,up,down) 698 USE parallel_lmdz 699 USE dimensions_mod 700 IMPLICIT NONE 701 702 TYPE(distrib),INTENT(IN) :: new_dist 703 REAL, DIMENSION(current_dist%ijb_v:),INTENT(IN) :: FieldS 704 REAL, DIMENSION(new_dist%ijb_v:),INTENT(OUT) :: FieldR 705 INTEGER,OPTIONAL,INTENT(IN) :: up 706 INTEGER,OPTIONAL,INTENT(IN) :: down 707 TYPE(request),INTENT(INOUT) :: a_request 708 709 INTEGER :: halo_up 710 INTEGER :: halo_down 711 712 713 halo_up=0 714 halo_down=0 715 IF (PRESENT(up)) halo_up=up 716 IF (PRESENT(down)) halo_down=down 717 718 CALL Register_SwapField_gen_v(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request) 719 720 END SUBROUTINE Register_SwapField1d_v 721 722 SUBROUTINE Register_SwapField1d_v_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down) 723 USE parallel_lmdz 724 USE dimensions_mod 725 IMPLICIT NONE 726 727 TYPE(distrib),INTENT(IN) :: new_dist 728 TYPE(distrib),INTENT(IN) :: old_dist 729 REAL, DIMENSION(old_dist%ijb_v:),INTENT(IN) :: FieldS 730 REAL, DIMENSION(new_dist%ijb_v:),INTENT(OUT) :: FieldR 731 INTEGER,OPTIONAL,INTENT(IN) :: up 732 INTEGER,OPTIONAL,INTENT(IN) :: down 733 TYPE(request),INTENT(INOUT) :: a_request 734 735 INTEGER :: halo_up 736 INTEGER :: halo_down 737 738 739 halo_up=0 740 halo_down=0 741 IF (PRESENT(up)) halo_up=up 742 IF (PRESENT(down)) halo_down=down 743 744 CALL Register_SwapField_gen_v(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request) 745 746 END SUBROUTINE Register_SwapField1d_v_bis 747 748 749 SUBROUTINE Register_SwapField2d_v1d(FieldS,FieldR,new_dist,a_request,up,down) 750 USE parallel_lmdz 751 USE dimensions_mod 752 IMPLICIT NONE 753 754 TYPE(distrib),INTENT(IN) :: new_dist 755 REAL, DIMENSION(current_dist%ijb_v:,:),INTENT(IN) :: FieldS 756 REAL, DIMENSION(new_dist%ijb_v:,:),INTENT(OUT) :: FieldR 757 INTEGER,OPTIONAL,INTENT(IN) :: up 758 INTEGER,OPTIONAL,INTENT(IN) :: down 759 TYPE(request),INTENT(INOUT) :: a_request 760 761 INTEGER :: halo_up 762 INTEGER :: halo_down 763 INTEGER :: ll 764 765 766 halo_up=0 767 halo_down=0 768 IF (PRESENT(up)) halo_up=up 769 IF (PRESENT(down)) halo_down=down 770 771 ll=size(FieldS,2) 772 773 CALL Register_SwapField_gen_v(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request) 774 629 630 631 SUBROUTINE Register_SwapField3d_u2d(FieldS, FieldR, new_dist, a_request, up, down) 632 USE parallel_lmdz 633 USE lmdz_dimensions 634 USE lmdz_paramet 635 IMPLICIT NONE 636 637 TYPE(distrib), INTENT(IN) :: new_dist 638 REAL, DIMENSION(current_dist%jjb_u:, :, :, :), INTENT(IN) :: FieldS 639 REAL, DIMENSION(new_dist%jjb_u:, :, :, :), INTENT(OUT) :: FieldR 640 INTEGER, OPTIONAL, INTENT(IN) :: up 641 INTEGER, OPTIONAL, INTENT(IN) :: down 642 TYPE(request), INTENT(INOUT) :: a_request 643 644 INTEGER :: halo_up 645 INTEGER :: halo_down 646 INTEGER :: ll 647 648 halo_up = 0 649 halo_down = 0 650 IF (PRESENT(up)) halo_up = up 651 IF (PRESENT(down)) halo_down = down 652 653 ll = size(FieldS, 3) * size(FieldS, 4) 654 655 CALL Register_SwapField_gen_u(FieldS, FieldR, ll, current_dist, new_dist, halo_up, halo_down, a_request) 656 657 END SUBROUTINE Register_SwapField3d_u2d 658 659 SUBROUTINE Register_SwapField3d_u2d_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 660 USE parallel_lmdz 661 USE lmdz_dimensions 662 USE lmdz_paramet 663 IMPLICIT NONE 664 665 TYPE(distrib), INTENT(IN) :: new_dist 666 TYPE(distrib), INTENT(IN) :: old_dist 667 REAL, DIMENSION(old_dist%jjb_u:, :, :, :), INTENT(IN) :: FieldS 668 REAL, DIMENSION(new_dist%jjb_u:, :, :, :), INTENT(OUT) :: FieldR 669 INTEGER, OPTIONAL, INTENT(IN) :: up 670 INTEGER, OPTIONAL, INTENT(IN) :: down 671 TYPE(request), INTENT(INOUT) :: a_request 672 673 INTEGER :: halo_up 674 INTEGER :: halo_down 675 INTEGER :: ll 676 677 halo_up = 0 678 halo_down = 0 679 IF (PRESENT(up)) halo_up = up 680 IF (PRESENT(down)) halo_down = down 681 682 ll = size(FieldS, 3) * size(FieldS, 4) 683 684 CALL Register_SwapField_gen_u(FieldS, FieldR, ll, old_dist, new_dist, halo_up, halo_down, a_request) 685 686 END SUBROUTINE Register_SwapField3d_u2d_bis 687 688 689 SUBROUTINE Register_SwapField1d_v(FieldS, FieldR, new_dist, a_request, up, down) 690 USE parallel_lmdz 691 USE lmdz_dimensions 692 USE lmdz_paramet 693 IMPLICIT NONE 694 695 TYPE(distrib), INTENT(IN) :: new_dist 696 REAL, DIMENSION(current_dist%ijb_v:), INTENT(IN) :: FieldS 697 REAL, DIMENSION(new_dist%ijb_v:), INTENT(OUT) :: FieldR 698 INTEGER, OPTIONAL, INTENT(IN) :: up 699 INTEGER, OPTIONAL, INTENT(IN) :: down 700 TYPE(request), INTENT(INOUT) :: a_request 701 702 INTEGER :: halo_up 703 INTEGER :: halo_down 704 705 halo_up = 0 706 halo_down = 0 707 IF (PRESENT(up)) halo_up = up 708 IF (PRESENT(down)) halo_down = down 709 710 CALL Register_SwapField_gen_v(FieldS, FieldR, 1, current_dist, new_dist, halo_up, halo_down, a_request) 711 712 END SUBROUTINE Register_SwapField1d_v 713 714 SUBROUTINE Register_SwapField1d_v_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 715 USE parallel_lmdz 716 USE lmdz_dimensions 717 USE lmdz_paramet 718 IMPLICIT NONE 719 720 TYPE(distrib), INTENT(IN) :: new_dist 721 TYPE(distrib), INTENT(IN) :: old_dist 722 REAL, DIMENSION(old_dist%ijb_v:), INTENT(IN) :: FieldS 723 REAL, DIMENSION(new_dist%ijb_v:), INTENT(OUT) :: FieldR 724 INTEGER, OPTIONAL, INTENT(IN) :: up 725 INTEGER, OPTIONAL, INTENT(IN) :: down 726 TYPE(request), INTENT(INOUT) :: a_request 727 728 INTEGER :: halo_up 729 INTEGER :: halo_down 730 731 halo_up = 0 732 halo_down = 0 733 IF (PRESENT(up)) halo_up = up 734 IF (PRESENT(down)) halo_down = down 735 736 CALL Register_SwapField_gen_v(FieldS, FieldR, 1, old_dist, new_dist, halo_up, halo_down, a_request) 737 738 END SUBROUTINE Register_SwapField1d_v_bis 739 740 741 SUBROUTINE Register_SwapField2d_v1d(FieldS, FieldR, new_dist, a_request, up, down) 742 USE parallel_lmdz 743 USE lmdz_dimensions 744 USE lmdz_paramet 745 IMPLICIT NONE 746 747 TYPE(distrib), INTENT(IN) :: new_dist 748 REAL, DIMENSION(current_dist%ijb_v:, :), INTENT(IN) :: FieldS 749 REAL, DIMENSION(new_dist%ijb_v:, :), INTENT(OUT) :: FieldR 750 INTEGER, OPTIONAL, INTENT(IN) :: up 751 INTEGER, OPTIONAL, INTENT(IN) :: down 752 TYPE(request), INTENT(INOUT) :: a_request 753 754 INTEGER :: halo_up 755 INTEGER :: halo_down 756 INTEGER :: ll 757 758 halo_up = 0 759 halo_down = 0 760 IF (PRESENT(up)) halo_up = up 761 IF (PRESENT(down)) halo_down = down 762 763 ll = size(FieldS, 2) 764 765 CALL Register_SwapField_gen_v(FieldS, FieldR, ll, current_dist, new_dist, halo_up, halo_down, a_request) 766 775 767 END SUBROUTINE Register_SwapField2d_v1d 776 777 SUBROUTINE Register_SwapField2d_v1d_bis(FieldS, FieldR,new_dist,a_request,old_dist,up,down)778 USE parallel_lmdz779 USE dimensions_mod780 IMPLICIT NONE781 782 TYPE(distrib),INTENT(IN) :: new_dist 783 TYPE(distrib), INTENT(IN) :: old_dist784 REAL, DIMENSION(old_dist%ijb_v:,:),INTENT(IN) :: FieldS785 REAL, DIMENSION( new_dist%ijb_v:,:),INTENT(OUT) :: FieldR786 INTEGER,OPTIONAL,INTENT(IN) :: up787 INTEGER, OPTIONAL,INTENT(IN) :: down788 TYPE(request),INTENT(INOUT) :: a_request789 790 INTEGER :: halo_up 791 INTEGER :: halo_down792 INTEGER :: ll793 794 795 halo_up =0796 halo_down =0797 IF (PRESENT(up)) halo_up =up798 IF (PRESENT(down)) halo_down =down799 800 ll =size(FieldS,2)801 802 CALL Register_SwapField_gen_v(FieldS, FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)803 768 769 SUBROUTINE Register_SwapField2d_v1d_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 770 USE parallel_lmdz 771 USE lmdz_dimensions 772 USE lmdz_paramet 773 IMPLICIT NONE 774 775 TYPE(distrib), INTENT(IN) :: new_dist 776 TYPE(distrib), INTENT(IN) :: old_dist 777 REAL, DIMENSION(old_dist%ijb_v:, :), INTENT(IN) :: FieldS 778 REAL, DIMENSION(new_dist%ijb_v:, :), INTENT(OUT) :: FieldR 779 INTEGER, OPTIONAL, INTENT(IN) :: up 780 INTEGER, OPTIONAL, INTENT(IN) :: down 781 TYPE(request), INTENT(INOUT) :: a_request 782 783 INTEGER :: halo_up 784 INTEGER :: halo_down 785 INTEGER :: ll 786 787 halo_up = 0 788 halo_down = 0 789 IF (PRESENT(up)) halo_up = up 790 IF (PRESENT(down)) halo_down = down 791 792 ll = size(FieldS, 2) 793 794 CALL Register_SwapField_gen_v(FieldS, FieldR, ll, old_dist, new_dist, halo_up, halo_down, a_request) 795 804 796 END SUBROUTINE Register_SwapField2d_v1d_bis 805 806 807 808 SUBROUTINE Register_SwapField3d_v(FieldS,FieldR,new_dist,a_request,up,down) 809 USE parallel_lmdz 810 USE dimensions_mod 811 IMPLICIT NONE 812 813 TYPE(distrib),INTENT(IN) :: new_dist 814 REAL, DIMENSION(current_dist%ijb_v:,:,:),INTENT(IN) :: FieldS 815 REAL, DIMENSION(new_dist%ijb_v:,:,:),INTENT(OUT) :: FieldR 816 INTEGER,OPTIONAL,INTENT(IN) :: up 817 INTEGER,OPTIONAL,INTENT(IN) :: down 818 TYPE(request),INTENT(INOUT) :: a_request 819 820 INTEGER :: halo_up 821 INTEGER :: halo_down 822 INTEGER :: ll 823 824 825 halo_up=0 826 halo_down=0 827 IF (PRESENT(up)) halo_up=up 828 IF (PRESENT(down)) halo_down=down 829 830 ll=size(FieldS,2)*size(FieldS,3) 831 832 CALL Register_SwapField_gen_v(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request) 833 834 END SUBROUTINE Register_SwapField3d_v 835 836 SUBROUTINE Register_SwapField3d_v_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down) 837 USE parallel_lmdz 838 USE dimensions_mod 839 IMPLICIT NONE 840 841 TYPE(distrib),INTENT(IN) :: new_dist 842 TYPE(distrib),INTENT(IN) :: old_dist 843 REAL, DIMENSION(old_dist%ijb_v:,:,:),INTENT(IN) :: FieldS 844 REAL, DIMENSION(new_dist%ijb_v:,:,:),INTENT(OUT) :: FieldR 845 INTEGER,OPTIONAL,INTENT(IN) :: up 846 INTEGER,OPTIONAL,INTENT(IN) :: down 847 TYPE(request),INTENT(INOUT) :: a_request 848 849 INTEGER :: halo_up 850 INTEGER :: halo_down 851 INTEGER :: ll 852 853 854 halo_up=0 855 halo_down=0 856 IF (PRESENT(up)) halo_up=up 857 IF (PRESENT(down)) halo_down=down 858 859 ll=size(FieldS,2)*size(FieldS,3) 860 861 CALL Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request) 862 863 END SUBROUTINE Register_SwapField3d_v_bis 864 865 866 867 868 SUBROUTINE Register_SwapField1d_v2d(FieldS,FieldR,new_dist,a_request,up,down) 869 USE parallel_lmdz 870 USE dimensions_mod 871 IMPLICIT NONE 872 873 TYPE(distrib),INTENT(IN) :: new_dist !LF 874 REAL, DIMENSION(current_dist%jjb_v:,:),INTENT(IN) :: FieldS 875 REAL, DIMENSION(new_dist%jjb_v:,:),INTENT(OUT) :: FieldR 876 INTEGER,OPTIONAL,INTENT(IN) :: up 877 INTEGER,OPTIONAL,INTENT(IN) :: down 878 TYPE(request),INTENT(INOUT) :: a_request 879 880 INTEGER :: halo_up 881 INTEGER :: halo_down 882 883 884 halo_up=0 885 halo_down=0 886 IF (PRESENT(up)) halo_up=up 887 IF (PRESENT(down)) halo_down=down 888 889 CALL Register_SwapField_gen_v(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request) 890 797 798 799 SUBROUTINE Register_SwapField3d_v(FieldS, FieldR, new_dist, a_request, up, down) 800 USE parallel_lmdz 801 USE lmdz_dimensions 802 USE lmdz_paramet 803 IMPLICIT NONE 804 805 TYPE(distrib), INTENT(IN) :: new_dist 806 REAL, DIMENSION(current_dist%ijb_v:, :, :), INTENT(IN) :: FieldS 807 REAL, DIMENSION(new_dist%ijb_v:, :, :), INTENT(OUT) :: FieldR 808 INTEGER, OPTIONAL, INTENT(IN) :: up 809 INTEGER, OPTIONAL, INTENT(IN) :: down 810 TYPE(request), INTENT(INOUT) :: a_request 811 812 INTEGER :: halo_up 813 INTEGER :: halo_down 814 INTEGER :: ll 815 816 halo_up = 0 817 halo_down = 0 818 IF (PRESENT(up)) halo_up = up 819 IF (PRESENT(down)) halo_down = down 820 821 ll = size(FieldS, 2) * size(FieldS, 3) 822 823 CALL Register_SwapField_gen_v(FieldS, FieldR, ll, current_dist, new_dist, halo_up, halo_down, a_request) 824 825 END SUBROUTINE Register_SwapField3d_v 826 827 SUBROUTINE Register_SwapField3d_v_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 828 USE parallel_lmdz 829 USE lmdz_dimensions 830 USE lmdz_paramet 831 IMPLICIT NONE 832 833 TYPE(distrib), INTENT(IN) :: new_dist 834 TYPE(distrib), INTENT(IN) :: old_dist 835 REAL, DIMENSION(old_dist%ijb_v:, :, :), INTENT(IN) :: FieldS 836 REAL, DIMENSION(new_dist%ijb_v:, :, :), INTENT(OUT) :: FieldR 837 INTEGER, OPTIONAL, INTENT(IN) :: up 838 INTEGER, OPTIONAL, INTENT(IN) :: down 839 TYPE(request), INTENT(INOUT) :: a_request 840 841 INTEGER :: halo_up 842 INTEGER :: halo_down 843 INTEGER :: ll 844 845 halo_up = 0 846 halo_down = 0 847 IF (PRESENT(up)) halo_up = up 848 IF (PRESENT(down)) halo_down = down 849 850 ll = size(FieldS, 2) * size(FieldS, 3) 851 852 CALL Register_SwapField_gen_v(FieldS, FieldR, ll, old_dist, new_dist, halo_up, halo_down, a_request) 853 854 END SUBROUTINE Register_SwapField3d_v_bis 855 856 857 SUBROUTINE Register_SwapField1d_v2d(FieldS, FieldR, new_dist, a_request, up, down) 858 USE parallel_lmdz 859 USE lmdz_dimensions 860 USE lmdz_paramet 861 IMPLICIT NONE 862 863 TYPE(distrib), INTENT(IN) :: new_dist !LF 864 REAL, DIMENSION(current_dist%jjb_v:, :), INTENT(IN) :: FieldS 865 REAL, DIMENSION(new_dist%jjb_v:, :), INTENT(OUT) :: FieldR 866 INTEGER, OPTIONAL, INTENT(IN) :: up 867 INTEGER, OPTIONAL, INTENT(IN) :: down 868 TYPE(request), INTENT(INOUT) :: a_request 869 870 INTEGER :: halo_up 871 INTEGER :: halo_down 872 873 halo_up = 0 874 halo_down = 0 875 IF (PRESENT(up)) halo_up = up 876 IF (PRESENT(down)) halo_down = down 877 878 CALL Register_SwapField_gen_v(FieldS, FieldR, 1, current_dist, new_dist, halo_up, halo_down, a_request) 879 891 880 END SUBROUTINE Register_SwapField1d_v2d 892 881 893 SUBROUTINE Register_SwapField1d_v2d_bis(FieldS, FieldR,new_dist,a_request,old_dist,up,down)894 USE parallel_lmdz895 USE dimensions_mod896 IMPLICIT NONE897 898 TYPE(distrib),INTENT(IN) :: new_dist !LF 899 TYPE(distrib), INTENT(IN) :: old_dist900 REAL, DIMENSION(old_dist%jjb_v:,:),INTENT(IN) :: FieldS901 REAL, DIMENSION( new_dist%jjb_v:,:),INTENT(OUT) :: FieldR902 INTEGER,OPTIONAL,INTENT(IN) :: up903 INTEGER, OPTIONAL,INTENT(IN) :: down904 TYPE(request),INTENT(INOUT) :: a_request905 906 INTEGER :: halo_up 907 INTEGER :: halo_down908 909 910 halo_up =0911 halo_down =0912 IF (PRESENT(up)) halo_up =up913 IF (PRESENT(down)) halo_down =down914 915 CALL Register_SwapField_gen_v(FieldS, FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request)916 882 SUBROUTINE Register_SwapField1d_v2d_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 883 USE parallel_lmdz 884 USE lmdz_dimensions 885 USE lmdz_paramet 886 IMPLICIT NONE 887 888 TYPE(distrib), INTENT(IN) :: new_dist !LF 889 TYPE(distrib), INTENT(IN) :: old_dist 890 REAL, DIMENSION(old_dist%jjb_v:, :), INTENT(IN) :: FieldS 891 REAL, DIMENSION(new_dist%jjb_v:, :), INTENT(OUT) :: FieldR 892 INTEGER, OPTIONAL, INTENT(IN) :: up 893 INTEGER, OPTIONAL, INTENT(IN) :: down 894 TYPE(request), INTENT(INOUT) :: a_request 895 896 INTEGER :: halo_up 897 INTEGER :: halo_down 898 899 halo_up = 0 900 halo_down = 0 901 IF (PRESENT(up)) halo_up = up 902 IF (PRESENT(down)) halo_down = down 903 904 CALL Register_SwapField_gen_v(FieldS, FieldR, 1, old_dist, new_dist, halo_up, halo_down, a_request) 905 917 906 END SUBROUTINE Register_SwapField1d_v2d_bis 918 907 919 908 920 SUBROUTINE Register_SwapField2d_v2d(FieldS, FieldR,new_dist,a_request,up,down)921 USE parallel_lmdz922 USE dimensions_mod923 IMPLICIT NONE924 925 TYPE(distrib),INTENT(IN) :: new_dist 926 REAL, DIMENSION(current_dist%jjb_v:,:,:),INTENT(IN) :: FieldS927 REAL, DIMENSION( new_dist%jjb_v:,:,:),INTENT(OUT) :: FieldR928 INTEGER,OPTIONAL,INTENT(IN) :: up929 INTEGER, OPTIONAL,INTENT(IN) :: down930 TYPE(request),INTENT(INOUT) :: a_request931 932 INTEGER :: halo_up 933 INTEGER :: halo_down934 INTEGER :: ll935 936 937 halo_up =0938 halo_down =0939 IF (PRESENT(up)) halo_up =up940 IF (PRESENT(down)) halo_down =down941 942 ll =size(FieldS,3)943 944 CALL Register_SwapField_gen_v(FieldS, FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)945 909 SUBROUTINE Register_SwapField2d_v2d(FieldS, FieldR, new_dist, a_request, up, down) 910 USE parallel_lmdz 911 USE lmdz_dimensions 912 USE lmdz_paramet 913 IMPLICIT NONE 914 915 TYPE(distrib), INTENT(IN) :: new_dist 916 REAL, DIMENSION(current_dist%jjb_v:, :, :), INTENT(IN) :: FieldS 917 REAL, DIMENSION(new_dist%jjb_v:, :, :), INTENT(OUT) :: FieldR 918 INTEGER, OPTIONAL, INTENT(IN) :: up 919 INTEGER, OPTIONAL, INTENT(IN) :: down 920 TYPE(request), INTENT(INOUT) :: a_request 921 922 INTEGER :: halo_up 923 INTEGER :: halo_down 924 INTEGER :: ll 925 926 halo_up = 0 927 halo_down = 0 928 IF (PRESENT(up)) halo_up = up 929 IF (PRESENT(down)) halo_down = down 930 931 ll = size(FieldS, 3) 932 933 CALL Register_SwapField_gen_v(FieldS, FieldR, ll, current_dist, new_dist, halo_up, halo_down, a_request) 934 946 935 END SUBROUTINE Register_SwapField2d_v2d 947 948 SUBROUTINE Register_SwapField2d_v2d_bis(FieldS, FieldR,new_dist,a_request,old_dist,up,down)949 USE parallel_lmdz950 USE dimensions_mod951 IMPLICIT NONE952 953 TYPE(distrib),INTENT(IN) :: new_dist 954 TYPE(distrib), INTENT(IN) :: old_dist955 REAL, DIMENSION(old_dist%jjb_v:,:,:),INTENT(IN) :: FieldS956 REAL, DIMENSION( new_dist%jjb_v:,:,:),INTENT(OUT) :: FieldR957 INTEGER,OPTIONAL,INTENT(IN) :: up958 INTEGER, OPTIONAL,INTENT(IN) :: down959 TYPE(request),INTENT(INOUT) :: a_request960 961 INTEGER :: halo_up 962 INTEGER :: halo_down963 INTEGER :: ll964 965 966 halo_up =0967 halo_down =0968 IF (PRESENT(up)) halo_up =up969 IF (PRESENT(down)) halo_down =down970 971 ll =size(FieldS,3)972 973 CALL Register_SwapField_gen_v(FieldS, FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)974 936 937 SUBROUTINE Register_SwapField2d_v2d_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 938 USE parallel_lmdz 939 USE lmdz_dimensions 940 USE lmdz_paramet 941 IMPLICIT NONE 942 943 TYPE(distrib), INTENT(IN) :: new_dist 944 TYPE(distrib), INTENT(IN) :: old_dist 945 REAL, DIMENSION(old_dist%jjb_v:, :, :), INTENT(IN) :: FieldS 946 REAL, DIMENSION(new_dist%jjb_v:, :, :), INTENT(OUT) :: FieldR 947 INTEGER, OPTIONAL, INTENT(IN) :: up 948 INTEGER, OPTIONAL, INTENT(IN) :: down 949 TYPE(request), INTENT(INOUT) :: a_request 950 951 INTEGER :: halo_up 952 INTEGER :: halo_down 953 INTEGER :: ll 954 955 halo_up = 0 956 halo_down = 0 957 IF (PRESENT(up)) halo_up = up 958 IF (PRESENT(down)) halo_down = down 959 960 ll = size(FieldS, 3) 961 962 CALL Register_SwapField_gen_v(FieldS, FieldR, ll, old_dist, new_dist, halo_up, halo_down, a_request) 963 975 964 END SUBROUTINE Register_SwapField2d_v2d_bis 976 977 978 SUBROUTINE Register_SwapField3d_v2d(FieldS, FieldR,new_dist,a_request,up,down)979 USE parallel_lmdz980 USE dimensions_mod981 IMPLICIT NONE982 983 TYPE(distrib),INTENT(IN) :: new_dist 984 REAL, DIMENSION(current_dist%jjb_v:,:,:,:),INTENT(IN) :: FieldS985 REAL, DIMENSION( new_dist%jjb_v:,:,:,:),INTENT(OUT) :: FieldR986 INTEGER,OPTIONAL,INTENT(IN) :: up987 INTEGER, OPTIONAL,INTENT(IN) :: down988 TYPE(request),INTENT(INOUT) :: a_request989 990 INTEGER :: halo_up 991 INTEGER :: halo_down992 INTEGER :: ll993 994 995 halo_up =0996 halo_down =0997 IF (PRESENT(up)) halo_up =up998 IF (PRESENT(down)) halo_down =down999 1000 ll =size(FieldS,3)*size(FieldS,4)1001 1002 CALL Register_SwapField_gen_v(FieldS, FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)1003 1004 END SUBROUTINE Register_SwapField3d_v2d 1005 1006 SUBROUTINE Register_SwapField3d_v2d_bis(FieldS, FieldR,new_dist,a_request,old_dist,up,down)1007 USE parallel_lmdz1008 USE dimensions_mod1009 IMPLICIT NONE1010 1011 TYPE(distrib),INTENT(IN) :: new_dist 1012 TYPE(distrib), INTENT(IN) :: old_dist1013 REAL, DIMENSION(old_dist%jjb_v:,:,:,:),INTENT(IN) :: FieldS1014 REAL, DIMENSION( new_dist%jjb_v:,:,:,:),INTENT(OUT) :: FieldR1015 INTEGER,OPTIONAL,INTENT(IN) :: up1016 INTEGER, OPTIONAL,INTENT(IN) :: down1017 TYPE(request),INTENT(INOUT) :: a_request1018 1019 INTEGER :: halo_up 1020 INTEGER :: halo_down1021 INTEGER :: ll1022 1023 1024 halo_up =01025 halo_down =01026 IF (PRESENT(up)) halo_up =up1027 IF (PRESENT(down)) halo_down =down1028 1029 ll =size(FieldS,3)*size(FieldS,4)1030 1031 CALL Register_SwapField_gen_v(FieldS, FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)1032 1033 END SUBROUTINE Register_SwapField3d_v2d_bis 1034 1035 1036 1037 SUBROUTINE Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,Up,Down,a_request)1038 USE parallel_lmdz1039 USE dimensions_mod1040 1041 1042 INTEGER :: ll, Up,Down1043 TYPE(distrib) 1044 TYPE(distrib) 1045 REAL, DIMENSION(old_dist%ijb_u:old_dist%ije_u, ll) :: FieldS1046 REAL, DIMENSION(new_dist%ijb_u:new_dist%ije_u, ll) :: FieldR965 966 967 SUBROUTINE Register_SwapField3d_v2d(FieldS, FieldR, new_dist, a_request, up, down) 968 USE parallel_lmdz 969 USE lmdz_dimensions 970 USE lmdz_paramet 971 IMPLICIT NONE 972 973 TYPE(distrib), INTENT(IN) :: new_dist 974 REAL, DIMENSION(current_dist%jjb_v:, :, :, :), INTENT(IN) :: FieldS 975 REAL, DIMENSION(new_dist%jjb_v:, :, :, :), INTENT(OUT) :: FieldR 976 INTEGER, OPTIONAL, INTENT(IN) :: up 977 INTEGER, OPTIONAL, INTENT(IN) :: down 978 TYPE(request), INTENT(INOUT) :: a_request 979 980 INTEGER :: halo_up 981 INTEGER :: halo_down 982 INTEGER :: ll 983 984 halo_up = 0 985 halo_down = 0 986 IF (PRESENT(up)) halo_up = up 987 IF (PRESENT(down)) halo_down = down 988 989 ll = size(FieldS, 3) * size(FieldS, 4) 990 991 CALL Register_SwapField_gen_v(FieldS, FieldR, ll, current_dist, new_dist, halo_up, halo_down, a_request) 992 993 END SUBROUTINE Register_SwapField3d_v2d 994 995 SUBROUTINE Register_SwapField3d_v2d_bis(FieldS, FieldR, new_dist, a_request, old_dist, up, down) 996 USE parallel_lmdz 997 USE lmdz_dimensions 998 USE lmdz_paramet 999 IMPLICIT NONE 1000 1001 TYPE(distrib), INTENT(IN) :: new_dist 1002 TYPE(distrib), INTENT(IN) :: old_dist 1003 REAL, DIMENSION(old_dist%jjb_v:, :, :, :), INTENT(IN) :: FieldS 1004 REAL, DIMENSION(new_dist%jjb_v:, :, :, :), INTENT(OUT) :: FieldR 1005 INTEGER, OPTIONAL, INTENT(IN) :: up 1006 INTEGER, OPTIONAL, INTENT(IN) :: down 1007 TYPE(request), INTENT(INOUT) :: a_request 1008 1009 INTEGER :: halo_up 1010 INTEGER :: halo_down 1011 INTEGER :: ll 1012 1013 halo_up = 0 1014 halo_down = 0 1015 IF (PRESENT(up)) halo_up = up 1016 IF (PRESENT(down)) halo_down = down 1017 1018 ll = size(FieldS, 3) * size(FieldS, 4) 1019 1020 CALL Register_SwapField_gen_v(FieldS, FieldR, ll, old_dist, new_dist, halo_up, halo_down, a_request) 1021 1022 END SUBROUTINE Register_SwapField3d_v2d_bis 1023 1024 1025 SUBROUTINE Register_SwapField_gen_u(FieldS, FieldR, ll, old_dist, new_dist, Up, Down, a_request) 1026 USE parallel_lmdz 1027 USE lmdz_dimensions 1028 USE lmdz_paramet 1029 IMPLICIT NONE 1030 1031 INTEGER :: ll, Up, Down 1032 TYPE(distrib) :: old_dist 1033 TYPE(distrib) :: new_dist 1034 REAL, DIMENSION(old_dist%ijb_u:old_dist%ije_u, ll) :: FieldS 1035 REAL, DIMENSION(new_dist%ijb_u:new_dist%ije_u, ll) :: FieldR 1047 1036 TYPE(request) :: a_request 1048 INTEGER, DIMENSION(0:MPI_Size-1) :: jj_Nb_New1049 INTEGER, DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New1050 1051 INTEGER :: i,l,jje,jjb,ijb,ije1052 1053 DO i =0,MPI_Size-11054 jj_begin_New(i) =max(1,new_dist%jj_begin_para(i)-Up)1055 jj_end_New(i) =min(jjp1,new_dist%jj_end_para(i)+Down)1037 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Nb_New 1038 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Begin_New, jj_End_New 1039 1040 INTEGER :: i, l, jje, jjb, ijb, ije 1041 1042 DO i = 0, MPI_Size - 1 1043 jj_begin_New(i) = max(1, new_dist%jj_begin_para(i) - Up) 1044 jj_end_New(i) = min(jjp1, new_dist%jj_end_para(i) + Down) 1056 1045 ENDDO 1057 1058 DO i =0,MPI_Size-11046 1047 DO i = 0, MPI_Size - 1 1059 1048 IF (i /= MPI_Rank) THEN 1060 jjb =max(jj_begin_new(i),old_dist%jj_begin)1061 jje =min(jj_end_new(i),old_dist%jj_end)1062 1049 jjb = max(jj_begin_new(i), old_dist%jj_begin) 1050 jje = min(jj_end_new(i), old_dist%jj_end) 1051 1063 1052 IF (jje >= jjb) THEN 1064 CALL Register_SendField(FieldS, old_dist%ijnb_u,ll,jjb-old_dist%jjb_u+1,jje-jjb+1,i,a_request)1053 CALL Register_SendField(FieldS, old_dist%ijnb_u, ll, jjb - old_dist%jjb_u + 1, jje - jjb + 1, i, a_request) 1065 1054 ENDIF 1066 1067 jjb =max(jj_begin_new(MPI_Rank),old_dist%jj_begin_Para(i))1068 jje =min(jj_end_new(MPI_Rank),old_dist%jj_end_Para(i))1069 1055 1056 jjb = max(jj_begin_new(MPI_Rank), old_dist%jj_begin_Para(i)) 1057 jje = min(jj_end_new(MPI_Rank), old_dist%jj_end_Para(i)) 1058 1070 1059 IF (jje >= jjb) THEN 1071 CALL Register_RecvField(FieldR, new_dist%ijnb_u,ll,jjb-new_dist%jjb_u+1,jje-jjb+1,i,a_request)1060 CALL Register_RecvField(FieldR, new_dist%ijnb_u, ll, jjb - new_dist%jjb_u + 1, jje - jjb + 1, i, a_request) 1072 1061 ENDIF 1073 1062 ELSE 1074 jjb =max(jj_begin_new(i),old_dist%jj_begin)1075 jje =min(jj_end_new(i),old_dist%jj_end)1076 ijb =(jjb-1)*iip1+11077 ije =jje*iip11078 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1079 DO l =1,ll1080 FieldR(ijb:ije, l)=FieldS(ijb:ije,l)1063 jjb = max(jj_begin_new(i), old_dist%jj_begin) 1064 jje = min(jj_end_new(i), old_dist%jj_end) 1065 ijb = (jjb - 1) * iip1 + 1 1066 ije = jje * iip1 1067 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1068 DO l = 1, ll 1069 FieldR(ijb:ije, l) = FieldS(ijb:ije, l) 1081 1070 ENDDO 1082 !$OMP END DO NOWAIT1071 !$OMP END DO NOWAIT 1083 1072 ENDIF 1084 1073 ENDDO 1085 1074 1086 1075 END SUBROUTINE Register_SwapField_gen_u 1087 1076 1088 1077 1089 1090 SUBROUTINE Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,Up,Down,a_request)1091 USE parallel_lmdz1092 USE dimensions_mod1093 IMPLICIT NONE 1094 1095 INTEGER :: ll, Up,Down1096 TYPE(distrib) 1097 TYPE(distrib) 1098 REAL, DIMENSION(old_dist%ijb_v:old_dist%ije_v, ll) :: FieldS1099 REAL, DIMENSION(new_dist%ijb_v:new_dist%ije_v, ll) :: FieldR1078 SUBROUTINE Register_SwapField_gen_v(FieldS, FieldR, ll, old_dist, new_dist, Up, Down, a_request) 1079 USE parallel_lmdz 1080 USE lmdz_dimensions 1081 USE lmdz_paramet 1082 IMPLICIT NONE 1083 1084 INTEGER :: ll, Up, Down 1085 TYPE(distrib) :: old_dist 1086 TYPE(distrib) :: new_dist 1087 REAL, DIMENSION(old_dist%ijb_v:old_dist%ije_v, ll) :: FieldS 1088 REAL, DIMENSION(new_dist%ijb_v:new_dist%ije_v, ll) :: FieldR 1100 1089 TYPE(request) :: a_request 1101 INTEGER, DIMENSION(0:MPI_Size-1) :: jj_Nb_New1102 INTEGER, DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New1103 1104 INTEGER :: i,l,jje,jjb,ijb,ije1105 1106 DO i =0,MPI_Size-11107 jj_begin_New(i) =max(1,new_dist%jj_begin_para(i)-Up)1108 jj_end_New(i) =min(jjp1,new_dist%jj_end_para(i)+Down)1090 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Nb_New 1091 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Begin_New, jj_End_New 1092 1093 INTEGER :: i, l, jje, jjb, ijb, ije 1094 1095 DO i = 0, MPI_Size - 1 1096 jj_begin_New(i) = max(1, new_dist%jj_begin_para(i) - Up) 1097 jj_end_New(i) = min(jjp1, new_dist%jj_end_para(i) + Down) 1109 1098 ENDDO 1110 1111 DO i =0,MPI_Size-11099 1100 DO i = 0, MPI_Size - 1 1112 1101 IF (i /= MPI_Rank) THEN 1113 jjb =max(jj_begin_new(i),old_dist%jj_begin)1114 jje =min(jj_end_new(i),old_dist%jj_end)1115 1116 IF (jje==jjp1) jje =jjm1102 jjb = max(jj_begin_new(i), old_dist%jj_begin) 1103 jje = min(jj_end_new(i), old_dist%jj_end) 1104 1105 IF (jje==jjp1) jje = jjm 1117 1106 1118 1107 IF (jje >= jjb) THEN 1119 CALL Register_SendField(FieldS, old_dist%ijnb_v,ll,jjb-old_dist%jjb_v+1,jje-jjb+1,i,a_request)1108 CALL Register_SendField(FieldS, old_dist%ijnb_v, ll, jjb - old_dist%jjb_v + 1, jje - jjb + 1, i, a_request) 1120 1109 ENDIF 1121 1122 jjb =max(jj_begin_new(MPI_Rank),old_dist%jj_begin_Para(i))1123 jje =min(jj_end_new(MPI_Rank),old_dist%jj_end_Para(i))1124 1125 IF (jje==jjp1) jje =jjm1126 1110 1111 jjb = max(jj_begin_new(MPI_Rank), old_dist%jj_begin_Para(i)) 1112 jje = min(jj_end_new(MPI_Rank), old_dist%jj_end_Para(i)) 1113 1114 IF (jje==jjp1) jje = jjm 1115 1127 1116 IF (jje >= jjb) THEN 1128 CALL Register_RecvField(FieldR, new_dist%ijnb_v,ll,jjb-new_dist%jjb_v+1,jje-jjb+1,i,a_request)1117 CALL Register_RecvField(FieldR, new_dist%ijnb_v, ll, jjb - new_dist%jjb_v + 1, jje - jjb + 1, i, a_request) 1129 1118 ENDIF 1130 1119 ELSE 1131 jjb =max(jj_begin_new(i),old_dist%jj_begin)1132 jje =min(jj_end_new(i),old_dist%jj_end)1133 IF (jje==jjp1) jje =jjm1134 ijb =(jjb-1)*iip1+11135 ije =jje*iip11136 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1137 DO l =1,ll1138 FieldR(ijb:ije, l)=FieldS(ijb:ije,l)1139 ENDDO 1140 !$OMP END DO NOWAIT1120 jjb = max(jj_begin_new(i), old_dist%jj_begin) 1121 jje = min(jj_end_new(i), old_dist%jj_end) 1122 IF (jje==jjp1) jje = jjm 1123 ijb = (jjb - 1) * iip1 + 1 1124 ije = jje * iip1 1125 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1126 DO l = 1, ll 1127 FieldR(ijb:ije, l) = FieldS(ijb:ije, l) 1128 ENDDO 1129 !$OMP END DO NOWAIT 1141 1130 ENDIF 1142 1131 ENDDO 1143 1132 1144 1133 END SUBROUTINE Register_SwapField_gen_v 1145 1134 1146 1135 1147 1148 1149 1150 SUBROUTINE Register_Hallo(Field,ij,ll,RUp,Rdown,SUp,SDown,a_request) 1151 USE dimensions_mod 1152 USE lmdz_mpi 1153 IMPLICIT NONE 1154 1155 INTEGER :: ij,ll 1156 REAL, DIMENSION(ij,ll) :: Field 1157 INTEGER :: Sup,Sdown,rup,rdown 1158 type(request) :: a_request 1159 type(Hallo),pointer :: PtrHallo 1160 LOGICAL :: SendUp,SendDown 1161 LOGICAL :: RecvUp,RecvDown 1162 1163 1164 SendUp=.TRUE. 1165 SendDown=.TRUE. 1166 RecvUp=.TRUE. 1167 RecvDown=.TRUE. 1168 1169 IF (pole_nord) THEN 1170 SendUp=.FALSE. 1171 RecvUp=.FALSE. 1172 ENDIF 1173 1174 IF (pole_sud) THEN 1175 SendDown=.FALSE. 1176 RecvDown=.FALSE. 1177 ENDIF 1178 1179 IF (Sup==0) THEN 1180 SendUp=.FALSE. 1181 endif 1182 1183 IF (Sdown==0) THEN 1184 SendDown=.FALSE. 1136 SUBROUTINE Register_Hallo(Field, ij, ll, RUp, Rdown, SUp, SDown, a_request) 1137 USE lmdz_dimensions 1138 USE lmdz_paramet 1139 USE lmdz_mpi 1140 IMPLICIT NONE 1141 1142 INTEGER :: ij, ll 1143 REAL, DIMENSION(ij, ll) :: Field 1144 INTEGER :: Sup, Sdown, rup, rdown 1145 type(request) :: a_request 1146 type(Hallo), pointer :: PtrHallo 1147 LOGICAL :: SendUp, SendDown 1148 LOGICAL :: RecvUp, RecvDown 1149 1150 SendUp = .TRUE. 1151 SendDown = .TRUE. 1152 RecvUp = .TRUE. 1153 RecvDown = .TRUE. 1154 1155 IF (pole_nord) THEN 1156 SendUp = .FALSE. 1157 RecvUp = .FALSE. 1158 ENDIF 1159 1160 IF (pole_sud) THEN 1161 SendDown = .FALSE. 1162 RecvDown = .FALSE. 1163 ENDIF 1164 1165 IF (Sup==0) THEN 1166 SendUp = .FALSE. 1167 endif 1168 1169 IF (Sdown==0) THEN 1170 SendDown = .FALSE. 1171 endif 1172 1173 IF (Rup==0) THEN 1174 RecvUp = .FALSE. 1175 endif 1176 1177 IF (Rdown==0) THEN 1178 RecvDown = .FALSE. 1179 endif 1180 1181 IF (SendUp) THEN 1182 CALL Register_SendField(Field, ij, ll, jj_begin, SUp, MPI_Rank - 1, a_request) 1183 ENDIF 1184 1185 IF (SendDown) THEN 1186 CALL Register_SendField(Field, ij, ll, jj_end - SDown + 1, SDown, MPI_Rank + 1, a_request) 1187 ENDIF 1188 1189 IF (RecvUp) THEN 1190 CALL Register_RecvField(Field, ij, ll, jj_begin - Rup, RUp, MPI_Rank - 1, a_request) 1191 ENDIF 1192 1193 IF (RecvDown) THEN 1194 CALL Register_RecvField(Field, ij, ll, jj_end + 1, RDown, MPI_Rank + 1, a_request) 1195 ENDIF 1196 1197 END SUBROUTINE Register_Hallo 1198 1199 1200 SUBROUTINE Register_Hallo_u(Field, ll, RUp, Rdown, SUp, SDown, a_request) 1201 USE lmdz_dimensions 1202 USE lmdz_paramet 1203 USE lmdz_mpi 1204 IMPLICIT NONE 1205 INTEGER :: ll 1206 REAL, DIMENSION(ijb_u:ije_u, ll) :: Field 1207 INTEGER :: Sup, Sdown, rup, rdown 1208 type(request) :: a_request 1209 type(Hallo), pointer :: PtrHallo 1210 LOGICAL :: SendUp, SendDown 1211 LOGICAL :: RecvUp, RecvDown 1212 1213 SendUp = .TRUE. 1214 SendDown = .TRUE. 1215 RecvUp = .TRUE. 1216 RecvDown = .TRUE. 1217 1218 IF (pole_nord) THEN 1219 SendUp = .FALSE. 1220 RecvUp = .FALSE. 1221 ENDIF 1222 1223 IF (pole_sud) THEN 1224 SendDown = .FALSE. 1225 RecvDown = .FALSE. 1226 ENDIF 1227 1228 IF (Sup==0) THEN 1229 SendUp = .FALSE. 1230 endif 1231 1232 IF (Sdown==0) THEN 1233 SendDown = .FALSE. 1234 endif 1235 1236 IF (Rup==0) THEN 1237 RecvUp = .FALSE. 1238 endif 1239 1240 IF (Rdown==0) THEN 1241 RecvDown = .FALSE. 1242 endif 1243 1244 IF (SendUp) THEN 1245 CALL Register_SendField(Field, ijnb_u, ll, jj_begin - jjb_u + 1, SUp, MPI_Rank - 1, a_request) 1246 ENDIF 1247 1248 IF (SendDown) THEN 1249 CALL Register_SendField(Field, ijnb_u, ll, jj_end - SDown + 1 - jjb_u + 1, SDown, MPI_Rank + 1, a_request) 1250 ENDIF 1251 1252 IF (RecvUp) THEN 1253 CALL Register_RecvField(Field, ijnb_u, ll, jj_begin - Rup - jjb_u + 1, RUp, MPI_Rank - 1, a_request) 1254 ENDIF 1255 1256 IF (RecvDown) THEN 1257 CALL Register_RecvField(Field, ijnb_u, ll, jj_end + 1 - jjb_u + 1, RDown, MPI_Rank + 1, a_request) 1258 ENDIF 1259 1260 END SUBROUTINE Register_Hallo_u 1261 1262 SUBROUTINE Register_Hallo_v(Field, ll, RUp, Rdown, SUp, SDown, a_request) 1263 USE lmdz_dimensions 1264 USE lmdz_paramet 1265 USE lmdz_mpi 1266 IMPLICIT NONE 1267 INTEGER :: ll 1268 REAL, DIMENSION(ijb_v:ije_v, ll) :: Field 1269 INTEGER :: Sup, Sdown, rup, rdown 1270 type(request) :: a_request 1271 type(Hallo), pointer :: PtrHallo 1272 LOGICAL :: SendUp, SendDown 1273 LOGICAL :: RecvUp, RecvDown 1274 1275 SendUp = .TRUE. 1276 SendDown = .TRUE. 1277 RecvUp = .TRUE. 1278 RecvDown = .TRUE. 1279 1280 IF (pole_nord) THEN 1281 SendUp = .FALSE. 1282 RecvUp = .FALSE. 1283 ENDIF 1284 1285 IF (pole_sud) THEN 1286 SendDown = .FALSE. 1287 RecvDown = .FALSE. 1288 ENDIF 1289 1290 IF (Sup==0) THEN 1291 SendUp = .FALSE. 1292 endif 1293 1294 IF (Sdown==0) THEN 1295 SendDown = .FALSE. 1296 endif 1297 1298 IF (Rup==0) THEN 1299 RecvUp = .FALSE. 1300 endif 1301 1302 IF (Rdown==0) THEN 1303 RecvDown = .FALSE. 1304 endif 1305 1306 IF (SendUp) THEN 1307 CALL Register_SendField(Field, ijnb_v, ll, jj_begin - jjb_v + 1, SUp, MPI_Rank - 1, a_request) 1308 ENDIF 1309 1310 IF (SendDown) THEN 1311 CALL Register_SendField(Field, ijnb_v, ll, jj_end - SDown + 1 - jjb_v + 1, SDown, MPI_Rank + 1, a_request) 1312 ENDIF 1313 1314 IF (RecvUp) THEN 1315 CALL Register_RecvField(Field, ijnb_v, ll, jj_begin - Rup - jjb_v + 1, RUp, MPI_Rank - 1, a_request) 1316 ENDIF 1317 1318 IF (RecvDown) THEN 1319 CALL Register_RecvField(Field, ijnb_v, ll, jj_end + 1 - jjb_v + 1, RDown, MPI_Rank + 1, a_request) 1320 ENDIF 1321 1322 END SUBROUTINE Register_Hallo_v 1323 1324 SUBROUTINE SendRequest(a_Request) 1325 USE lmdz_dimensions 1326 USE lmdz_paramet 1327 USE lmdz_mpi 1328 IMPLICIT NONE 1329 1330 type(request), target :: a_request 1331 type(request_SR), pointer :: Req 1332 type(Hallo), pointer :: PtrHallo 1333 INTEGER :: SizeBuffer 1334 INTEGER :: i, rank, l, ij, Pos, ierr 1335 INTEGER :: offset 1336 REAL, DIMENSION(:, :), pointer :: Field 1337 INTEGER :: Nb 1338 1339 DO rank = 0, MPI_SIZE - 1 1340 1341 Req => a_Request%RequestSend(rank) 1342 1343 SizeBuffer = 0 1344 DO i = 1, Req%NbRequest 1345 PtrHallo => Req%Hallo(i) 1346 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1347 DO l = 1, PtrHallo%NbLevel 1348 SizeBuffer = SizeBuffer + PtrHallo%size * iip1 1349 ENDDO 1350 !$OMP ENDDO NOWAIT 1351 enddo 1352 1353 Req%BufferSize = SizeBuffer 1354 IF (Req%NbRequest>0) THEN 1355 CALL allocate_buffer(SizeBuffer, Req%Index, Req%pos) 1356 1357 Pos = Req%Pos 1358 DO i = 1, Req%NbRequest 1359 PtrHallo => Req%Hallo(i) 1360 offset = (PtrHallo%offset - 1) * iip1 + 1 1361 Nb = iip1 * PtrHallo%size - 1 1362 Field => PtrHallo%Field 1363 1364 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1365 DO l = 1, PtrHallo%NbLevel 1366 !cdir NODEP 1367 DO ij = 0, Nb 1368 Buffer(Pos + ij) = Field(Offset + ij, l) 1369 enddo 1370 1371 Pos = Pos + Nb + 1 1372 enddo 1373 !$OMP END DO NOWAIT 1374 enddo 1375 1376 IF (SizeBuffer>0) THEN 1377 !$OMP CRITICAL (MPI) 1378 1379 CALL MPI_ISEND(Buffer(req%Pos), SizeBuffer, MPI_REAL_LMDZ, rank, a_request%tag + 1000 * omp_rank, & 1380 COMM_LMDZ, Req%MSG_Request, ierr) 1381 IF (.NOT.using_mpi) THEN 1382 PRINT *, 'Erreur, echange MPI en mode sequentiel !!!' 1383 CALL abort_gcm("mod_hallo", "stopped", 1) 1384 ENDIF 1385 ! PRINT *,"-------------------------------------------------------------------" 1386 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->" 1387 ! PRINT *,"Requete envoye au proc :",rank,"tag :",a_request%tag+1000*omp_rank 1388 ! PRINT *,"Taille du message :",SizeBuffer,"requete no :",Req%MSG_Request 1389 ! PRINT *,"-------------------------------------------------------------------" 1390 !$OMP END CRITICAL (MPI) 1391 endif 1185 1392 endif 1186 1187 IF (Rup==0) THEN 1188 RecvUp=.FALSE. 1393 enddo 1394 1395 DO rank = 0, MPI_SIZE - 1 1396 1397 Req => a_Request%RequestRecv(rank) 1398 SizeBuffer = 0 1399 1400 DO i = 1, Req%NbRequest 1401 PtrHallo => Req%Hallo(i) 1402 1403 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1404 DO l = 1, PtrHallo%NbLevel 1405 SizeBuffer = SizeBuffer + PtrHallo%size * iip1 1406 ENDDO 1407 !$OMP ENDDO NOWAIT 1408 enddo 1409 1410 Req%BufferSize = SizeBuffer 1411 1412 IF (Req%NbRequest>0) THEN 1413 CALL allocate_buffer(SizeBuffer, Req%Index, Req%Pos) 1414 1415 IF (SizeBuffer>0) THEN 1416 !$OMP CRITICAL (MPI) 1417 1418 CALL MPI_IRECV(Buffer(Req%Pos), SizeBuffer, MPI_REAL_LMDZ, rank, a_request%tag + 1000 * omp_rank, & 1419 COMM_LMDZ, Req%MSG_Request, ierr) 1420 1421 IF (.NOT.using_mpi) THEN 1422 PRINT *, 'Erreur, echange MPI en mode sequentiel !!!' 1423 CALL abort_gcm("mod_hallo", "stopped", 1) 1424 ENDIF 1425 1426 ! PRINT *,"-------------------------------------------------------------------" 1427 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->" 1428 ! PRINT *,"Requete en attente du proc :",rank,"tag :",a_request%tag+1000*omp_rank 1429 ! PRINT *,"Taille du message :",SizeBuffer,"requete no :",Req%MSG_Request 1430 ! PRINT *,"-------------------------------------------------------------------" 1431 1432 !$OMP END CRITICAL (MPI) 1433 endif 1189 1434 endif 1190 1191 IF (Rdown==0) THEN 1192 RecvDown=.FALSE. 1435 1436 enddo 1437 1438 END SUBROUTINE SendRequest 1439 1440 SUBROUTINE WaitRequest(a_Request) 1441 USE lmdz_dimensions 1442 USE lmdz_paramet 1443 USE lmdz_mpi 1444 IMPLICIT NONE 1445 1446 type(request), target :: a_request 1447 type(request_SR), pointer :: Req 1448 type(Hallo), pointer :: PtrHallo 1449 INTEGER, DIMENSION(2 * mpi_size) :: TabRequest 1450 INTEGER, DIMENSION(MPI_STATUS_SIZE, 2 * mpi_size) :: TabStatus 1451 INTEGER :: NbRequest 1452 INTEGER :: i, rank, pos, ij, l, ierr 1453 INTEGER :: offset 1454 INTEGER :: Nb 1455 1456 NbRequest = 0 1457 DO rank = 0, MPI_SIZE - 1 1458 Req => a_request%RequestSend(rank) 1459 IF (Req%NbRequest>0 .AND. Req%BufferSize > 0) THEN 1460 NbRequest = NbRequest + 1 1461 TabRequest(NbRequest) = Req%MSG_Request 1193 1462 endif 1194 1195 IF (SendUp) THEN 1196 CALL Register_SendField(Field,ij,ll,jj_begin,SUp,MPI_Rank-1,a_request) 1197 ENDIF 1198 1199 IF (SendDown) THEN 1200 CALL Register_SendField(Field,ij,ll,jj_end-SDown+1,SDown,MPI_Rank+1,a_request) 1201 ENDIF 1202 1203 1204 IF (RecvUp) THEN 1205 CALL Register_RecvField(Field,ij,ll,jj_begin-Rup,RUp,MPI_Rank-1,a_request) 1206 ENDIF 1207 1208 IF (RecvDown) THEN 1209 CALL Register_RecvField(Field,ij,ll,jj_end+1,RDown,MPI_Rank+1,a_request) 1210 ENDIF 1211 1212 END SUBROUTINE Register_Hallo 1213 1214 1215 SUBROUTINE Register_Hallo_u(Field,ll,RUp,Rdown,SUp,SDown,a_request) 1216 USE dimensions_mod 1217 USE lmdz_mpi 1218 IMPLICIT NONE 1219 INTEGER :: ll 1220 REAL, DIMENSION(ijb_u:ije_u,ll) :: Field 1221 INTEGER :: Sup,Sdown,rup,rdown 1222 type(request) :: a_request 1223 type(Hallo),pointer :: PtrHallo 1224 LOGICAL :: SendUp,SendDown 1225 LOGICAL :: RecvUp,RecvDown 1226 1227 1228 SendUp=.TRUE. 1229 SendDown=.TRUE. 1230 RecvUp=.TRUE. 1231 RecvDown=.TRUE. 1232 1233 IF (pole_nord) THEN 1234 SendUp=.FALSE. 1235 RecvUp=.FALSE. 1236 ENDIF 1237 1238 IF (pole_sud) THEN 1239 SendDown=.FALSE. 1240 RecvDown=.FALSE. 1241 ENDIF 1242 1243 IF (Sup==0) THEN 1244 SendUp=.FALSE. 1245 endif 1246 1247 IF (Sdown==0) THEN 1248 SendDown=.FALSE. 1463 enddo 1464 1465 DO rank = 0, MPI_SIZE - 1 1466 Req => a_request%RequestRecv(rank) 1467 IF (Req%NbRequest>0 .AND. Req%BufferSize > 0) THEN 1468 NbRequest = NbRequest + 1 1469 TabRequest(NbRequest) = Req%MSG_Request 1249 1470 endif 1250 1251 IF (Rup==0) THEN 1252 RecvUp=.FALSE. 1471 enddo 1472 1473 IF (NbRequest>0) THEN 1474 !$OMP CRITICAL (MPI) 1475 ! PRINT *,"-------------------------------------------------------------------" 1476 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente" 1477 ! PRINT *,"No des requetes :",TabRequest(1:NbRequest) 1478 CALL MPI_WAITALL(NbRequest, TabRequest, TabStatus, ierr) 1479 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete" 1480 ! PRINT *,"-------------------------------------------------------------------" 1481 !$OMP END CRITICAL (MPI) 1482 endif 1483 DO rank = 0, MPI_Size - 1 1484 Req => a_request%RequestRecv(rank) 1485 IF (Req%NbRequest>0) THEN 1486 Pos = Req%Pos 1487 DO i = 1, Req%NbRequest 1488 PtrHallo => Req%Hallo(i) 1489 offset = (PtrHallo%offset - 1) * iip1 + 1 1490 Nb = iip1 * PtrHallo%size - 1 1491 1492 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1493 DO l = 1, PtrHallo%NbLevel 1494 !cdir NODEP 1495 DO ij = 0, Nb 1496 PtrHallo%Field(offset + ij, l) = Buffer(Pos + ij) 1497 enddo 1498 1499 Pos = Pos + Nb + 1 1500 enddo 1501 !$OMP ENDDO NOWAIT 1502 enddo 1253 1503 endif 1254 1255 IF (Rdown==0) THEN 1256 RecvDown=.FALSE. 1504 enddo 1505 1506 DO rank = 0, MPI_SIZE - 1 1507 Req => a_request%RequestSend(rank) 1508 IF (Req%NbRequest>0) THEN 1509 CALL deallocate_buffer(Req%Index) 1510 Req%NbRequest = 0 1257 1511 endif 1258 1259 IF (SendUp) THEN 1260 CALL Register_SendField(Field,ijnb_u,ll,jj_begin-jjb_u+1,SUp,MPI_Rank-1,a_request) 1261 ENDIF 1262 1263 IF (SendDown) THEN 1264 CALL Register_SendField(Field,ijnb_u,ll,jj_end-SDown+1-jjb_u+1,SDown,MPI_Rank+1,a_request) 1265 ENDIF 1266 1267 1268 IF (RecvUp) THEN 1269 CALL Register_RecvField(Field,ijnb_u,ll,jj_begin-Rup-jjb_u+1,RUp,MPI_Rank-1,a_request) 1270 ENDIF 1271 1272 IF (RecvDown) THEN 1273 CALL Register_RecvField(Field,ijnb_u,ll,jj_end+1-jjb_u+1,RDown,MPI_Rank+1,a_request) 1274 ENDIF 1275 1276 END SUBROUTINE Register_Hallo_u 1277 1278 SUBROUTINE Register_Hallo_v(Field,ll,RUp,Rdown,SUp,SDown,a_request) 1279 USE dimensions_mod 1280 USE lmdz_mpi 1281 IMPLICIT NONE 1282 INTEGER :: ll 1283 REAL, DIMENSION(ijb_v:ije_v,ll) :: Field 1284 INTEGER :: Sup,Sdown,rup,rdown 1285 type(request) :: a_request 1286 type(Hallo),pointer :: PtrHallo 1287 LOGICAL :: SendUp,SendDown 1288 LOGICAL :: RecvUp,RecvDown 1289 1290 1291 SendUp=.TRUE. 1292 SendDown=.TRUE. 1293 RecvUp=.TRUE. 1294 RecvDown=.TRUE. 1295 1296 IF (pole_nord) THEN 1297 SendUp=.FALSE. 1298 RecvUp=.FALSE. 1299 ENDIF 1300 1301 IF (pole_sud) THEN 1302 SendDown=.FALSE. 1303 RecvDown=.FALSE. 1304 ENDIF 1305 1306 IF (Sup==0) THEN 1307 SendUp=.FALSE. 1308 endif 1309 1310 IF (Sdown==0) THEN 1311 SendDown=.FALSE. 1512 enddo 1513 1514 DO rank = 0, MPI_SIZE - 1 1515 Req => a_request%RequestRecv(rank) 1516 IF (Req%NbRequest>0) THEN 1517 CALL deallocate_buffer(Req%Index) 1518 Req%NbRequest = 0 1312 1519 endif 1313 1314 IF (Rup==0) THEN 1315 RecvUp=.FALSE. 1520 enddo 1521 1522 a_request%tag = 1 1523 END SUBROUTINE WaitRequest 1524 1525 SUBROUTINE WaitSendRequest(a_Request) 1526 USE lmdz_mpi 1527 USE lmdz_dimensions 1528 USE lmdz_paramet 1529 IMPLICIT NONE 1530 1531 type(request), target :: a_request 1532 type(request_SR), pointer :: Req 1533 type(Hallo), pointer :: PtrHallo 1534 INTEGER, DIMENSION(mpi_size) :: TabRequest 1535 INTEGER, DIMENSION(MPI_STATUS_SIZE, mpi_size) :: TabStatus 1536 INTEGER :: NbRequest 1537 INTEGER :: i, rank, pos, ij, l, ierr 1538 INTEGER :: offset 1539 1540 NbRequest = 0 1541 DO rank = 0, MPI_SIZE - 1 1542 Req => a_request%RequestSend(rank) 1543 IF (Req%NbRequest>0) THEN 1544 NbRequest = NbRequest + 1 1545 TabRequest(NbRequest) = Req%MSG_Request 1316 1546 endif 1317 1318 IF (Rdown==0) THEN 1319 RecvDown=.FALSE. 1547 enddo 1548 1549 IF (NbRequest>0 .AND. Req%BufferSize > 0) THEN 1550 !$OMP CRITICAL (MPI) 1551 ! PRINT *,"-------------------------------------------------------------------" 1552 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente" 1553 ! PRINT *,"No des requetes :",TabRequest(1:NbRequest) 1554 CALL MPI_WAITALL(NbRequest, TabRequest, TabStatus, ierr) 1555 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete" 1556 ! PRINT *,"-------------------------------------------------------------------" 1557 1558 !$OMP END CRITICAL (MPI) 1559 endif 1560 1561 DO rank = 0, MPI_SIZE - 1 1562 Req => a_request%RequestSend(rank) 1563 IF (Req%NbRequest>0) THEN 1564 CALL deallocate_buffer(Req%Index) 1565 Req%NbRequest = 0 1320 1566 endif 1321 1322 IF (SendUp) THEN 1323 CALL Register_SendField(Field,ijnb_v,ll,jj_begin-jjb_v+1,SUp,MPI_Rank-1,a_request) 1324 ENDIF 1325 1326 IF (SendDown) THEN 1327 CALL Register_SendField(Field,ijnb_v,ll,jj_end-SDown+1-jjb_v+1,SDown,MPI_Rank+1,a_request) 1328 ENDIF 1329 1330 1331 IF (RecvUp) THEN 1332 CALL Register_RecvField(Field,ijnb_v,ll,jj_begin-Rup-jjb_v+1,RUp,MPI_Rank-1,a_request) 1333 ENDIF 1334 1335 IF (RecvDown) THEN 1336 CALL Register_RecvField(Field,ijnb_v,ll,jj_end+1-jjb_v+1,RDown,MPI_Rank+1,a_request) 1337 ENDIF 1338 1339 END SUBROUTINE Register_Hallo_v 1340 1341 SUBROUTINE SendRequest(a_Request) 1342 USE dimensions_mod 1567 enddo 1568 1569 a_request%tag = 1 1570 END SUBROUTINE WaitSendRequest 1571 1572 SUBROUTINE WaitRecvRequest(a_Request) 1573 USE lmdz_dimensions 1574 USE lmdz_paramet 1343 1575 USE lmdz_mpi 1344 IMPLICIT NONE 1345 1346 type(request),target :: a_request 1347 type(request_SR),pointer :: Req 1348 type(Hallo),pointer :: PtrHallo 1349 INTEGER :: SizeBuffer 1350 INTEGER :: i,rank,l,ij,Pos,ierr 1351 INTEGER :: offset 1352 REAL,DIMENSION(:,:),pointer :: Field 1353 INTEGER :: Nb 1354 1355 DO rank=0,MPI_SIZE-1 1356 1357 Req=>a_Request%RequestSend(rank) 1358 1359 SizeBuffer=0 1360 DO i=1,Req%NbRequest 1361 PtrHallo=>Req%Hallo(i) 1362 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1363 DO l=1,PtrHallo%NbLevel 1364 SizeBuffer=SizeBuffer+PtrHallo%size*iip1 1365 ENDDO 1366 !$OMP ENDDO NOWAIT 1576 IMPLICIT NONE 1577 type(request), target :: a_request 1578 type(request_SR), pointer :: Req 1579 type(Hallo), pointer :: PtrHallo 1580 INTEGER, DIMENSION(mpi_size) :: TabRequest 1581 INTEGER, DIMENSION(MPI_STATUS_SIZE, mpi_size) :: TabStatus 1582 INTEGER :: NbRequest 1583 INTEGER :: i, rank, pos, ij, l, ierr 1584 INTEGER :: offset, Nb 1585 1586 NbRequest = 0 1587 1588 DO rank = 0, MPI_SIZE - 1 1589 Req => a_request%RequestRecv(rank) 1590 IF (Req%NbRequest>0 .AND. Req%BufferSize > 0) THEN 1591 NbRequest = NbRequest + 1 1592 TabRequest(NbRequest) = Req%MSG_Request 1593 endif 1594 enddo 1595 1596 IF (NbRequest>0) THEN 1597 !$OMP CRITICAL (MPI) 1598 ! PRINT *,"-------------------------------------------------------------------" 1599 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente" 1600 ! PRINT *,"No des requetes :",TabRequest(1:NbRequest) 1601 CALL MPI_WAITALL(NbRequest, TabRequest, TabStatus, ierr) 1602 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete" 1603 ! PRINT *,"-------------------------------------------------------------------" 1604 !$OMP END CRITICAL (MPI) 1605 endif 1606 1607 DO rank = 0, MPI_Size - 1 1608 Req => a_request%RequestRecv(rank) 1609 IF (Req%NbRequest>0) THEN 1610 Pos = Req%Pos 1611 DO i = 1, Req%NbRequest 1612 PtrHallo => Req%Hallo(i) 1613 offset = (PtrHallo%offset - 1) * iip1 + 1 1614 Nb = iip1 * PtrHallo%size - 1 1615 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1616 DO l = 1, PtrHallo%NbLevel 1617 !cdir NODEP 1618 DO ij = 0, Nb 1619 PtrHallo%Field(offset + ij, l) = Buffer(Pos + ij) 1620 enddo 1621 Pos = Pos + Nb + 1 1622 enddo 1623 !$OMP END DO NOWAIT 1367 1624 enddo 1368 1369 Req%BufferSize=SizeBuffer 1370 IF (Req%NbRequest>0) THEN 1371 CALL allocate_buffer(SizeBuffer,Req%Index,Req%pos) 1372 1373 Pos=Req%Pos 1374 DO i=1,Req%NbRequest 1375 PtrHallo=>Req%Hallo(i) 1376 offset=(PtrHallo%offset-1)*iip1+1 1377 Nb=iip1*PtrHallo%size-1 1378 Field=>PtrHallo%Field 1379 1380 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1381 DO l=1,PtrHallo%NbLevel 1382 !cdir NODEP 1383 DO ij=0,Nb 1384 Buffer(Pos+ij)=Field(Offset+ij,l) 1385 enddo 1386 1387 Pos=Pos+Nb+1 1388 enddo 1389 !$OMP END DO NOWAIT 1390 enddo 1391 1392 IF (SizeBuffer>0) THEN 1393 !$OMP CRITICAL (MPI) 1394 1395 CALL MPI_ISEND(Buffer(req%Pos),SizeBuffer,MPI_REAL_LMDZ,rank,a_request%tag+1000*omp_rank, & 1396 COMM_LMDZ,Req%MSG_Request,ierr) 1397 IF (.NOT.using_mpi) THEN 1398 PRINT *,'Erreur, echange MPI en mode sequentiel !!!' 1399 CALL abort_gcm("mod_hallo","stopped",1) 1400 ENDIF 1401 ! PRINT *,"-------------------------------------------------------------------" 1402 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->" 1403 ! PRINT *,"Requete envoye au proc :",rank,"tag :",a_request%tag+1000*omp_rank 1404 ! PRINT *,"Taille du message :",SizeBuffer,"requete no :",Req%MSG_Request 1405 ! PRINT *,"-------------------------------------------------------------------" 1406 !$OMP END CRITICAL (MPI) 1407 endif 1408 endif 1625 endif 1409 1626 enddo 1410 1411 1412 DO rank=0,MPI_SIZE-1 1413 1414 Req=>a_Request%RequestRecv(rank) 1415 SizeBuffer=0 1416 1417 DO i=1,Req%NbRequest 1418 PtrHallo=>Req%Hallo(i) 1419 1420 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1421 DO l=1,PtrHallo%NbLevel 1422 SizeBuffer=SizeBuffer+PtrHallo%size*iip1 1423 ENDDO 1424 !$OMP ENDDO NOWAIT 1425 enddo 1426 1427 Req%BufferSize=SizeBuffer 1428 1429 IF (Req%NbRequest>0) THEN 1430 CALL allocate_buffer(SizeBuffer,Req%Index,Req%Pos) 1431 1432 IF (SizeBuffer>0) THEN 1433 !$OMP CRITICAL (MPI) 1434 1435 CALL MPI_IRECV(Buffer(Req%Pos),SizeBuffer,MPI_REAL_LMDZ,rank,a_request%tag+1000*omp_rank, & 1436 COMM_LMDZ,Req%MSG_Request,ierr) 1437 1438 IF (.NOT.using_mpi) THEN 1439 PRINT *,'Erreur, echange MPI en mode sequentiel !!!' 1440 CALL abort_gcm("mod_hallo","stopped",1) 1441 ENDIF 1442 1443 ! PRINT *,"-------------------------------------------------------------------" 1444 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->" 1445 ! PRINT *,"Requete en attente du proc :",rank,"tag :",a_request%tag+1000*omp_rank 1446 ! PRINT *,"Taille du message :",SizeBuffer,"requete no :",Req%MSG_Request 1447 ! PRINT *,"-------------------------------------------------------------------" 1448 1449 !$OMP END CRITICAL (MPI) 1450 endif 1451 endif 1452 1627 1628 DO rank = 0, MPI_SIZE - 1 1629 Req => a_request%RequestRecv(rank) 1630 IF (Req%NbRequest>0) THEN 1631 CALL deallocate_buffer(Req%Index) 1632 Req%NbRequest = 0 1633 endif 1634 enddo 1635 1636 a_request%tag = 1 1637 END SUBROUTINE WaitRecvRequest 1638 1639 1640 SUBROUTINE CopyField(FieldS, FieldR, ij, ll, jj_Nb_New) 1641 USE lmdz_dimensions 1642 USE lmdz_paramet 1643 1644 IMPLICIT NONE 1645 1646 INTEGER :: ij, ll, l 1647 REAL, DIMENSION(ij, ll) :: FieldS 1648 REAL, DIMENSION(ij, ll) :: FieldR 1649 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Nb_New 1650 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Begin_New, jj_End_New 1651 1652 INTEGER :: i, jje, jjb, ijb, ije 1653 1654 jj_begin_New(0) = 1 1655 jj_End_New(0) = jj_Nb_New(0) 1656 DO i = 1, MPI_Size - 1 1657 jj_begin_New(i) = jj_end_New(i - 1) + 1 1658 jj_end_New(i) = jj_begin_new(i) + jj_Nb_New(i) - 1 1659 enddo 1660 1661 jjb = max(jj_begin, jj_begin_new(MPI_Rank)) 1662 jje = min(jj_end, jj_end_new(MPI_Rank)) 1663 IF (ij==ip1jm) jje = min(jje, jjm) 1664 1665 IF (jje >= jjb) THEN 1666 ijb = (jjb - 1) * iip1 + 1 1667 ije = jje * iip1 1668 1669 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1670 DO l = 1, ll 1671 FieldR(ijb:ije, l) = FieldS(ijb:ije, l) 1453 1672 enddo 1454 1455 END SUBROUTINE SendRequest 1456 1457 SUBROUTINE WaitRequest(a_Request) 1458 USE dimensions_mod 1459 USE lmdz_mpi 1460 IMPLICIT NONE 1461 1462 type(request),target :: a_request 1463 type(request_SR),pointer :: Req 1464 type(Hallo),pointer :: PtrHallo 1465 INTEGER, DIMENSION(2*mpi_size) :: TabRequest 1466 INTEGER, DIMENSION(MPI_STATUS_SIZE,2*mpi_size) :: TabStatus 1467 INTEGER :: NbRequest 1468 INTEGER :: i,rank,pos,ij,l,ierr 1469 INTEGER :: offset 1470 INTEGER :: Nb 1471 1472 1473 NbRequest=0 1474 DO rank=0,MPI_SIZE-1 1475 Req=>a_request%RequestSend(rank) 1476 IF (Req%NbRequest>0 .AND. Req%BufferSize > 0) THEN 1477 NbRequest=NbRequest+1 1478 TabRequest(NbRequest)=Req%MSG_Request 1479 endif 1673 !$OMP ENDDO NOWAIT 1674 endif 1675 1676 END SUBROUTINE CopyField 1677 1678 SUBROUTINE CopyFieldHallo(FieldS, FieldR, ij, ll, jj_Nb_New, Up, Down) 1679 USE lmdz_dimensions 1680 USE lmdz_paramet 1681 1682 IMPLICIT NONE 1683 1684 INTEGER :: ij, ll, Up, Down 1685 REAL, DIMENSION(ij, ll) :: FieldS 1686 REAL, DIMENSION(ij, ll) :: FieldR 1687 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Nb_New 1688 INTEGER, DIMENSION(0:MPI_Size - 1) :: jj_Begin_New, jj_End_New 1689 1690 INTEGER :: i, jje, jjb, ijb, ije, l 1691 1692 jj_begin_New(0) = 1 1693 jj_End_New(0) = jj_Nb_New(0) 1694 DO i = 1, MPI_Size - 1 1695 jj_begin_New(i) = jj_end_New(i - 1) + 1 1696 jj_end_New(i) = jj_begin_new(i) + jj_Nb_New(i) - 1 1697 enddo 1698 1699 jjb = max(jj_begin, jj_begin_new(MPI_Rank) - Up) 1700 jje = min(jj_end, jj_end_new(MPI_Rank) + Down) 1701 IF (ij==ip1jm) jje = min(jje, jjm) 1702 1703 IF (jje >= jjb) THEN 1704 ijb = (jjb - 1) * iip1 + 1 1705 ije = jje * iip1 1706 1707 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1708 DO l = 1, ll 1709 FieldR(ijb:ije, l) = FieldS(ijb:ije, l) 1480 1710 enddo 1481 1482 DO rank=0,MPI_SIZE-1 1483 Req=>a_request%RequestRecv(rank) 1484 IF (Req%NbRequest>0 .AND. Req%BufferSize > 0 ) THEN 1485 NbRequest=NbRequest+1 1486 TabRequest(NbRequest)=Req%MSG_Request 1487 endif 1488 enddo 1489 1490 IF (NbRequest>0) THEN 1491 !$OMP CRITICAL (MPI) 1492 ! PRINT *,"-------------------------------------------------------------------" 1493 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente" 1494 ! PRINT *,"No des requetes :",TabRequest(1:NbRequest) 1495 CALL MPI_WAITALL(NbRequest,TabRequest,TabStatus,ierr) 1496 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete" 1497 ! PRINT *,"-------------------------------------------------------------------" 1498 !$OMP END CRITICAL (MPI) 1499 endif 1500 DO rank=0,MPI_Size-1 1501 Req=>a_request%RequestRecv(rank) 1502 IF (Req%NbRequest>0) THEN 1503 Pos=Req%Pos 1504 DO i=1,Req%NbRequest 1505 PtrHallo=>Req%Hallo(i) 1506 offset=(PtrHallo%offset-1)*iip1+1 1507 Nb=iip1*PtrHallo%size-1 1508 1509 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1510 DO l=1,PtrHallo%NbLevel 1511 !cdir NODEP 1512 DO ij=0,Nb 1513 PtrHallo%Field(offset+ij,l)=Buffer(Pos+ij) 1514 enddo 1515 1516 Pos=Pos+Nb+1 1517 enddo 1518 !$OMP ENDDO NOWAIT 1519 enddo 1520 endif 1521 enddo 1522 1523 DO rank=0,MPI_SIZE-1 1524 Req=>a_request%RequestSend(rank) 1525 IF (Req%NbRequest>0) THEN 1526 CALL deallocate_buffer(Req%Index) 1527 Req%NbRequest=0 1528 endif 1529 enddo 1530 1531 DO rank=0,MPI_SIZE-1 1532 Req=>a_request%RequestRecv(rank) 1533 IF (Req%NbRequest>0) THEN 1534 CALL deallocate_buffer(Req%Index) 1535 Req%NbRequest=0 1536 endif 1537 enddo 1538 1539 a_request%tag=1 1540 END SUBROUTINE WaitRequest 1541 1542 SUBROUTINE WaitSendRequest(a_Request) 1543 USE lmdz_mpi 1544 USE dimensions_mod 1545 IMPLICIT NONE 1546 1547 type(request),target :: a_request 1548 type(request_SR),pointer :: Req 1549 type(Hallo),pointer :: PtrHallo 1550 INTEGER, DIMENSION(mpi_size) :: TabRequest 1551 INTEGER, DIMENSION(MPI_STATUS_SIZE,mpi_size) :: TabStatus 1552 INTEGER :: NbRequest 1553 INTEGER :: i,rank,pos,ij,l,ierr 1554 INTEGER :: offset 1555 1556 1557 NbRequest=0 1558 DO rank=0,MPI_SIZE-1 1559 Req=>a_request%RequestSend(rank) 1560 IF (Req%NbRequest>0) THEN 1561 NbRequest=NbRequest+1 1562 TabRequest(NbRequest)=Req%MSG_Request 1563 endif 1564 enddo 1565 1566 1567 IF (NbRequest>0 .AND. Req%BufferSize > 0 ) THEN 1568 !$OMP CRITICAL (MPI) 1569 ! PRINT *,"-------------------------------------------------------------------" 1570 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente" 1571 ! PRINT *,"No des requetes :",TabRequest(1:NbRequest) 1572 CALL MPI_WAITALL(NbRequest,TabRequest,TabStatus,ierr) 1573 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete" 1574 ! PRINT *,"-------------------------------------------------------------------" 1575 1576 !$OMP END CRITICAL (MPI) 1577 endif 1578 1579 DO rank=0,MPI_SIZE-1 1580 Req=>a_request%RequestSend(rank) 1581 IF (Req%NbRequest>0) THEN 1582 CALL deallocate_buffer(Req%Index) 1583 Req%NbRequest=0 1584 endif 1585 enddo 1586 1587 a_request%tag=1 1588 END SUBROUTINE WaitSendRequest 1589 1590 SUBROUTINE WaitRecvRequest(a_Request) 1591 USE dimensions_mod 1592 USE lmdz_mpi 1593 IMPLICIT NONE 1594 type(request),target :: a_request 1595 type(request_SR),pointer :: Req 1596 type(Hallo),pointer :: PtrHallo 1597 INTEGER, DIMENSION(mpi_size) :: TabRequest 1598 INTEGER, DIMENSION(MPI_STATUS_SIZE,mpi_size) :: TabStatus 1599 INTEGER :: NbRequest 1600 INTEGER :: i,rank,pos,ij,l,ierr 1601 INTEGER :: offset,Nb 1602 1603 1604 NbRequest=0 1605 1606 DO rank=0,MPI_SIZE-1 1607 Req=>a_request%RequestRecv(rank) 1608 IF (Req%NbRequest>0 .AND. Req%BufferSize > 0 ) THEN 1609 NbRequest=NbRequest+1 1610 TabRequest(NbRequest)=Req%MSG_Request 1611 endif 1612 enddo 1613 1614 1615 IF (NbRequest>0) THEN 1616 !$OMP CRITICAL (MPI) 1617 ! PRINT *,"-------------------------------------------------------------------" 1618 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente" 1619 ! PRINT *,"No des requetes :",TabRequest(1:NbRequest) 1620 CALL MPI_WAITALL(NbRequest,TabRequest,TabStatus,ierr) 1621 ! PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete" 1622 ! PRINT *,"-------------------------------------------------------------------" 1623 !$OMP END CRITICAL (MPI) 1624 endif 1625 1626 DO rank=0,MPI_Size-1 1627 Req=>a_request%RequestRecv(rank) 1628 IF (Req%NbRequest>0) THEN 1629 Pos=Req%Pos 1630 DO i=1,Req%NbRequest 1631 PtrHallo=>Req%Hallo(i) 1632 offset=(PtrHallo%offset-1)*iip1+1 1633 Nb=iip1*PtrHallo%size-1 1634 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1635 DO l=1,PtrHallo%NbLevel 1636 !cdir NODEP 1637 DO ij=0,Nb 1638 PtrHallo%Field(offset+ij,l)=Buffer(Pos+ij) 1639 enddo 1640 Pos=Pos+Nb+1 1641 enddo 1642 !$OMP END DO NOWAIT 1643 enddo 1644 endif 1645 enddo 1646 1647 1648 DO rank=0,MPI_SIZE-1 1649 Req=>a_request%RequestRecv(rank) 1650 IF (Req%NbRequest>0) THEN 1651 CALL deallocate_buffer(Req%Index) 1652 Req%NbRequest=0 1653 endif 1654 enddo 1655 1656 a_request%tag=1 1657 END SUBROUTINE WaitRecvRequest 1658 1659 1660 1661 SUBROUTINE CopyField(FieldS,FieldR,ij,ll,jj_Nb_New) 1662 USE dimensions_mod 1663 1664 IMPLICIT NONE 1665 1666 INTEGER :: ij,ll,l 1667 REAL, DIMENSION(ij,ll) :: FieldS 1668 REAL, DIMENSION(ij,ll) :: FieldR 1669 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Nb_New 1670 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New 1671 1672 INTEGER ::i,jje,jjb,ijb,ije 1673 1674 jj_begin_New(0)=1 1675 jj_End_New(0)=jj_Nb_New(0) 1676 DO i=1,MPI_Size-1 1677 jj_begin_New(i)=jj_end_New(i-1)+1 1678 jj_end_New(i)=jj_begin_new(i)+jj_Nb_New(i)-1 1679 enddo 1680 1681 jjb=max(jj_begin,jj_begin_new(MPI_Rank)) 1682 jje=min(jj_end,jj_end_new(MPI_Rank)) 1683 IF (ij==ip1jm) jje=min(jje,jjm) 1684 1685 IF (jje >= jjb) THEN 1686 ijb=(jjb-1)*iip1+1 1687 ije=jje*iip1 1688 1689 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1690 DO l=1,ll 1691 FieldR(ijb:ije,l)=FieldS(ijb:ije,l) 1692 enddo 1693 !$OMP ENDDO NOWAIT 1711 !$OMP ENDDO NOWAIT 1712 1694 1713 endif 1695 1696 1697 END SUBROUTINE CopyField 1698 1699 SUBROUTINE CopyFieldHallo(FieldS,FieldR,ij,ll,jj_Nb_New,Up,Down) 1700 USE dimensions_mod 1701 1702 IMPLICIT NONE 1703 1704 INTEGER :: ij,ll,Up,Down 1705 REAL, DIMENSION(ij,ll) :: FieldS 1706 REAL, DIMENSION(ij,ll) :: FieldR 1707 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Nb_New 1708 INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New 1709 1710 INTEGER ::i,jje,jjb,ijb,ije,l 1711 1712 1713 jj_begin_New(0)=1 1714 jj_End_New(0)=jj_Nb_New(0) 1715 DO i=1,MPI_Size-1 1716 jj_begin_New(i)=jj_end_New(i-1)+1 1717 jj_end_New(i)=jj_begin_new(i)+jj_Nb_New(i)-1 1718 enddo 1719 1720 1721 jjb=max(jj_begin,jj_begin_new(MPI_Rank)-Up) 1722 jje=min(jj_end,jj_end_new(MPI_Rank)+Down) 1723 IF (ij==ip1jm) jje=min(jje,jjm) 1724 1725 1726 IF (jje >= jjb) THEN 1727 ijb=(jjb-1)*iip1+1 1728 ije=jje*iip1 1729 1730 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1731 DO l=1,ll 1732 FieldR(ijb:ije,l)=FieldS(ijb:ije,l) 1733 enddo 1734 !$OMP ENDDO NOWAIT 1735 1736 endif 1737 END SUBROUTINE CopyFieldHallo 1738 1739 SUBROUTINE Gather_field_u(field_loc,field_glo,ll) 1740 USE dimensions_mod 1741 IMPLICIT NONE 1742 INTEGER :: ll 1743 REAL :: field_loc(ijb_u:ije_u,ll) 1744 REAL :: field_glo(ip1jmp1,ll) 1745 type(request) :: request_gather 1746 INTEGER :: l 1747 1748 1749 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1750 DO l=1,ll 1751 field_glo(ij_begin:ij_end,l)=field_loc(ij_begin:ij_end,l) 1752 ENDDO 1753 1754 CALL register_SwapField(field_glo,field_glo,ip1jmp1,ll,distrib_gather%jj_nb_para,request_gather) 1755 CALL SendRequest(request_gather) 1756 !$OMP BARRIER 1757 CALL WaitRequest(request_gather) 1758 !$OMP BARRIER 1759 1760 END SUBROUTINE Gather_field_u 1761 1762 SUBROUTINE Gather_field_v(field_loc,field_glo,ll) 1763 USE dimensions_mod 1764 IMPLICIT NONE 1765 INTEGER :: ll 1766 REAL :: field_loc(ijb_v:ije_v,ll) 1767 REAL :: field_glo(ip1jm,ll) 1768 type(request) :: request_gather 1769 INTEGER :: ijb,ije 1770 INTEGER :: l 1771 1772 1773 ijb=ij_begin 1774 ije=ij_end 1775 IF (pole_sud) ije=ij_end-iip1 1776 1777 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1778 DO l=1,ll 1779 field_glo(ijb:ije,l)=field_loc(ijb:ije,l) 1780 ENDDO 1781 1782 CALL register_SwapField(field_glo,field_glo,ip1jm,ll,distrib_gather%jj_nb_para,request_gather) 1783 CALL SendRequest(request_gather) 1784 !$OMP BARRIER 1785 CALL WaitRequest(request_gather) 1786 !$OMP BARRIER 1787 1788 END SUBROUTINE Gather_field_v 1789 1790 SUBROUTINE Scatter_field_u(field_glo,field_loc,ll) 1791 USE dimensions_mod 1792 IMPLICIT NONE 1793 INTEGER :: ll 1794 REAL :: field_glo(ip1jmp1,ll) 1795 REAL :: field_loc(ijb_u:ije_u,ll) 1796 type(request) :: request_gather 1797 TYPE(distrib) :: distrib_swap 1798 INTEGER :: l 1799 1800 !$OMP BARRIER 1801 !$OMP MASTER 1802 CALL get_current_distrib(distrib_swap) 1803 CALL set_Distrib(distrib_gather) 1804 !$OMP END MASTER 1805 !$OMP BARRIER 1806 1807 CALL register_SwapField(field_glo,field_glo,ip1jmp1,ll,distrib_swap%jj_nb_para,request_gather) 1808 CALL SendRequest(request_gather) 1809 !$OMP BARRIER 1810 CALL WaitRequest(request_gather) 1811 !$OMP BARRIER 1812 !$OMP MASTER 1813 CALL set_Distrib(distrib_swap) 1814 !$OMP END MASTER 1815 !$OMP BARRIER 1816 1817 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1818 DO l=1,ll 1819 field_loc(ij_begin:ij_end,l)=field_glo(ij_begin:ij_end,l) 1820 ENDDO 1821 1822 END SUBROUTINE Scatter_field_u 1823 1824 SUBROUTINE Scatter_field_v(field_glo,field_loc,ll) 1825 USE dimensions_mod 1826 IMPLICIT NONE 1827 INTEGER :: ll 1828 REAL :: field_glo(ip1jmp1,ll) 1829 REAL :: field_loc(ijb_v:ije_v,ll) 1830 type(request) :: request_gather 1831 TYPE(distrib) :: distrib_swap 1832 INTEGER :: ijb,ije,l 1833 1834 1835 !$OMP BARRIER 1836 !$OMP MASTER 1837 CALL get_current_distrib(distrib_swap) 1838 CALL set_Distrib(distrib_gather) 1839 !$OMP END MASTER 1840 !$OMP BARRIER 1841 CALL register_SwapField(field_glo,field_glo,ip1jm,ll,distrib_swap%jj_nb_para,request_gather) 1842 CALL SendRequest(request_gather) 1843 !$OMP BARRIER 1844 CALL WaitRequest(request_gather) 1845 !$OMP BARRIER 1846 !$OMP MASTER 1847 CALL set_Distrib(distrib_swap) 1848 !$OMP END MASTER 1849 !$OMP BARRIER 1850 ijb=ij_begin 1851 ije=ij_end 1852 IF (pole_sud) ije=ij_end-iip1 1853 1854 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1855 DO l=1,ll 1856 field_loc(ijb:ije,l)=field_glo(ijb:ije,l) 1857 ENDDO 1858 1859 END SUBROUTINE Scatter_field_v 1860 1714 END SUBROUTINE CopyFieldHallo 1715 1716 SUBROUTINE Gather_field_u(field_loc, field_glo, ll) 1717 USE lmdz_dimensions 1718 USE lmdz_paramet 1719 IMPLICIT NONE 1720 INTEGER :: ll 1721 REAL :: field_loc(ijb_u:ije_u, ll) 1722 REAL :: field_glo(ip1jmp1, ll) 1723 type(request) :: request_gather 1724 INTEGER :: l 1725 1726 1727 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1728 DO l = 1, ll 1729 field_glo(ij_begin:ij_end, l) = field_loc(ij_begin:ij_end, l) 1730 ENDDO 1731 1732 CALL register_SwapField(field_glo, field_glo, ip1jmp1, ll, distrib_gather%jj_nb_para, request_gather) 1733 CALL SendRequest(request_gather) 1734 !$OMP BARRIER 1735 CALL WaitRequest(request_gather) 1736 !$OMP BARRIER 1737 1738 END SUBROUTINE Gather_field_u 1739 1740 SUBROUTINE Gather_field_v(field_loc, field_glo, ll) 1741 USE lmdz_dimensions 1742 USE lmdz_paramet 1743 IMPLICIT NONE 1744 INTEGER :: ll 1745 REAL :: field_loc(ijb_v:ije_v, ll) 1746 REAL :: field_glo(ip1jm, ll) 1747 type(request) :: request_gather 1748 INTEGER :: ijb, ije 1749 INTEGER :: l 1750 1751 ijb = ij_begin 1752 ije = ij_end 1753 IF (pole_sud) ije = ij_end - iip1 1754 1755 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1756 DO l = 1, ll 1757 field_glo(ijb:ije, l) = field_loc(ijb:ije, l) 1758 ENDDO 1759 1760 CALL register_SwapField(field_glo, field_glo, ip1jm, ll, distrib_gather%jj_nb_para, request_gather) 1761 CALL SendRequest(request_gather) 1762 !$OMP BARRIER 1763 CALL WaitRequest(request_gather) 1764 !$OMP BARRIER 1765 1766 END SUBROUTINE Gather_field_v 1767 1768 SUBROUTINE Scatter_field_u(field_glo, field_loc, ll) 1769 USE lmdz_dimensions 1770 USE lmdz_paramet 1771 IMPLICIT NONE 1772 INTEGER :: ll 1773 REAL :: field_glo(ip1jmp1, ll) 1774 REAL :: field_loc(ijb_u:ije_u, ll) 1775 type(request) :: request_gather 1776 TYPE(distrib) :: distrib_swap 1777 INTEGER :: l 1778 1779 !$OMP BARRIER 1780 !$OMP MASTER 1781 CALL get_current_distrib(distrib_swap) 1782 CALL set_Distrib(distrib_gather) 1783 !$OMP END MASTER 1784 !$OMP BARRIER 1785 1786 CALL register_SwapField(field_glo, field_glo, ip1jmp1, ll, distrib_swap%jj_nb_para, request_gather) 1787 CALL SendRequest(request_gather) 1788 !$OMP BARRIER 1789 CALL WaitRequest(request_gather) 1790 !$OMP BARRIER 1791 !$OMP MASTER 1792 CALL set_Distrib(distrib_swap) 1793 !$OMP END MASTER 1794 !$OMP BARRIER 1795 1796 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1797 DO l = 1, ll 1798 field_loc(ij_begin:ij_end, l) = field_glo(ij_begin:ij_end, l) 1799 ENDDO 1800 1801 END SUBROUTINE Scatter_field_u 1802 1803 SUBROUTINE Scatter_field_v(field_glo, field_loc, ll) 1804 USE lmdz_dimensions 1805 USE lmdz_paramet 1806 IMPLICIT NONE 1807 INTEGER :: ll 1808 REAL :: field_glo(ip1jmp1, ll) 1809 REAL :: field_loc(ijb_v:ije_v, ll) 1810 type(request) :: request_gather 1811 TYPE(distrib) :: distrib_swap 1812 INTEGER :: ijb, ije, l 1813 1814 1815 !$OMP BARRIER 1816 !$OMP MASTER 1817 CALL get_current_distrib(distrib_swap) 1818 CALL set_Distrib(distrib_gather) 1819 !$OMP END MASTER 1820 !$OMP BARRIER 1821 CALL register_SwapField(field_glo, field_glo, ip1jm, ll, distrib_swap%jj_nb_para, request_gather) 1822 CALL SendRequest(request_gather) 1823 !$OMP BARRIER 1824 CALL WaitRequest(request_gather) 1825 !$OMP BARRIER 1826 !$OMP MASTER 1827 CALL set_Distrib(distrib_swap) 1828 !$OMP END MASTER 1829 !$OMP BARRIER 1830 ijb = ij_begin 1831 ije = ij_end 1832 IF (pole_sud) ije = ij_end - iip1 1833 1834 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1835 DO l = 1, ll 1836 field_loc(ijb:ije, l) = field_glo(ijb:ije, l) 1837 ENDDO 1838 1839 END SUBROUTINE Scatter_field_v 1840 1861 1841 END MODULE mod_Hallo 1862 1842 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/mod_xios_dyn3dmem.F90
r5158 r5159 40 40 USE lmdz_comgeom 41 41 42 IMPLICIT NONE 43 44 INCLUDE 'dimensions.h' 45 INCLUDE "paramet.h" 42 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 43 USE lmdz_paramet 44 IMPLICIT NONE 45 46 47 46 48 47 49 TYPE(xios_duration) :: tstep_xios … … 132 134 133 135 USE parallel_lmdz 134 IMPLICIT NONE 135 INCLUDE 'dimensions.h' 136 INCLUDE 'paramet.h' 136 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 137 USE lmdz_paramet 138 IMPLICIT NONE 139 140 137 141 CHARACTER(LEN=*) :: name 138 142 REAL, DIMENSION(ij_begin:ij_end) :: Field … … 153 157 154 158 USE parallel_lmdz 155 IMPLICIT NONE 156 INCLUDE 'dimensions.h' 157 INCLUDE 'paramet.h' 159 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 160 USE lmdz_paramet 161 IMPLICIT NONE 162 163 158 164 CHARACTER(LEN=*) :: name 159 165 REAL, DIMENSION(ij_begin:ij_end,llm) :: Field … … 186 192 187 193 USE parallel_lmdz 188 IMPLICIT NONE 189 INCLUDE 'dimensions.h' 190 INCLUDE 'paramet.h' 194 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 195 USE lmdz_paramet 196 IMPLICIT NONE 197 198 191 199 CHARACTER(LEN=*) :: name 192 200 REAL, DIMENSION(ij_begin:ij_end) :: Field … … 216 224 217 225 USE parallel_lmdz 218 IMPLICIT NONE 219 INCLUDE 'dimensions.h' 220 INCLUDE 'paramet.h' 226 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 227 USE lmdz_paramet 228 IMPLICIT NONE 229 230 221 231 CHARACTER(LEN=*) :: name 222 232 REAL, DIMENSION(ij_begin:ij_end,llm) :: Field -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/nxgrad_gam_loc.f90
r5136 r5159 1 1 SUBROUTINE nxgrad_gam_loc( klevel, rot, x, y ) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! ******************************************************************** 6 6 ! calcul du gradient tourne de pi/2 du rotationnel du vect.v … … 8 8 ! rot est un argument d'entree pour le s-prog 9 9 ! x et y sont des arguments de sortie pour le s-prog 10 ! 10 11 11 USE parallel_lmdz 12 12 USE lmdz_comgeom 13 13 14 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 15 USE lmdz_paramet 14 16 IMPLICIT NONE 15 17 ! 16 INCLUDE "dimensions.h" 17 INCLUDE "paramet.h" 18 19 18 20 INTEGER :: klevel 19 21 REAL :: rot( ijb_v:ije_v,klevel ) … … 23 25 external ismin,ismax 24 26 INTEGER :: ijb,ije 25 ! 27 26 28 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 27 29 DO l = 1,klevel 28 ! 30 29 31 ijb=ij_begin 30 32 ije=ij_end … … 34 36 y( ij,l ) = (rot( ij,l ) - rot( ij-1,l )) * cvscuvgam( ij ) 35 37 END DO 36 ! 38 37 39 ! ..... correction pour y ( 1,j,l ) ...... 38 ! 40 39 41 ! .... y(1,j,l)= y(iip1,j,l) .... 40 42 !DIR$ IVDEP … … 42 44 y( ij,l ) = y( ij +iim,l ) 43 45 END DO 44 ! 46 45 47 ijb=ij_begin 46 48 ije=ij_end+iip1 … … 63 65 ENDDO 64 66 ENDIF 65 ! 67 66 68 END DO 67 69 !$OMP END DO NOWAIT -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/nxgrad_loc.f90
r5136 r5159 1 1 SUBROUTINE nxgrad_loc(klevel, rot, x, y ) 2 ! 2 3 3 ! P. Le Van 4 ! 4 5 5 ! ******************************************************************** 6 6 ! calcul du gradient tourne de pi/2 du rotationnel du vect.v … … 8 8 ! rot est un argument d'entree pour le s-prog 9 9 ! x et y sont des arguments de sortie pour le s-prog 10 ! 10 11 11 USE parallel_lmdz 12 12 USE lmdz_comgeom 13 13 14 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 15 USE lmdz_paramet 14 16 IMPLICIT NONE 15 17 ! 16 INCLUDE "dimensions.h" 17 INCLUDE "paramet.h" 18 19 18 20 INTEGER :: klevel 19 21 REAL :: rot( ijb_v:ije_v,klevel ),x( ijb_u:ije_u,klevel ) … … 21 23 INTEGER :: l,ij 22 24 INTEGER :: ijb,ije 23 ! 24 ! 25 26 25 27 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 26 28 DO l = 1,klevel 27 ! 29 28 30 ijb=ij_begin 29 31 ije=ij_end … … 33 35 y( ij,l ) = ( rot( ij,l ) - rot( ij-1,l ) ) * cvsurcuv( ij ) 34 36 END DO 35 ! 37 36 38 ! ..... correction pour y ( 1,j,l ) ...... 37 ! 39 38 40 ! .... y(1,j,l)= y(iip1,j,l) .... 39 41 !DIR$ IVDEP … … 41 43 y( ij,l ) = y( ij +iim,l ) 42 44 END DO 43 ! 45 44 46 ijb=ij_begin 45 47 ije=ij_end+iip1 … … 63 65 ENDDO 64 66 ENDIF 65 ! 67 66 68 END DO 67 69 !$OMP END DO NOWAIT -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/nxgraro2_loc.f90
r5134 r5159 1 1 SUBROUTINE nxgraro2_loc(klevel,xcov,ycov,lr,grx_out,gry_out) 2 ! 2 3 3 ! P.Le Van . 4 4 ! *********************************************************** 5 5 ! lr 6 6 ! calcul de ( nxgrad (rot) ) du vect. v .... 7 ! 7 8 8 ! xcov et ycov etant les compos. covariantes de v 9 9 ! *********************************************************** 10 10 ! xcov , ycov et lr sont des arguments d'entree pour le s-prog 11 11 ! grx et gry sont des arguments de sortie pour le s-prog 12 ! 13 ! 12 13 14 14 USE write_Field_p 15 15 USE parallel_lmdz … … 20 20 USE lmdz_comdissipn, ONLY: tetaudiv, tetaurot, tetah, cdivu, crot, cdivh 21 21 22 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 23 USE lmdz_paramet 22 24 IMPLICIT NONE 23 25 ! 24 INCLUDE "dimensions.h" 25 INCLUDE "paramet.h" 26 ! 26 27 28 27 29 ! ...... variables en arguments ....... 28 ! 30 29 31 INTEGER :: klevel 30 32 REAL :: xcov( ijb_u:ije_u,klevel ), ycov( ijb_v:ije_v,klevel ) 31 33 REAL :: grx_out( ijb_u:ije_u,klevel ),gry_out(ijb_v:ije_v,klevel) 32 ! 34 33 35 ! ...... variables locales ........ 34 ! 36 35 37 REAL :: signe, nugradrs 36 38 INTEGER :: l,ij,iter,lr … … 38 40 !$OMP THREADPRIVATE(Request_dissip) 39 41 ! ........................................................ 40 ! 42 41 43 INTEGER :: ijb,ije,jjb,jje 42 44 43 ! 44 ! 45 46 45 47 signe = (-1.)**lr 46 48 nugradrs = signe * crot 47 ! 49 48 50 ! CALL SCOPY ( ip1jmp1* klevel, xcov, 1, grx, 1 ) 49 51 ! CALL SCOPY ( ip1jm * klevel, ycov, 1, gry, 1 ) … … 75 77 !$OMP END DO NOWAIT 76 78 77 ! 79 78 80 CALL rotatf_loc ( klevel, grx, gry, rot ) 79 81 ! CALL write_field3d_p('rot1',reshape(rot,(/iip1,jjm,llm/))) … … 88 90 CALL laplacien_rot_loc ( klevel, rot, rot,grx,gry ) 89 91 ! CALL write_field3d_p('rot2',reshape(rot,(/iip1,jjm,llm/))) 90 ! 92 91 93 ! ..... Iteration de l'operateur laplacien_rotgam ..... 92 ! 94 93 95 DO iter = 1, lr -2 94 96 !$OMP BARRIER … … 104 106 ! CALL write_field3d_p('rot3',reshape(rot,(/iip1,jjm,llm/))) 105 107 106 ! 107 ! 108 109 108 110 jjb=jj_begin 109 111 jje=jj_end … … 121 123 CALL nxgrad_loc ( klevel, rot, grx, gry ) 122 124 123 ! 125 124 126 ijb=ij_begin 125 127 ije=ij_end -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/nxgraro2_mod.F90
r1907 r5159 11 11 USE allocate_field_mod 12 12 USE parallel_lmdz 13 USE dimensions_mod 13 USE lmdz_dimensions 14 USE lmdz_paramet 14 15 IMPLICIT NONE 15 16 TYPE(distrib),POINTER :: d -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/parallel_lmdz.F90
r5158 r5159 82 82 USE lmdz_mpi 83 83 USE lmdz_iniprint, ONLY: lunout, prt_level 84 IMPLICIT NONE 85 INCLUDE "dimensions.h" 86 INCLUDE "paramet.h" 84 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 85 USE lmdz_paramet 86 IMPLICIT NONE 87 88 87 89 88 90 INTEGER :: ierr … … 238 240 239 241 SUBROUTINE create_distrib(jj_nb_new, d) 240 IMPLICIT NONE 241 INCLUDE "dimensions.h" 242 INCLUDE "paramet.h" 242 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 243 USE lmdz_paramet 244 IMPLICIT NONE 245 246 243 247 244 248 INTEGER, INTENT(IN) :: jj_Nb_New(0:MPI_Size - 1) … … 289 293 290 294 SUBROUTINE Set_Distrib(d) 291 IMPLICIT NONE 292 293 INCLUDE "dimensions.h" 294 INCLUDE "paramet.h" 295 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 296 USE lmdz_paramet 297 IMPLICIT NONE 298 299 295 300 TYPE(distrib), INTENT(IN) :: d 296 301 … … 324 329 325 330 SUBROUTINE copy_distrib(dist, new_dist) 326 IMPLICIT NONE 327 328 INCLUDE "dimensions.h" 329 INCLUDE "paramet.h" 331 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 332 USE lmdz_paramet 333 IMPLICIT NONE 334 335 330 336 TYPE(distrib), INTENT(INOUT) :: dist 331 337 TYPE(distrib), INTENT(IN) :: new_dist … … 360 366 361 367 SUBROUTINE get_current_distrib(d) 362 IMPLICIT NONE 363 364 INCLUDE "dimensions.h" 365 INCLUDE "paramet.h" 368 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 369 USE lmdz_paramet 370 IMPLICIT NONE 371 372 366 373 TYPE(distrib), INTENT(OUT) :: d 367 374 … … 372 379 SUBROUTINE Finalize_parallel 373 380 USE lmdz_mpi 374 ! ug Pour les sorties XIOS 375 USE lmdz_wxios 381 USE lmdz_wxios ! ug Pour les sorties XIOS 382 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 383 USE lmdz_paramet 376 384 377 385 … … 391 399 CHARACTER(LEN = 6), parameter :: type_ocean = "dummy" 392 400 #endif 393 394 INCLUDE "dimensions.h"395 INCLUDE "paramet.h"396 401 397 402 INTEGER :: ierr … … 431 436 432 437 SUBROUTINE Pack_Data(Field, ij, ll, row, Buffer) 433 IMPLICIT NONE 434 435 INCLUDE "dimensions.h" 436 INCLUDE "paramet.h" 438 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 439 USE lmdz_paramet 440 IMPLICIT NONE 441 442 437 443 438 444 INTEGER, INTENT(IN) :: ij, ll, row … … 454 460 455 461 SUBROUTINE Unpack_Data(Field, ij, ll, row, Buffer) 456 IMPLICIT NONE 457 458 INCLUDE "dimensions.h" 459 INCLUDE "paramet.h" 462 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 463 USE lmdz_paramet 464 IMPLICIT NONE 465 466 460 467 461 468 INTEGER, INTENT(IN) :: ij, ll, row … … 493 500 USE lmdz_mpi 494 501 USE lmdz_vampir 495 IMPLICIT NONE 496 INCLUDE "dimensions.h" 497 INCLUDE "paramet.h" 502 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 503 USE lmdz_paramet 504 IMPLICIT NONE 505 506 498 507 INTEGER :: ij, ll 499 508 REAL, DIMENSION(ij, ll) :: Field … … 607 616 USE lmdz_mpi 608 617 USE lmdz_iniprint, ONLY: lunout, prt_level 609 IMPLICIT NONE 610 INCLUDE "dimensions.h" 611 INCLUDE "paramet.h" 618 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 619 USE lmdz_paramet 620 IMPLICIT NONE 621 622 612 623 INTEGER :: ij, ll, rank 613 624 REAL, DIMENSION(ij, ll) :: Field … … 685 696 SUBROUTINE AllGather_Field(Field, ij, ll) 686 697 USE lmdz_mpi 687 IMPLICIT NONE 688 INCLUDE "dimensions.h" 689 INCLUDE "paramet.h" 698 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 699 USE lmdz_paramet 700 IMPLICIT NONE 701 702 690 703 INTEGER :: ij, ll 691 704 REAL, DIMENSION(ij, ll) :: Field … … 703 716 SUBROUTINE Broadcast_Field(Field, ij, ll, rank) 704 717 USE lmdz_mpi 705 IMPLICIT NONE 706 INCLUDE "dimensions.h" 707 INCLUDE "paramet.h" 718 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 719 USE lmdz_paramet 720 IMPLICIT NONE 721 722 708 723 INTEGER :: ij, ll 709 724 REAL, DIMENSION(ij, ll) :: Field … … 720 735 END SUBROUTINE Broadcast_Field 721 736 722 723 ! Subroutine verif_hallo(Field,ij,ll,up,down) 724 ! USE lmdz_mpi 725 ! IMPLICIT NONE 726 ! INCLUDE "dimensions.h" 727 ! INCLUDE "paramet.h" 728 729 ! INTEGER :: ij,ll 730 ! REAL, DIMENSION(ij,ll) :: Field 731 ! INTEGER :: up,down 732 733 ! REAL,DIMENSION(ij,ll): NewField 734 735 ! NewField=0 736 737 ! ijb=ij_begin 738 ! ije=ij_end 739 ! if (pole_nord) 740 ! NewField(ij_be 741 742 end MODULE parallel_lmdz 737 END MODULE parallel_lmdz -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/pression_loc.f90
r5117 r5159 11 11 ! couches , avec p(ij,llm +1) = 0. et p(ij,1) = ps(ij) . 12 12 ! ************************************************************************ 13 ! 13 14 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 15 USE lmdz_paramet 14 16 IMPLICIT NONE 15 17 ! 16 INCLUDE "dimensions.h" 17 INCLUDE "paramet.h" 18 ! 18 19 20 19 21 INTEGER,INTENT(IN) :: ngrid ! not used 20 22 INTEGER :: l,ij -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/qminimum_loc.f90
r5158 r5159 10 10 11 11 12 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 13 USE lmdz_paramet 12 14 IMPLICIT NONE 13 ! 15 14 16 ! -- Objet : Traiter les valeurs trop petites (meme negatives) 15 17 ! pour l'eau vapeur et l'eau liquide 16 18 ! 17 INCLUDE "dimensions.h" 18 INCLUDE "paramet.h" 19 ! 19 20 21 20 22 INTEGER :: nqtot ! CRisi: on remplace nq par nqtot 21 23 REAL :: q(ijb_u:ije_u, llm, nqtot), deltap(ijb_u:ije_u, llm) 22 ! 24 23 25 LOGICAL, SAVE :: first = .TRUE. 24 26 INTEGER, SAVE :: iq_vap, iq_liq ! indices pour l'eau vapeur/liquide … … 26 28 REAL, PARAMETER :: seuil_vap = 1.0e-10 ! seuil pour l'eau vapeur 27 29 REAL, PARAMETER :: seuil_liq = 1.0e-11 ! seuil pour l'eau liquide 28 ! 30 29 31 ! NB. ....( Il est souhaitable mais non obligatoire que les valeurs des 30 32 ! parametres seuil_vap, seuil_liq soient pareilles a celles 31 33 ! qui sont utilisees dans la routine ADDFI ) 32 34 ! ................................................................. 33 ! 35 34 36 !DC iq_val and iq_liq are usable for q only, NOT for q_follow 35 37 ! and zx_defau_diag (crash if iq_val/liq==3) => vapor/liquid … … 40 42 REAL :: zx_defau_diag(ijb_u:ije_u, llm, 2) 41 43 REAL :: q_follow(ijb_u:ije_u, llm, 2) 42 ! 44 43 45 INTEGER :: imprim 44 46 SAVE imprim … … 59 61 first = .FALSE. 60 62 END IF 61 ! 63 62 64 ! Quand l'eau liquide est trop petite (ou negative), on prend 63 65 ! l'eau vapeur de la meme couche et la convertit en eau liquide … … 96 98 END DO 97 99 98 ! 100 99 101 ! Quand l'eau vapeur est trop faible (ou negative), on complete 100 102 ! le defaut en prennant de l'eau vapeur de la couche au-dessous. 101 ! 103 102 104 !WRITE(lunout,*) 'qminimum 81' 103 105 DO k = llm, 2, -1 … … 119 121 ENDDO 120 122 121 ! 123 122 124 ! Quand il s'agit de la premiere couche au-dessus du sol, on 123 125 ! doit imprimer un message d'avertissement (saturation possible). 124 ! 126 125 127 !WRITE(lunout,*) 'qminimum 106' 126 128 nb_pump = 0 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/rotat_nfil_loc.f90
r5136 r5159 1 1 SUBROUTINE rotat_nfil_loc(klevel, x, y, rot ) 2 ! 2 3 3 ! Auteur : P.Le Van 4 4 !************************************************************** … … 9 9 ! klevel, x et y sont des arguments d'entree pour le s-prog 10 10 ! rot est un argument de sortie pour le s-prog 11 ! 11 12 12 USE parallel_lmdz 13 13 USE lmdz_comgeom 14 14 15 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 16 USE lmdz_paramet 15 17 IMPLICIT NONE 16 18 ! 17 INCLUDE "dimensions.h" 18 INCLUDE "paramet.h" 19 ! 19 20 21 20 22 ! ..... variables en arguments ...... 21 ! 23 22 24 INTEGER :: klevel 23 25 REAL :: rot( ijb_v:ije_v,klevel ) 24 26 REAL :: x( ijb_u:ije_u,klevel ), y( ijb_v:ije_v,klevel ) 25 ! 27 26 28 ! ... variables locales ... 27 ! 29 28 30 INTEGER :: l, ij 29 31 INTEGER :: ijb,ije 30 ! 31 ! 32 33 32 34 ijb=ij_begin 33 35 ije=ij_end … … 35 37 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 36 38 DO l = 1,klevel 37 ! 39 38 40 DO ij = ijb, ije - 1 39 41 rot( ij,l ) = y( ij+1 , l ) - y( ij,l ) + & 40 42 x(ij +iip1, l ) - x( ij,l ) 41 43 ENDDO 42 ! 44 43 45 ! .... correction pour rot( iip1,j,l) .... 44 46 ! .... rot(iip1,j,l)= rot(1,j,l) ... … … 47 49 rot( ij,l ) = rot( ij -iim,l ) 48 50 ENDDO 49 ! 51 50 52 END DO 51 53 !$OMP END DO NOWAIT -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/rotat_p.f90
r5136 r5159 1 1 SUBROUTINE rotat_p(klevel, x, y, rot ) 2 ! 2 3 3 ! Auteur : P.Le Van 4 4 !************************************************************** … … 9 9 ! klevel, x et y sont des arguments d'entree pour le s-prog 10 10 ! rot est un argument de sortie pour le s-prog 11 ! 11 12 12 USE parallel_lmdz 13 13 USE lmdz_comgeom 14 14 15 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 16 USE lmdz_paramet 15 17 IMPLICIT NONE 16 18 ! 17 INCLUDE "dimensions.h" 18 INCLUDE "paramet.h" 19 ! 19 20 21 20 22 ! ..... variables en arguments ...... 21 ! 23 22 24 INTEGER :: klevel 23 25 REAL :: rot( ip1jm,klevel ) 24 26 REAL :: x( ip1jmp1,klevel ), y( ip1jm,klevel ) 25 ! 27 26 28 ! ... variables locales ... 27 ! 29 28 30 INTEGER :: l, ij 29 31 INTEGER :: ijb,ije 30 ! 31 ! 32 33 32 34 ijb=ij_begin 33 35 ije=ij_end … … 36 38 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 37 39 DO l = 1,klevel 38 ! 40 39 41 DO ij = ijb, ije - 1 40 42 rot( ij,l ) = y( ij+1 , l ) - y( ij,l ) + & 41 43 x(ij +iip1, l ) - x( ij,l ) 42 44 ENDDO 43 ! 45 44 46 ! .... correction pour rot( iip1,j,l) .... 45 47 ! .... rot(iip1,j,l)= rot(1,j,l) ... … … 48 50 rot( ij,l ) = rot( ij -iim,l ) 49 51 ENDDO 50 ! 52 51 53 END DO 52 54 !$OMP END DO NOWAIT … … 59 61 ENDDO 60 62 !$OMP END DO NOWAIT 61 ! 63 62 64 ! 63 65 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/rotatf_loc.f90
r5136 r5159 1 1 SUBROUTINE rotatf_loc(klevel, x, y, rot ) 2 ! 2 3 3 ! Auteur : P.Le Van 4 4 !************************************************************** … … 9 9 ! klevel, x et y sont des arguments d'entree pour le s-prog 10 10 ! rot est un argument de sortie pour le s-prog 11 ! 11 12 12 USE parallel_lmdz 13 13 USE lmdz_filtreg_p 14 14 USE lmdz_comgeom 15 15 16 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 17 USE lmdz_paramet 16 18 IMPLICIT NONE 17 19 ! 18 INCLUDE "dimensions.h" 19 INCLUDE "paramet.h" 20 ! 20 21 22 21 23 ! ..... variables en arguments ...... 22 ! 24 23 25 INTEGER :: klevel 24 26 REAL :: rot( ijb_v:ije_v,klevel ) 25 27 REAL :: x( ijb_u:ije_u,klevel ), y( ijb_v:ije_v,klevel ) 26 ! 28 27 29 ! ... variables locales ... 28 ! 30 29 31 INTEGER :: l, ij 30 32 INTEGER :: ijb,ije,jjb,jje 31 ! 32 ! 33 34 33 35 ijb=ij_begin 34 36 ije=ij_end … … 37 39 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 38 40 DO l = 1,klevel 39 ! 41 40 42 DO ij = ijb, ije - 1 41 43 rot( ij,l ) = y( ij+1 , l ) - y( ij,l ) + & 42 44 x(ij +iip1, l ) - x( ij,l ) 43 45 ENDDO 44 ! 46 45 47 ! .... correction pour rot( iip1,j,l) .... 46 48 ! .... rot(iip1,j,l)= rot(1,j,l) ... … … 49 51 rot( ij,l ) = rot( ij -iim,l ) 50 52 ENDDO 51 ! 53 52 54 END DO 53 55 !$OMP END DO NOWAIT … … 65 67 ENDDO 66 68 !$OMP END DO NOWAIT 67 ! 69 68 70 ! 69 71 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/sw_case_williamson91_6_loc.f90
r5158 r5159 4 4 5 5 !======================================================================= 6 ! 6 7 7 ! Author: Thomas Dubos original: 26/01/2010 8 8 ! ------- 9 ! 9 10 10 ! Subject: 11 11 ! ------ 12 12 ! Realise le cas-test 6 de Williamson et al. (1991) : onde de Rossby-Haurwitz 13 ! 13 14 14 ! Method: 15 15 ! -------- 16 ! 16 17 17 ! Interface: 18 18 ! ---------- 19 ! 19 20 20 ! Input: 21 21 ! ------ 22 ! 22 23 23 ! Output: 24 24 ! ------- 25 ! 25 26 26 !======================================================================= 27 27 USE parallel_lmdz … … 31 31 USE lmdz_comgeom 32 32 33 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 34 USE lmdz_paramet 33 35 IMPLICIT NONE 34 36 !----------------------------------------------------------------------- … … 36 38 ! --------------- 37 39 38 INCLUDE "dimensions.h" 39 INCLUDE "paramet.h" 40 41 40 42 41 43 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/times.F90
r5158 r5159 26 26 SUBROUTINE init_timer 27 27 USE parallel_lmdz 28 IMPLICIT NONE 29 INCLUDE "dimensions.h" 30 INCLUDE "paramet.h" 28 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 29 USE lmdz_paramet 30 IMPLICIT NONE 31 32 31 33 32 34 max_size=jjm+1 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/top_bound_loc.f90
r5158 r5159 10 10 USE lmdz_comgeom2 11 11 12 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 13 USE lmdz_paramet 12 14 IMPLICIT NONE 13 15 ! 14 INCLUDE "dimensions.h" 15 INCLUDE "paramet.h" 16 17 16 18 17 19 … … 21 23 22 24 !======================================================================= 23 ! 25 24 26 ! Auteur: F. LOTT 25 27 ! ------- 26 ! 28 27 29 ! Objet: 28 30 ! ------ 29 ! 31 30 32 ! Dissipation linéaire (ex top_bound de la physique) 31 ! 33 32 34 !======================================================================= 33 35 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/tourpot_loc.F90
r5136 r5159 9 9 USE lmdz_comgeom 10 10 11 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 12 USE lmdz_paramet 11 13 IMPLICIT NONE 12 INCLUDE "dimensions.h" 13 INCLUDE "paramet.h" 14 15 14 16 !=============================================================================== 15 17 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vitvert_loc.F90
r5134 r5159 8 8 USE comvert_mod, ONLY: bp 9 9 10 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 11 USE lmdz_paramet 10 12 IMPLICIT NONE 11 INCLUDE "dimensions.h" 12 INCLUDE "paramet.h" 13 14 13 15 !=============================================================================== 14 16 ! Arguments: -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlsplt_loc.f90
r5158 r5159 4 4 5 5 ! Auteurs: P.Le Van, F.Hourdin, F.Forget 6 ! 6 7 7 ! ******************************************************************** 8 8 ! Shema d'advection " pseudo amont " . 9 9 ! ******************************************************************** 10 10 ! nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg .... 11 ! 12 ! 11 12 13 13 ! -------------------------------------------------------------------- 14 14 USE parallel_lmdz … … 16 16 min_qParent, min_qMass, min_ratio ! MVals et CRisi 17 17 USE lmdz_iniprint, ONLY: lunout, prt_level 18 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 19 USE lmdz_paramet 18 20 IMPLICIT NONE 19 21 ! 20 INCLUDE "dimensions.h" 21 INCLUDE "paramet.h" 22 ! 23 ! 22 23 24 25 24 26 ! Arguments: 25 27 ! ---------- … … 29 31 REAL :: w(ijb_u:ije_u, llm) 30 32 INTEGER :: iq ! CRisi 31 ! 33 32 34 ! Local 33 35 ! --------- 34 ! 36 35 37 INTEGER :: ij, l, j, i, iju, ijq, indu(ijnb_u), niju 36 38 INTEGER :: n0, iadvplus(ijb_u:ije_u, llm), nl(llm) 37 ! 39 38 40 REAL :: new_m, zu_m, zdum(ijb_u:ije_u, llm) 39 41 REAL :: sigu(ijb_u:ije_u), dxq(ijb_u:ije_u, llm), dxqu(ijb_u:ije_u) … … 367 369 368 370 SUBROUTINE vly_loc(q, pente_max, masse, masse_adv_v, iq) 369 ! 371 370 372 ! Auteurs: P.Le Van, F.Hourdin, F.Forget 371 ! 373 372 374 ! ******************************************************************** 373 375 ! Shema d'advection " pseudo amont " . … … 375 377 ! q,masse_adv_v,w sont des arguments d'entree pour le s-pg .... 376 378 ! dq sont des arguments de sortie pour le s-pg .... 377 ! 378 ! 379 380 379 381 ! -------------------------------------------------------------------- 380 382 USE parallel_lmdz … … 385 387 USE lmdz_comgeom 386 388 389 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 390 USE lmdz_paramet 387 391 IMPLICIT NONE 388 392 ! 389 INCLUDE "dimensions.h" 390 INCLUDE "paramet.h" 391 ! 392 ! 393 394 395 396 393 397 ! Arguments: 394 398 ! ---------- … … 397 401 REAL :: q(ijb_u:ije_u, llm, nqtot), dq(ijb_u:ije_u, llm) 398 402 INTEGER :: iq ! CRisi 399 ! 403 400 404 ! Local 401 405 ! --------- 402 ! 406 403 407 INTEGER :: i, ij, l 404 ! 408 405 409 REAL :: airej2, airejjm, airescb(iim), airesch(iim) 406 410 REAL :: dyq(ijb_u:ije_u, llm), dyqv(ijb_v:ije_v), zdvm(ijb_u:ije_u, llm) … … 456 460 ENDIF 457 461 458 ! 462 459 463 ! PRINT*,'CALCUL EN LATITUDE' 460 464 461 465 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 462 466 DO l = 1, llm 463 ! 467 464 468 ! -------------------------------- 465 469 ! CALCUL EN LATITUDE … … 596 600 ! appn=min(pente_max/appn,1.) 597 601 ! apps=min(pente_max/apps,1.) 598 ! 599 ! 602 603 600 604 ! cas ou on a un extremum au pole 601 ! 605 602 606 ! IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.) 603 607 ! & appn=0. … … 605 609 ! & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.) 606 610 ! & apps=0. 607 ! 611 608 612 ! limitation des pentes aux poles 609 613 ! DO ij=1,iip1 … … 611 615 ! dyq(ip1jm+ij)=apps*dyq(ip1jm+ij) 612 616 ! ENDDO 613 ! 617 614 618 ! test 615 619 ! DO ij=1,iip1 … … 620 624 ! dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1)) 621 625 ! ENDDO 622 ! 626 623 627 ! changement 10 07 96 624 628 ! IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.) … … 632 636 ! ENDDO 633 637 ! ENDIF 634 ! 638 635 639 ! IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)* 636 640 ! & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.) … … 797 801 798 802 SUBROUTINE vlz_loc(q, pente_max, masse, w, ijb_x, ije_x, iq) 799 ! 803 800 804 ! Auteurs: P.Le Van, F.Hourdin, F.Forget 801 ! 805 802 806 ! ******************************************************************** 803 807 ! Shema d'advection " pseudo amont " . … … 805 809 ! q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg .... 806 810 ! dq sont des arguments de sortie pour le s-pg .... 807 ! 808 ! 811 812 809 813 ! -------------------------------------------------------------------- 810 814 USE parallel_lmdz … … 815 819 816 820 821 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 822 USE lmdz_paramet 817 823 IMPLICIT NONE 818 824 ! 819 INCLUDE "dimensions.h" 820 INCLUDE "paramet.h" 821 ! 822 ! 825 826 827 828 823 829 ! Arguments: 824 830 ! ---------- … … 827 833 REAL :: w(ijb_u:ije_u, llm + 1, nqtot) 828 834 INTEGER :: iq 829 ! 835 830 836 ! Local 831 837 ! --------- 832 ! 838 833 839 INTEGER :: i, ij, l, j, ii 834 840 … … 837 843 INTEGER, SAVE :: countcfl 838 844 !$OMP THREADPRIVATE(countcfl) 839 ! 845 840 846 REAL :: newmasse 841 847 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlspltgen_loc.F90
r5158 r5159 4 4 pdt, p, pk, teta) 5 5 6 ! 6 7 7 ! Auteurs: P.Le Van, F.Hourdin, F.Forget, F.Codron 8 ! 8 9 9 ! ******************************************************************** 10 10 ! Schema d'advection " pseudo amont " . … … 13 13 ! ******************************************************************** 14 14 ! q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg .... 15 ! 15 16 16 ! pente_max facteur de limitation des pentes: 2 en general 17 17 ! 0 pour un schema amont 18 18 ! pbaru,pbarv,w flux de masse en u ,v ,w 19 19 ! pdt pas de temps 20 ! 20 21 21 ! teta temperature potentielle, p pression aux interfaces, 22 22 ! pk exner au milieu des couches necessaire pour calculer Qsat … … 33 33 34 34 35 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 36 USE lmdz_paramet 35 37 IMPLICIT NONE 36 38 37 39 ! 38 INCLUDE "dimensions.h" 39 INCLUDE "paramet.h" 40 41 ! 40 41 42 43 42 44 ! Arguments: 43 45 ! ---------- … … 48 50 REAL :: p(ijb_u:ije_u, llmp1), teta(ijb_u:ije_u, llm) 49 51 REAL :: pk(ijb_u:ije_u, llm) 50 ! 52 51 53 ! Local 52 54 ! --------- 53 ! 55 54 56 INTEGER :: ij, l 55 ! 57 56 58 REAL :: zzpbar, zzw 57 59 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlspltgen_mod.F90
r5101 r5159 16 16 USE infotrac 17 17 USE vlz_mod,ONLY: vlz_allocate 18 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 19 USE lmdz_paramet 18 20 IMPLICIT NONE 19 INCLUDE "dimensions.h" 20 INCLUDE "paramet.h" 21 22 21 23 TYPE(distrib),POINTER :: d 22 24 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlspltqs_loc.f90
r5158 r5159 2 2 3 3 SUBROUTINE vlxqs_loc(q, pente_max, masse, u_m, qsat, ijb_x, ije_x, iq) 4 ! 4 5 5 ! Auteurs: P.Le Van, F.Hourdin, F.Forget 6 ! 6 7 7 ! ******************************************************************** 8 8 ! Shema d''advection " pseudo amont " . 9 9 ! ******************************************************************** 10 ! 10 11 11 ! -------------------------------------------------------------------- 12 12 USE parallel_lmdz 13 13 USE infotrac, ONLY: nqtot, tracers, & ! CRisi & 14 14 min_qParent, min_qMass, min_ratio ! MVals et CRisi7 15 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 16 USE lmdz_paramet 15 17 IMPLICIT NONE 16 18 ! 17 INCLUDE "dimensions.h" 18 INCLUDE "paramet.h" 19 ! 20 ! 19 20 21 22 21 23 ! Arguments: 22 24 ! ---------- … … 26 28 REAL :: qsat(ijb_u:ije_u, llm) 27 29 INTEGER :: iq ! CRisi 28 ! 30 29 31 ! Local 30 32 ! --------- 31 ! 33 32 34 INTEGER :: ij, l, j, i, iju, ijq, indu(ijnb_u), niju 33 35 INTEGER :: n0, iadvplus(ijb_u:ije_u, llm), nl(llm) 34 ! 36 35 37 REAL :: new_m, zu_m, zdum(ijb_u:ije_u, llm) 36 38 REAL :: dxq(ijb_u:ije_u, llm), dxqu(ijb_u:ije_u) … … 374 376 END SUBROUTINE vlxqs_loc 375 377 SUBROUTINE vlyqs_loc(q, pente_max, masse, masse_adv_v, qsat, iq) 376 ! 378 377 379 ! Auteurs: P.Le Van, F.Hourdin, F.Forget 378 ! 380 379 381 ! ******************************************************************** 380 382 ! Shema d'advection " pseudo amont " . … … 382 384 ! q,masse_adv_v,w sont des arguments d'entree pour le s-pg .... 383 385 ! qsat est un argument de sortie pour le s-pg .... 384 ! 385 ! 386 387 386 388 ! -------------------------------------------------------------------- 387 389 USE parallel_lmdz … … 393 395 USE lmdz_comgeom 394 396 397 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 398 USE lmdz_paramet 395 399 IMPLICIT NONE 396 400 ! 397 INCLUDE "dimensions.h" 398 INCLUDE "paramet.h" 399 ! 400 ! 401 402 403 404 401 405 ! Arguments: 402 406 ! ---------- … … 406 410 REAL :: qsat(ijb_u:ije_u, llm) 407 411 INTEGER :: iq ! CRisi 408 ! 412 409 413 ! Local 410 414 ! --------- 411 ! 415 412 416 INTEGER :: i, ij, l 413 ! 417 414 418 REAL :: airej2, airejjm, airescb(iim), airesch(iim) 415 419 REAL :: dyq(ijb_u:ije_u, llm), dyqv(ijb_v:ije_v) … … 429 433 !$OMP THREADPRIVATE(sinlon,coslon,sinlondlon,coslondlon) 430 434 !$OMP THREADPRIVATE(airej2,airejjm) 431 ! 432 ! 435 436 433 437 REAL :: Ratio(ijb_u:ije_u, llm, nqtot) ! CRisi 434 438 INTEGER :: ifils, iq2 ! CRisi … … 471 475 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 472 476 DO l = 1, llm 473 ! 477 474 478 ! -------------------------------- 475 479 ! CALCUL EN LATITUDE … … 602 606 ! appn=min(pente_max/appn,1.) 603 607 ! apps=min(pente_max/apps,1.) 604 ! 605 ! 608 609 606 610 ! cas ou on a un extremum au pole 607 ! 611 608 612 ! IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.) 609 613 ! & appn=0. … … 611 615 ! & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.) 612 616 ! & apps=0. 613 ! 617 614 618 ! limitation des pentes aux poles 615 619 ! DO ij=1,iip1 … … 617 621 ! dyq(ip1jm+ij)=apps*dyq(ip1jm+ij) 618 622 ! ENDDO 619 ! 623 620 624 ! test 621 625 ! DO ij=1,iip1 … … 626 630 ! dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1)) 627 631 ! ENDDO 628 ! 632 629 633 ! changement 10 07 96 630 634 ! IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.) … … 638 642 ! ENDDO 639 643 ! ENDIF 640 ! 644 641 645 ! IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)* 642 646 ! & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.) -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlz_mod.F90
r4050 r5159 15 15 USE parallel_lmdz 16 16 USE infotrac 17 USE dimensions_mod 17 USE lmdz_dimensions 18 USE lmdz_paramet 18 19 IMPLICIT NONE 19 20 TYPE(distrib),POINTER :: d -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/wrgrads.f90
r5158 r5159 113 113 enddo 114 114 WRITE(unit(if), '(a7)') 'ENDVARS' 115 ! 115 116 116 1000 format(a5, 3x, i4, i3, 1x, a39) 117 117 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/write_field_loc.F90
r5134 r5159 37 37 USE lmdz_write_field 38 38 USE mod_hallo 39 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 40 USE lmdz_paramet 39 41 IMPLICIT NONE 40 INCLUDE 'dimensions.h' 41 INCLUDE 'paramet.h' 42 43 42 44 43 45 CHARACTER(LEN=*) :: name … … 102 104 USE lmdz_write_field 103 105 USE mod_hallo 106 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 107 USE lmdz_paramet 104 108 IMPLICIT NONE 105 INCLUDE 'dimensions.h' 106 INCLUDE 'paramet.h' 109 110 107 111 108 112 CHARACTER(LEN=*) :: name -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/writedyn_xios.F90
r5158 r5159 16 16 USE lmdz_comgeom 17 17 18 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 19 USE lmdz_paramet 18 20 IMPLICIT NONE 19 21 … … 36 38 37 39 ! Declarations 38 INCLUDE "dimensions.h" 39 INCLUDE "paramet.h" 40 41 40 42 41 43 ! Arguments -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/writedynav_loc.f90
r5158 r5159 16 16 USE lmdz_comgeom 17 17 18 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 19 USE lmdz_paramet 18 20 IMPLICIT NONE 19 21 20 ! 22 21 23 ! Ecriture du fichier histoire au format IOIPSL 22 ! 24 23 25 ! Appels succesifs des routines: histwrite 24 ! 26 25 27 ! Entree: 26 28 ! histid: ID du fichier histoire … … 34 36 ! ps :pression au sol 35 37 ! phis : geopotentiel au sol 36 ! 37 ! 38 39 38 40 ! Sortie: 39 41 ! fileid: ID du fichier netcdf cree 40 ! 42 41 43 ! L. Fairhead, LMD, 03/99 42 ! 44 43 45 ! ===================================================================== 44 ! 46 45 47 ! Declarations 46 INCLUDE "dimensions.h" 47 INCLUDE "paramet.h" 48 49 ! 48 49 50 51 50 52 ! Arguments 51 53 ! … … 62 64 ! This routine needs IOIPSL 63 65 ! Variables locales 64 ! 66 65 67 INTEGER, SAVE, ALLOCATABLE :: ndex2d(:), ndexu(:), ndexv(:) 66 68 INTEGER :: iq, ii, ll … … 73 75 !$OMP THREADPRIVATE(first) 74 76 75 ! 77 76 78 ! Initialisations 77 ! 79 78 80 IF (adjust) return 79 81 … … 101 103 CALL covnat_loc(llm, ucov, vcov, unat, vnat) 102 104 103 ! 105 104 106 ! Appels a histwrite pour l'ecriture des variables a sauvegarder 105 ! 107 106 108 ! Vents U 107 109 ! … … 117 119 !$OMP END MASTER 118 120 119 ! 121 120 122 ! Vents V 121 ! 123 122 124 ije = ij_end 123 125 IF (pole_sud) jjn = jj_nb - 1 … … 130 132 131 133 132 ! 134 133 135 ! Temperature potentielle moyennee 134 ! 136 135 137 ijb = ij_begin 136 138 ije = ij_end … … 141 143 !$OMP END MASTER 142 144 143 ! 145 144 146 ! Temperature moyennee 145 147 ! … … 159 161 160 162 161 ! 163 162 164 ! Geopotentiel 163 ! 165 164 166 !$OMP MASTER 165 167 CALL histwrite(histaveid, 'phi', itau_w, phi(ijb:ije, :), & … … 168 170 169 171 170 ! 172 171 173 ! Traceurs 172 ! 174 173 175 !!$OMP MASTER 174 176 ! DO iq=1,nqtot … … 179 181 180 182 181 ! 183 182 184 ! Masse 183 ! 185 184 186 !$OMP MASTER 185 187 CALL histwrite(histaveid, 'masse', itau_w, masse(ijb:ije, :), & … … 188 190 189 191 190 ! 192 191 193 ! Pression au sol 192 ! 194 193 195 !$OMP MASTER 194 196 … … 197 199 !$OMP END MASTER 198 200 199 ! 201 200 202 ! Geopotentiel au sol 201 ! 203 202 204 !$OMP MASTER 203 205 ! CALL histwrite(histaveid, 'phis', itau_w, phis(ijb:ije), … … 205 207 !$OMP END MASTER 206 208 207 ! 209 208 210 ! Fin 209 ! 211 210 212 !$OMP MASTER 211 213 IF (ok_sync) THEN -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/writehist_loc.f90
r5158 r5159 13 13 USE lmdz_comgeom 14 14 15 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm 16 USE lmdz_paramet 15 17 IMPLICIT NONE 16 18 17 ! 19 18 20 ! Ecriture du fichier histoire au format IOIPSL 19 ! 21 20 22 ! Appels succesifs des routines: histwrite 21 ! 23 22 24 ! Entree: 23 25 ! histid: ID du fichier histoire … … 31 33 ! ps :pression au sol 32 34 ! phis : geopotentiel au sol 33 ! 34 ! 35 36 35 37 ! Sortie: 36 38 ! fileid: ID du fichier netcdf cree 37 ! 39 38 40 ! L. Fairhead, LMD, 03/99 39 ! 41 40 42 ! ===================================================================== 41 ! 43 42 44 ! Declarations 43 INCLUDE "dimensions.h" 44 INCLUDE "paramet.h" 45 46 ! 45 46 47 48 47 49 ! Arguments 48 50 ! … … 59 61 ! This routine needs IOIPSL 60 62 ! Variables locales 61 ! 63 62 64 INTEGER, SAVE, ALLOCATABLE :: ndex2d(:), ndexu(:), ndexv(:) 63 65 INTEGER :: iq, ii, ll … … 70 72 !$OMP THREADPRIVATE(first) 71 73 72 ! 74 73 75 ! Initialisations 74 ! 76 75 77 IF (adjust) return 76 78 … … 98 100 CALL covnat_loc(llm, ucov, vcov, unat, vnat) 99 101 100 ! 102 101 103 ! Appels a histwrite pour l'ecriture des variables a sauvegarder 102 ! 104 103 105 ! Vents U 104 106 ! … … 114 116 !$OMP END MASTER 115 117 116 ! 118 117 119 ! Vents V 118 ! 120 119 121 ije = ij_end 120 122 IF (pole_sud) jjn = jj_nb - 1 … … 127 129 128 130 129 ! 131 130 132 ! Temperature potentielle 131 ! 133 132 134 ijb = ij_begin 133 135 ije = ij_end … … 138 140 !$OMP END MASTER 139 141 140 ! 142 141 143 ! Temperature 142 144 ! … … 156 158 157 159 158 ! 160 159 161 ! Geopotentiel 160 ! 162 161 163 !$OMP MASTER 162 164 CALL histwrite(histid, 'phi', itau_w, phi(ijb:ije, :), & … … 165 167 166 168 167 ! 169 168 170 ! Traceurs 169 ! 171 170 172 !!$OMP MASTER 171 173 ! DO iq=1,nqtot … … 176 178 177 179 178 ! 180 179 181 ! Masse 180 ! 182 181 183 !$OMP MASTER 182 184 CALL histwrite(histid, 'masse', itau_w, masse(ijb:ije, :), & … … 185 187 186 188 187 ! 189 188 190 ! Pression au sol 189 ! 191 190 192 !$OMP MASTER 191 193 CALL histwrite(histid, 'ps', itau_w, ps(ijb:ije), & … … 193 195 !$OMP END MASTER 194 196 195 ! 197 196 198 ! Geopotentiel au sol 197 ! 199 198 200 !$OMP MASTER 199 201 ! CALL histwrite(histid, 'phis', itau_w, phis(ijb:ije), … … 201 203 !$OMP END MASTER 202 204 203 ! 205 204 206 ! Fin 205 ! 207 206 208 !$OMP MASTER 207 209 IF (ok_sync) THEN
Note: See TracChangeset
for help on using the changeset viewer.