Changeset 1302 for trunk/LMDZ.COMMON/libf/dyn3dpar
- Timestamp:
- Jun 26, 2014, 6:07:05 PM (11 years ago)
- Location:
- trunk/LMDZ.COMMON/libf/dyn3dpar
- Files:
-
- 9 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.COMMON/libf/dyn3dpar/calfis_p.F
r1256 r1302 225 225 save unskap 226 226 227 cIM diagnostique PVteta, Amip2228 INTEGER,PARAMETER :: ntetaSTD=3229 REAL,SAVE :: rtetaSTD(ntetaSTD)=(/350.,380.,405./) ! Earth-specific, beware !!230 REAL PVteta(klon,ntetaSTD)231 232 233 227 REAL SSUM 234 228 … … 267 261 klon=klon_mpi 268 262 269 PVteta(:,:)=0.270 271 263 IF ( firstcal ) THEN 272 264 debut = .TRUE. … … 684 676 endif 685 677 686 687 IF (is_sequential.and.(planet_type=="earth")) THEN688 #ifdef CPP_EARTH689 ! PVtheta calls tetalevel, which is in the physics690 cIM calcul PV a teta=350, 380, 405K691 CALL PVtheta(ngridmx,llm,pucov,pvcov,pteta,692 $ ztfi,zplay,zplev,693 $ ntetaSTD,rtetaSTD,PVteta)694 c695 #endif696 ENDIF697 698 678 c On change de grille, dynamique vers physiq, pour le flux de masse verticale 699 679 CALL gr_dyn_fi_p(llm,iip1,jjp1,klon,flxw,flxwfi) … … 923 903 . zdqfi_omp, 924 904 . zdpsrf_omp, 925 cIM diagnostique PVteta, Amip2 926 . pducov, 927 . PVteta) 905 . pducov) 928 906 929 907 else if ( planet_type=="generic" ) then -
trunk/LMDZ.COMMON/libf/dyn3dpar/ce0l.F90
r1019 r1302 1 1 ! 2 ! $Id: ce0l.F90 1 615 2012-02-10 15:42:26Z emillour $2 ! $Id: ce0l.F90 1984 2014-02-18 09:59:29Z emillour $ 3 3 ! 4 4 !------------------------------------------------------------------------------- … … 115 115 END IF 116 116 117 IF (grilles_gcm_netcdf) THEN 118 WRITE(lunout,'(//)') 119 WRITE(lunout,*) ' *************************** ' 120 WRITE(lunout,*) ' *** grilles_gcm_netcdf *** ' 121 WRITE(lunout,*) ' *************************** ' 122 WRITE(lunout,'(//)') 123 CALL grilles_gcm_netcdf_sub(masque,phis) 124 END IF 117 WRITE(lunout,'(//)') 118 WRITE(lunout,*) ' *************************** ' 119 WRITE(lunout,*) ' *** grilles_gcm_netcdf *** ' 120 WRITE(lunout,*) ' *************************** ' 121 WRITE(lunout,'(//)') 122 CALL grilles_gcm_netcdf_sub(masque,phis) 125 123 126 124 #ifdef CPP_MPI … … 137 135 ! 138 136 !------------------------------------------------------------------------------- 137 -
trunk/LMDZ.COMMON/libf/dyn3dpar/conf_gcm.F
r1300 r1302 2 2 ! $Id: conf_gcm.F 1438 2010-10-08 10:19:34Z jghattas $ 3 3 ! 4 c 5 c 4 ! 5 ! 6 6 SUBROUTINE conf_gcm( tapedef, etatinit ) 7 c 7 ! 8 8 #ifdef CPP_IOIPSL 9 9 use IOIPSL … … 20 20 use sponge_mod_p, only: callsponge,mode_sponge,nsponge,tetasponge 21 21 IMPLICIT NONE 22 c-----------------------------------------------------------------------23 cAuteurs : L. Fairhead , P. Le Van .24 c 25 cArguments :26 c 27 ctapedef :28 cetatinit : = TRUE , on ne compare pas les valeurs des para-29 c-metres du zoom avec celles lues sur le fichier start .30 c 22 !----------------------------------------------------------------------- 23 ! Auteurs : L. Fairhead , P. Le Van . 24 ! 25 ! Arguments : 26 ! 27 ! tapedef : 28 ! etatinit : = TRUE , on ne compare pas les valeurs des para- 29 ! -metres du zoom avec celles lues sur le fichier start . 30 ! 31 31 LOGICAL etatinit 32 32 INTEGER tapedef 33 33 34 cDeclarations :35 c--------------34 ! Declarations : 35 ! -------------- 36 36 #include "dimensions.h" 37 37 #include "paramet.h" … … 45 45 ! FH 2008/05/09 On elimine toutes les clefs physiques dans la dynamique 46 46 ! #include "clesphys.h" 47 c 48 c 49 clocal:50 c------47 ! 48 ! 49 ! local: 50 ! ------ 51 51 52 52 CHARACTER ch1*72,ch2*72,ch3*72,ch4*12 … … 60 60 integer,external :: OMP_GET_NUM_THREADS 61 61 #endif 62 c 63 c-------------------------------------------------------------------64 c 65 c......... Version du 29/04/97 ..........66 c 67 cNouveaux parametres nitergdiv,nitergrot,niterh,tetagdiv,tetagrot,68 ctetatemp ajoutes pour la dissipation .69 c 70 cAutre parametre ajoute en fin de liste de tapedef : ** fxyhypb **71 c 72 cSi fxyhypb = .TRUE. , choix de la fonction a derivee tangente hyperb.73 cSinon , choix de fxynew , a derivee sinusoidale ..74 c 75 c...... etatinit = . TRUE. si defrun est appele dans ETAT0_LMD ou76 cLIMIT_LMD pour l'initialisation de start.dat (dic) et77 cde limit.dat ( dic) ...........78 cSinon etatinit = . FALSE .79 c 80 cDonc etatinit = .F. si on veut comparer les valeurs de grossismx ,81 cgrossismy,clon,clat, fxyhypb lues sur le fichier start avec82 ccelles passees par run.def , au debut du gcm, apres l'appel a83 clectba .84 cCes parmetres definissant entre autres la grille et doivent etre85 cpareils et coherents , sinon il y aura divergence du gcm .86 c 87 c-----------------------------------------------------------------------88 cinitialisations:89 c----------------62 ! 63 ! ------------------------------------------------------------------- 64 ! 65 ! ......... Version du 29/04/97 .......... 66 ! 67 ! Nouveaux parametres nitergdiv,nitergrot,niterh,tetagdiv,tetagrot, 68 ! tetatemp ajoutes pour la dissipation . 69 ! 70 ! Autre parametre ajoute en fin de liste de tapedef : ** fxyhypb ** 71 ! 72 ! Si fxyhypb = .TRUE. , choix de la fonction a derivee tangente hyperb. 73 ! Sinon , choix de fxynew , a derivee sinusoidale .. 74 ! 75 ! ...... etatinit = . TRUE. si defrun est appele dans ETAT0_LMD ou 76 ! LIMIT_LMD pour l'initialisation de start.dat (dic) et 77 ! de limit.dat ( dic) ........... 78 ! Sinon etatinit = . FALSE . 79 ! 80 ! Donc etatinit = .F. si on veut comparer les valeurs de grossismx , 81 ! grossismy,clon,clat, fxyhypb lues sur le fichier start avec 82 ! celles passees par run.def , au debut du gcm, apres l'appel a 83 ! lectba . 84 ! Ces parmetres definissant entre autres la grille et doivent etre 85 ! pareils et coherents , sinon il y aura divergence du gcm . 86 ! 87 !----------------------------------------------------------------------- 88 ! initialisations: 89 ! ---------------- 90 90 91 91 !Config Key = lunout … … 290 290 CALL getin('dissip_period',dissip_period) 291 291 292 ccc .... P. Le Van , modif le 29/04/97 .pour la dissipation ...293 ccc292 !cc .... P. Le Van , modif le 29/04/97 .pour la dissipation ... 293 !cc 294 294 295 295 !Config Key = lstardis … … 456 456 CALL getin('ok_guide',ok_guide) 457 457 458 c...............................................................458 ! ............................................................... 459 459 460 460 !Config Key = read_start … … 632 632 CALL getin('ok_etat0',ok_etat0) 633 633 634 !Config Key = grilles_gcm_netcdf 635 !Config Desc = creation de fichier grilles_gcm.nc dans create_etat0_limit 636 !Config Def = n 637 grilles_gcm_netcdf = .FALSE. 638 CALL getin('grilles_gcm_netcdf',grilles_gcm_netcdf) 639 640 c---------------------------------------- 641 c Parameters for zonal averages in the case of Titan 634 !---------------------------------------- 635 ! Parameters for zonal averages in the case of Titan 642 636 moyzon_mu = .false. 643 637 moyzon_ch = .false. … … 646 640 CALL getin('moyzon_ch', moyzon_ch) 647 641 endif 648 c----------------------------------------649 650 c----------------------------------------651 ccc .... P. Le Van , ajout le 7/03/95 .pour le zoom ...652 c......... ( modif le 17/04/96 ) .........653 c 654 CZOOM PARAMETERS ... the ones read in start.nc prevail anyway ! (SL, 2012)655 c 656 c----------------------------------------642 !---------------------------------------- 643 644 !---------------------------------------- 645 !cc .... P. Le Van , ajout le 7/03/95 .pour le zoom ... 646 ! ......... ( modif le 17/04/96 ) ......... 647 ! 648 ! ZOOM PARAMETERS ... the ones read in start.nc prevail anyway ! (SL, 2012) 649 ! 650 !---------------------------------------- 657 651 IF( etatinit ) then 658 652 … … 707 701 708 702 write(lunout,*)'conf_gcm: alphax alphay ',alphax,alphay 709 c 710 calphax et alphay sont les anciennes formulat. des grossissements711 c 712 c 703 ! 704 ! alphax et alphay sont les anciennes formulat. des grossissements 705 ! 706 ! 713 707 714 708 !Config Key = fxyhypb … … 758 752 ysinus = .TRUE. 759 753 CALL getin('ysinus',ysinus) 760 c 761 c----------------------------------------754 ! 755 !---------------------------------------- 762 756 else ! etatinit=false 763 c----------------------------------------757 !---------------------------------------- 764 758 765 759 !Config Key = clon … … 779 773 CALL getin('clat',clatt) 780 774 781 c 782 c 775 ! 776 ! 783 777 IF( ABS(clat - clatt).GE. 0.001 ) THEN 784 778 write(lunout,*)'conf_gcm: La valeur de clat passee par run.def', … … 834 828 835 829 write(lunout,*)'conf_gcm: alphax alphay',alphax,alphay 836 c 837 calphax et alphay sont les anciennes formulat. des grossissements838 c 839 c 830 ! 831 ! alphax et alphay sont les anciennes formulat. des grossissements 832 ! 833 ! 840 834 841 835 !Config Key = fxyhypb … … 862 856 ENDIF 863 857 ENDIF 864 c 858 ! 865 859 !Config Key = dzoomx 866 860 !Config Desc = extension en longitude … … 925 919 ENDIF 926 920 927 cc921 !c 928 922 IF( .NOT.fxyhypb ) THEN 929 923 … … 955 949 956 950 endif ! etatinit 957 c----------------------------------------951 !---------------------------------------- 958 952 959 953 … … 1009 1003 write(lunout,*)' ok_limit = ', ok_limit 1010 1004 write(lunout,*)' ok_etat0 = ', ok_etat0 1011 write(lunout,*)' grilles_gcm_netcdf = ', grilles_gcm_netcdf1012 1005 if (planet_type=="titan") then 1013 1006 write(lunout,*)' moyzon_mu = ', moyzon_mu -
trunk/LMDZ.COMMON/libf/dyn3dpar/exner_hyb_p_m.F90
r1299 r1302 1 ! 2 ! $Id $ 3 ! 4 SUBROUTINE exner_hyb_p ( ngrid, ps, p,alpha,beta, pks, pk, pkf ) 5 c 6 c Auteurs : P.Le Van , Fr. Hourdin . 7 c .......... 8 c 9 c .... ngrid, ps,p sont des argum.d'entree au sous-prog ... 10 c .... alpha,beta, pks,pk,pkf sont des argum.de sortie au sous-prog ... 11 c 12 c ************************************************************************ 13 c Calcule la fonction d'Exner pk = Cp * p ** kappa , aux milieux des 14 c couches . Pk(l) sera calcule aux milieux des couches l ,entre les 15 c pressions p(l) et p(l+1) ,definis aux interfaces des llm couches . 16 c ************************************************************************ 17 c .. N.B : Au sommet de l'atmosphere, p(llm+1) = 0. , et ps et pks sont 18 c la pression et la fonction d'Exner au sol . 19 c 20 c -------- z 21 c A partir des relations ( 1 ) p*dz(pk) = kappa *pk*dz(p) et 22 c ( 2 ) pk(l) = alpha(l)+ beta(l)*pk(l-1) 23 c ( voir note de Fr.Hourdin ) , 24 c 25 c on determine successivement , du haut vers le bas des couches, les 26 c coef. alpha(llm),beta(llm) .,.,alpha(l),beta(l),,,alpha(2),beta(2), 27 c puis pk(ij,1). Ensuite ,on calcule,du bas vers le haut des couches, 28 c pk(ij,l) donne par la relation (2), pour l = 2 a l = llm . 29 c 30 c 31 USE parallel_lmdz 32 IMPLICIT NONE 33 c 34 #include "dimensions.h" 35 #include "paramet.h" 36 #include "comconst.h" 37 #include "comgeom.h" 38 #include "comvert.h" 39 #include "serre.h" 1 module exner_hyb_p_m 40 2 41 INTEGER ngrid 42 REAL p(ngrid,llmp1),pk(ngrid,llm),pkf(ngrid,llm) 43 REAL ps(ngrid),pks(ngrid), alpha(ngrid,llm),beta(ngrid,llm) 3 IMPLICIT NONE 44 4 45 c .... variables locales ...5 contains 46 6 47 INTEGER l, ij 48 REAL unpl2k,dellta 7 SUBROUTINE exner_hyb_p ( ngrid, ps, p, pks, pk, pkf ) 49 8 50 REAL ppn(iim),pps(iim) 51 REAL xpn, xps 52 REAL SSUM 53 EXTERNAL SSUM 54 INTEGER ije,ijb,jje,jjb 55 logical,save :: firstcall=.true. 56 !$OMP THREADPRIVATE(firstcall) 57 character(len=*),parameter :: modname="exner_hyb_p" 58 c 9 ! Auteurs : P.Le Van , Fr. Hourdin . 10 ! .......... 11 ! 12 ! .... ngrid, ps,p sont des argum.d'entree au sous-prog ... 13 ! .... pks,pk,pkf sont des argum.de sortie au sous-prog ... 14 ! 15 ! ************************************************************************ 16 ! Calcule la fonction d'Exner pk = Cp * (p/preff) ** kappa , aux milieux des 17 ! couches . Pk(l) sera calcule aux milieux des couches l ,entre les 18 ! pressions p(l) et p(l+1) ,definis aux interfaces des llm couches . 19 ! ************************************************************************ 20 ! .. N.B : Au sommet de l'atmosphere, p(llm+1) = 0. , et ps et pks sont 21 ! la pression et la fonction d'Exner au sol . 22 ! 23 ! -------- z 24 ! A partir des relations ( 1 ) p*dz(pk) = kappa *pk*dz(p) et 25 ! ( 2 ) pk(l) = alpha(l)+ beta(l)*pk(l-1) 26 ! ( voir note de Fr.Hourdin ) , 27 ! 28 ! on determine successivement , du haut vers le bas des couches, les 29 ! coef. alpha(llm),beta(llm) .,.,alpha(l),beta(l),,,alpha(2),beta(2), 30 ! puis pk(ij,1). Ensuite ,on calcule,du bas vers le haut des couches, 31 ! pk(ij,l) donne par la relation (2), pour l = 2 a l = llm . 32 ! 33 ! 34 USE parallel_lmdz 35 ! 36 include "dimensions.h" 37 include "paramet.h" 38 include "comconst.h" 39 include "comgeom.h" 40 include "comvert.h" 41 include "serre.h" 59 42 60 ! Sanity check 61 if (firstcall) then 62 ! sanity checks for Shallow Water case (1 vertical layer) 63 if (llm.eq.1) then 43 INTEGER ngrid 44 REAL p(ngrid,llmp1),pk(ngrid,llm) 45 REAL, optional:: pkf(ngrid,llm) 46 REAL ps(ngrid),pks(ngrid) 47 REAL alpha(ngrid,llm),beta(ngrid,llm) 48 49 ! .... variables locales ... 50 51 INTEGER l, ij 52 REAL unpl2k,dellta 53 54 INTEGER ije,ijb,jje,jjb 55 logical,save :: firstcall=.true. 56 !$OMP THREADPRIVATE(firstcall) 57 character(len=*),parameter :: modname="exner_hyb_p" 58 59 ! Sanity check 60 if (firstcall) then 61 ! sanity checks for Shallow Water case (1 vertical layer) 62 if (llm.eq.1) then 64 63 if (kappa.ne.1) then 65 call abort_gcm(modname,66 &"kappa!=1 , but running in Shallow Water mode!!",42)64 call abort_gcm(modname, & 65 "kappa!=1 , but running in Shallow Water mode!!",42) 67 66 endif 68 67 if (cpp.ne.r) then 69 call abort_gcm(modname,70 &"cpp!=r , but running in Shallow Water mode!!",42)68 call abort_gcm(modname, & 69 "cpp!=r , but running in Shallow Water mode!!",42) 71 70 endif 72 71 endif ! of if (llm.eq.1) 73 72 74 75 73 firstcall=.false. 74 endif ! of if (firstcall) 76 75 77 c$OMP BARRIER76 !$OMP BARRIER 78 77 79 ! Specific behaviour for Shallow Water (1 vertical layer) case 80 81 82 83 84 85 !$OMP DO SCHEDULE(STATIC)86 87 pks(ij) =(cpp/preff)*ps(ij)78 ! Specific behaviour for Shallow Water (1 vertical layer) case: 79 if (llm.eq.1) then 80 81 ! Compute pks(:),pk(:),pkf(:) 82 ijb=ij_begin 83 ije=ij_end 84 !$OMP DO SCHEDULE(STATIC) 85 DO ij=ijb, ije 86 pks(ij) = (cpp/preff) * ps(ij) 88 87 pk(ij,1) = .5*pks(ij) 89 pkf(ij,1)=pk(ij,1)90 91 !$OMP ENDDO88 if (present(pkf)) pkf(ij,1)=pk(ij,1) 89 ENDDO 90 !$OMP ENDDO 92 91 93 !$OMP MASTER 94 if (pole_nord) then 95 DO ij = 1, iim 96 ppn(ij) = aire( ij ) * pks( ij ) 97 ENDDO 98 xpn = SSUM(iim,ppn,1) /apoln 99 100 DO ij = 1, iip1 101 pks( ij ) = xpn 102 pk(ij,1) = .5*pks(ij) 103 pkf(ij,1)=pk(ij,1) 104 ENDDO 105 endif 106 107 if (pole_sud) then 108 DO ij = 1, iim 109 pps(ij) = aire(ij+ip1jm) * pks(ij+ip1jm ) 110 ENDDO 111 xps = SSUM(iim,pps,1) /apols 112 113 DO ij = 1, iip1 114 pks( ij+ip1jm ) = xps 115 pk(ij+ip1jm,1)=.5*pks(ij+ip1jm) 116 pkf(ij+ip1jm,1)=pk(ij+ip1jm,1) 117 ENDDO 118 endif 119 !$OMP END MASTER 120 !$OMP BARRIER 121 jjb=jj_begin 122 jje=jj_end 123 CALL filtreg_p ( pkf,jjb,jje, jmp1, llm, 2, 1, .TRUE., 1 ) 92 !$OMP BARRIER 93 if (present(pkf)) then 94 jjb=jj_begin 95 jje=jj_end 96 CALL filtreg_p ( pkf,jjb,jje, jmp1, llm, 2, 1, .TRUE., 1 ) 97 end if 124 98 125 126 127 99 ! our work is done, exit routine 100 return 101 endif ! of if (llm.eq.1) 128 102 129 !!!! General case:103 ! General case: 130 104 131 unpl2k = 1.+ 2.* kappa 132 c 133 ijb=ij_begin 134 ije=ij_end 105 unpl2k = 1.+ 2.* kappa 135 106 136 c$OMP DO SCHEDULE(STATIC) 137 DO ij = ijb, ije 138 pks(ij) = cpp * ( ps(ij)/preff ) ** kappa 139 ENDDO 140 c$OMP ENDDO 141 c Synchro OPENMP ici 107 ! ------------- 108 ! Calcul de pks 109 ! ------------- 142 110 143 c$OMP MASTER 144 if (pole_nord) then 145 DO ij = 1, iim 146 ppn(ij) = aire( ij ) * pks( ij ) 147 ENDDO 148 xpn = SSUM(iim,ppn,1) /apoln 149 150 DO ij = 1, iip1 151 pks( ij ) = xpn 152 ENDDO 153 endif 154 155 if (pole_sud) then 156 DO ij = 1, iim 157 pps(ij) = aire(ij+ip1jm) * pks(ij+ip1jm ) 158 ENDDO 159 xps = SSUM(iim,pps,1) /apols 160 161 DO ij = 1, iip1 162 pks( ij+ip1jm ) = xps 163 ENDDO 164 endif 165 c$OMP END MASTER 166 c$OMP BARRIER 167 c 168 c 169 c .... Calcul des coeff. alpha et beta pour la couche l = llm .. 170 c 171 c$OMP DO SCHEDULE(STATIC) 172 DO ij = ijb,ije 111 ijb=ij_begin 112 ije=ij_end 113 114 !$OMP DO SCHEDULE(STATIC) 115 DO ij = ijb, ije 116 pks(ij) = cpp * ( ps(ij)/preff ) ** kappa 117 ENDDO 118 !$OMP ENDDO 119 ! Synchro OPENMP ici 120 121 !$OMP BARRIER 122 ! 123 ! 124 ! .... Calcul des coeff. alpha et beta pour la couche l = llm .. 125 ! 126 !$OMP DO SCHEDULE(STATIC) 127 DO ij = ijb,ije 173 128 alpha(ij,llm) = 0. 174 129 beta (ij,llm) = 1./ unpl2k 175 ENDDO 176 c$OMP ENDDO NOWAIT 177 c 178 c ... Calcul des coeff. alpha et beta pour l = llm-1 a l = 2 ... 179 c 180 DO l = llm -1 , 2 , -1 181 c 182 c$OMP DO SCHEDULE(STATIC) 183 DO ij = ijb, ije 184 dellta = p(ij,l)* unpl2k + p(ij,l+1)* ( beta(ij,l+1)-unpl2k ) 185 alpha(ij,l) = - p(ij,l+1) / dellta * alpha(ij,l+1) 186 beta (ij,l) = p(ij,l ) / dellta 187 ENDDO 188 c$OMP ENDDO NOWAIT 189 c 190 ENDDO 130 ENDDO 131 !$OMP ENDDO NOWAIT 132 ! 133 ! ... Calcul des coeff. alpha et beta pour l = llm-1 a l = 2 ... 134 ! 135 DO l = llm -1 , 2 , -1 136 ! 137 !$OMP DO SCHEDULE(STATIC) 138 DO ij = ijb, ije 139 dellta = p(ij,l)* unpl2k + p(ij,l+1)* ( beta(ij,l+1)-unpl2k ) 140 alpha(ij,l) = - p(ij,l+1) / dellta * alpha(ij,l+1) 141 beta (ij,l) = p(ij,l ) / dellta 142 ENDDO 143 !$OMP ENDDO NOWAIT 144 ENDDO 191 145 192 c 193 c *********************************************************************** 194 c ..... Calcul de pk pour la couche 1 , pres du sol .... 195 c 196 c$OMP DO SCHEDULE(STATIC) 197 DO ij = ijb, ije 198 pk(ij,1) = ( p(ij,1)*pks(ij) - 0.5*alpha(ij,2)*p(ij,2) ) / 199 * ( p(ij,1)* (1.+kappa) + 0.5*( beta(ij,2)-unpl2k )* p(ij,2) ) 200 ENDDO 201 c$OMP ENDDO NOWAIT 202 c 203 c ..... Calcul de pk(ij,l) , pour l = 2 a l = llm ........ 204 c 205 DO l = 2, llm 206 c$OMP DO SCHEDULE(STATIC) 207 DO ij = ijb, ije 208 pk(ij,l) = alpha(ij,l) + beta(ij,l) * pk(ij,l-1) 209 ENDDO 210 c$OMP ENDDO NOWAIT 211 ENDDO 212 c 213 c 214 c CALL SCOPY ( ngrid * llm, pk, 1, pkf, 1 ) 215 DO l = 1, llm 216 c$OMP DO SCHEDULE(STATIC) 217 DO ij = ijb, ije 218 pkf(ij,l)=pk(ij,l) 219 ENDDO 220 c$OMP ENDDO NOWAIT 221 ENDDO 146 ! *********************************************************************** 147 ! ..... Calcul de pk pour la couche 1 , pres du sol .... 148 ! 149 !$OMP DO SCHEDULE(STATIC) 150 DO ij = ijb, ije 151 pk(ij,1) = ( p(ij,1)*pks(ij) - 0.5*alpha(ij,2)*p(ij,2) ) / & 152 ( p(ij,1)* (1.+kappa) + 0.5*( beta(ij,2)-unpl2k )* p(ij,2) ) 153 ENDDO 154 !$OMP ENDDO NOWAIT 155 ! 156 ! ..... Calcul de pk(ij,l) , pour l = 2 a l = llm ........ 157 ! 158 DO l = 2, llm 159 !$OMP DO SCHEDULE(STATIC) 160 DO ij = ijb, ije 161 pk(ij,l) = alpha(ij,l) + beta(ij,l) * pk(ij,l-1) 162 ENDDO 163 !$OMP ENDDO NOWAIT 164 ENDDO 222 165 223 c$OMP BARRIER 224 225 jjb=jj_begin 226 jje=jj_end 227 CALL filtreg_p ( pkf,jjb,jje, jmp1, llm, 2, 1, .TRUE., 1 ) 228 166 if (present(pkf)) then 167 ! calcul de pkf 229 168 230 RETURN 231 END 169 DO l = 1, llm 170 !$OMP DO SCHEDULE(STATIC) 171 DO ij = ijb, ije 172 pkf(ij,l)=pk(ij,l) 173 ENDDO 174 !$OMP ENDDO NOWAIT 175 ENDDO 176 177 !$OMP BARRIER 178 179 jjb=jj_begin 180 jje=jj_end 181 CALL filtreg_p ( pkf,jjb,jje, jmp1, llm, 2, 1, .TRUE., 1 ) 182 end if 183 184 END SUBROUTINE exner_hyb_p 185 186 end module exner_hyb_p_m 187 -
trunk/LMDZ.COMMON/libf/dyn3dpar/exner_milieu_p_m.F90
r1299 r1302 1 ! 2 ! $Id $ 3 ! 4 SUBROUTINE exner_milieu_p ( ngrid, ps, p,beta, pks, pk, pkf ) 5 c 6 c Auteurs : F. Forget , Y. Wanherdrick 7 c P.Le Van , Fr. Hourdin . 8 c .......... 9 c 10 c .... ngrid, ps,p sont des argum.d'entree au sous-prog ... 11 c .... beta, pks,pk,pkf sont des argum.de sortie au sous-prog ... 12 c 13 c ************************************************************************ 14 c Calcule la fonction d'Exner pk = Cp * (p/preff) ** kappa , aux milieux des 15 c couches . Pk(l) sera calcule aux milieux des couches l ,entre les 16 c pressions p(l) et p(l+1) ,definis aux interfaces des llm couches . 17 c ************************************************************************ 18 c .. N.B : Au sommet de l'atmosphere, p(llm+1) = 0. , et ps et pks sont 19 c la pression et la fonction d'Exner au sol . 20 c 21 c WARNING : CECI est une version speciale de exner_hyb originale 22 c Utilise dans la version martienne pour pouvoir 23 c tourner avec des coordonnees verticales complexe 24 c => Il ne verifie PAS la condition la proportionalite en 25 c energie totale/ interne / potentielle (F.Forget 2001) 26 c ( voir note de Fr.Hourdin ) , 27 c 28 USE parallel_lmdz 29 IMPLICIT NONE 30 c 31 #include "dimensions.h" 32 #include "paramet.h" 33 #include "comconst.h" 34 #include "comgeom.h" 35 #include "comvert.h" 36 #include "serre.h" 1 module exner_milieu_p_m 37 2 38 INTEGER ngrid 39 REAL p(ngrid,llmp1),pk(ngrid,llm),pkf(ngrid,llm) 40 REAL ps(ngrid),pks(ngrid), beta(ngrid,llm) 3 IMPLICIT NONE 41 4 42 c .... variables locales ...5 contains 43 6 44 INTEGER l, ij 45 REAL dum1 7 SUBROUTINE exner_milieu_p ( ngrid, ps, p, pks, pk, pkf ) 8 ! 9 ! Auteurs : F. Forget , Y. Wanherdrick 10 ! P.Le Van , Fr. Hourdin . 11 ! .......... 12 ! 13 ! .... ngrid, ps,p sont des argum.d'entree au sous-prog ... 14 ! .... pks,pk,pkf sont des argum.de sortie au sous-prog ... 15 ! 16 ! ************************************************************************ 17 ! Calcule la fonction d'Exner pk = Cp * (p/preff) ** kappa , aux milieux des 18 ! couches . Pk(l) sera calcule aux milieux des couches l ,entre les 19 ! pressions p(l) et p(l+1) ,definis aux interfaces des llm couches . 20 ! ************************************************************************ 21 ! .. N.B : Au sommet de l'atmosphere, p(llm+1) = 0. , et ps et pks sont 22 ! la pression et la fonction d'Exner au sol . 23 ! 24 ! WARNING : CECI est une version speciale de exner_hyb originale 25 ! Utilise dans la version martienne pour pouvoir 26 ! tourner avec des coordonnees verticales complexe 27 ! => Il ne verifie PAS la condition la proportionalite en 28 ! energie totale/ interne / potentielle (F.Forget 2001) 29 ! ( voir note de Fr.Hourdin ) , 30 ! 31 USE parallel_lmdz 32 ! 33 include "dimensions.h" 34 include "paramet.h" 35 include "comconst.h" 36 include "comgeom.h" 37 include "comvert.h" 38 include "serre.h" 46 39 47 REAL ppn(iim),pps(iim) 48 REAL xpn, xps 49 REAL SSUM 50 EXTERNAL SSUM 51 INTEGER ije,ijb,jje,jjb 52 logical,save :: firstcall=.true. 53 !$OMP THREADPRIVATE(firstcall) 54 character(len=*),parameter :: modname="exner_milieu_p" 40 INTEGER ngrid 41 REAL p(ngrid,llmp1),pk(ngrid,llm) 42 REAL, optional:: pkf(ngrid,llm) 43 REAL ps(ngrid),pks(ngrid) 55 44 56 ! Sanity check 57 if (firstcall) then 58 ! sanity checks for Shallow Water case (1 vertical layer) 59 if (llm.eq.1) then 45 ! .... variables locales ... 46 47 INTEGER l, ij,ijb,ije,jjb,jje 48 REAL dum1 49 50 logical,save :: firstcall=.true. 51 !$OMP THREADPRIVATE(firstcall) 52 character(len=*),parameter :: modname="exner_milieu_p" 53 54 ! Sanity check 55 if (firstcall) then 56 ! sanity checks for Shallow Water case (1 vertical layer) 57 if (llm.eq.1) then 60 58 if (kappa.ne.1) then 61 call abort_gcm(modname,62 &"kappa!=1 , but running in Shallow Water mode!!",42)59 call abort_gcm(modname, & 60 "kappa!=1 , but running in Shallow Water mode!!",42) 63 61 endif 64 62 if (cpp.ne.r) then 65 call abort_gcm(modname,66 &"cpp!=r , but running in Shallow Water mode!!",42)63 call abort_gcm(modname, & 64 "cpp!=r , but running in Shallow Water mode!!",42) 67 65 endif 68 66 endif ! of if (llm.eq.1) 69 67 70 firstcall=.false. 71 endif ! of if (firstcall) 72 73 c$OMP BARRIER 68 firstcall=.false. 69 endif ! of if (firstcall) 74 70 75 ! Specific behaviour for Shallow Water (1 vertical layer) case 76 if (llm.eq.1) then 77 78 ! Compute pks(:),pk(:),pkf(:) 79 ijb=ij_begin 80 ije=ij_end 81 !$OMP DO SCHEDULE(STATIC) 82 DO ij=ijb, ije 83 pks(ij)=(cpp/preff)*ps(ij) 71 !$OMP BARRIER 72 73 ! Specific behaviour for Shallow Water (1 vertical layer) case: 74 if (llm.eq.1) then 75 76 ! Compute pks(:),pk(:),pkf(:) 77 ijb=ij_begin 78 ije=ij_end 79 !$OMP DO SCHEDULE(STATIC) 80 DO ij=ijb, ije 81 pks(ij) = (cpp/preff) * ps(ij) 84 82 pk(ij,1) = .5*pks(ij) 85 pkf(ij,1)=pk(ij,1)86 87 !$OMP ENDDO83 if (present(pkf)) pkf(ij,1)=pk(ij,1) 84 ENDDO 85 !$OMP ENDDO 88 86 89 !$OMP MASTER 90 if (pole_nord) then 91 DO ij = 1, iim 92 ppn(ij) = aire( ij ) * pks( ij ) 93 ENDDO 94 xpn = SSUM(iim,ppn,1) /apoln 95 96 DO ij = 1, iip1 97 pks( ij ) = xpn 98 pk(ij,1) = .5*pks(ij) 99 pkf(ij,1)=pk(ij,1) 100 ENDDO 101 endif 102 103 if (pole_sud) then 104 DO ij = 1, iim 105 pps(ij) = aire(ij+ip1jm) * pks(ij+ip1jm ) 106 ENDDO 107 xps = SSUM(iim,pps,1) /apols 108 109 DO ij = 1, iip1 110 pks( ij+ip1jm ) = xps 111 pk(ij+ip1jm,1)=.5*pks(ij+ip1jm) 112 pkf(ij+ip1jm,1)=pk(ij+ip1jm,1) 113 ENDDO 114 endif 115 !$OMP END MASTER 116 !$OMP BARRIER 117 jjb=jj_begin 118 jje=jj_end 119 CALL filtreg_p ( pkf,jjb,jje, jmp1, llm, 2, 1, .TRUE., 1 ) 87 !$OMP BARRIER 88 if (present(pkf)) then 89 jjb=jj_begin 90 jje=jj_end 91 CALL filtreg_p ( pkf,jjb,jje, jmp1, llm, 2, 1, .TRUE., 1 ) 92 end if 120 93 121 122 123 94 ! our work is done, exit routine 95 return 96 endif ! of if (llm.eq.1) 124 97 125 !!!! General case:98 ! General case: 126 99 127 c ------------- 128 c Calcul de pks 129 c ------------- 130 131 ijb=ij_begin 132 ije=ij_end 100 ! ------------- 101 ! Calcul de pks 102 ! ------------- 133 103 134 c$OMP DO SCHEDULE(STATIC) 135 DO ij = ijb, ije 136 pks(ij) = cpp * ( ps(ij)/preff ) ** kappa 137 ENDDO 138 c$OMP ENDDO 139 c Synchro OPENMP ici 104 ijb=ij_begin 105 ije=ij_end 140 106 141 c$OMP MASTER 142 if (pole_nord) then 143 DO ij = 1, iim 144 ppn(ij) = aire( ij ) * pks( ij ) 145 ENDDO 146 xpn = SSUM(iim,ppn,1) /apoln 147 148 DO ij = 1, iip1 149 pks( ij ) = xpn 150 ENDDO 151 endif 152 153 if (pole_sud) then 154 DO ij = 1, iim 155 pps(ij) = aire(ij+ip1jm) * pks(ij+ip1jm ) 156 ENDDO 157 xps = SSUM(iim,pps,1) /apols 158 159 DO ij = 1, iip1 160 pks( ij+ip1jm ) = xps 161 ENDDO 162 endif 163 c$OMP END MASTER 164 c$OMP BARRIER 165 c 166 c 167 c .... Calcul de pk pour la couche l 168 c -------------------------------------------- 169 c 170 dum1 = cpp * (2*preff)**(-kappa) 171 DO l = 1, llm-1 172 c$OMP DO SCHEDULE(STATIC) 173 DO ij = ijb, ije 174 pk(ij,l) = dum1 * (p(ij,l) + p(ij,l+1))**kappa 175 ENDDO 176 c$OMP ENDDO NOWAIT 177 ENDDO 107 !$OMP DO SCHEDULE(STATIC) 108 DO ij = ijb, ije 109 pks(ij) = cpp * ( ps(ij)/preff ) ** kappa 110 ENDDO 111 !$OMP ENDDO 112 ! Synchro OPENMP ici 178 113 179 c .... Calcul de pk pour la couche l = llm .. 180 c (on met la meme distance (en log pression) entre Pk(llm) 181 c et Pk(llm -1) qu'entre Pk(llm-1) et Pk(llm-2) 114 !$OMP BARRIER 115 ! 116 ! 117 ! .... Calcul de pk pour la couche l 118 ! -------------------------------------------- 119 ! 120 dum1 = cpp * (2*preff)**(-kappa) 121 DO l = 1, llm-1 122 !$OMP DO SCHEDULE(STATIC) 123 DO ij = ijb, ije 124 pk(ij,l) = dum1 * (p(ij,l) + p(ij,l+1))**kappa 125 ENDDO 126 !$OMP ENDDO NOWAIT 127 ENDDO 182 128 183 c$OMP DO SCHEDULE(STATIC) 184 DO ij = ijb, ije 185 pk(ij,llm) = pk(ij,llm-1)**2 / pk(ij,llm-2) 186 ENDDO 187 c$OMP ENDDO NOWAIT 129 ! .... Calcul de pk pour la couche l = llm .. 130 ! (on met la meme distance (en log pression) entre Pk(llm) 131 ! et Pk(llm -1) qu'entre Pk(llm-1) et Pk(llm-2) 188 132 133 !$OMP DO SCHEDULE(STATIC) 134 DO ij = ijb, ije 135 pk(ij,llm) = pk(ij,llm-1)**2 / pk(ij,llm-2) 136 ENDDO 137 !$OMP ENDDO NOWAIT 189 138 190 c calcul de pkf 191 c ------------- 192 c CALL SCOPY ( ngrid * llm, pk, 1, pkf, 1 ) 193 DO l = 1, llm 194 c$OMP DO SCHEDULE(STATIC) 195 DO ij = ijb, ije 196 pkf(ij,l)=pk(ij,l) 197 ENDDO 198 c$OMP ENDDO NOWAIT 199 ENDDO 139 if (present(pkf)) then 140 ! calcul de pkf 200 141 201 c$OMP BARRIER 202 203 jjb=jj_begin 204 jje=jj_end 205 CALL filtreg_p ( pkf,jjb,jje, jmp1, llm, 2, 1, .TRUE., 1 ) 206 207 c EST-CE UTILE ?? : calcul de beta 208 c -------------------------------- 209 DO l = 2, llm 210 c$OMP DO SCHEDULE(STATIC) 211 DO ij = ijb, ije 212 beta(ij,l) = pk(ij,l) / pk(ij,l-1) 213 ENDDO 214 c$OMP ENDDO NOWAIT 215 ENDDO 142 DO l = 1, llm 143 !$OMP DO SCHEDULE(STATIC) 144 DO ij = ijb, ije 145 pkf(ij,l)=pk(ij,l) 146 ENDDO 147 !$OMP ENDDO NOWAIT 148 ENDDO 216 149 217 RETURN 218 END 150 !$OMP BARRIER 151 152 jjb=jj_begin 153 jje=jj_end 154 CALL filtreg_p ( pkf,jjb,jje, jmp1, llm, 2, 1, .TRUE., 1 ) 155 end if 156 157 END SUBROUTINE exner_milieu_p 158 159 end module exner_milieu_p_m 160 -
trunk/LMDZ.COMMON/libf/dyn3dpar/gcm.F
r1300 r1302 516 516 517 517 518 day_end = day_ini + nday 518 if (nday>=0) then ! standard case 519 day_end=day_ini+nday 520 else ! special case when nday <0, run -nday dynamical steps 521 day_end=day_ini-nday/day_step 522 endif 519 523 if (less1day) then 520 524 day_end=day_ini+floor(time_0+fractday) -
trunk/LMDZ.COMMON/libf/dyn3dpar/guide_p_mod.F90
r1300 r1302 328 328 !======================================================================= 329 329 SUBROUTINE guide_main(itau,ucov,vcov,teta,q,masse,ps) 330 use exner_hyb_p_m, only: exner_hyb_p 331 use exner_milieu_p_m, only: exner_milieu_p 330 332 USE parallel_lmdz 331 333 USE control_mod … … 349 351 REAL, DIMENSION (ip1jmp1,llm) :: f_add ! var aux: champ de guidage 350 352 ! Variables pour fonction Exner (P milieu couche) 351 REAL, DIMENSION (iip1,jjp1,llm) :: pk, pkf 352 REAL, DIMENSION (iip1,jjp1,llm) :: alpha, beta 353 REAL, DIMENSION (iip1,jjp1,llm) :: pk 353 354 REAL, DIMENSION (iip1,jjp1) :: pks 354 355 REAL :: unskap … … 491 492 IF (f_out) THEN 492 493 ! Calcul niveaux pression milieu de couches 493 494 495 CALL exner_hyb_p(ip1jmp1,ps,p, alpha,beta,pks,pk,pkf)496 497 CALL exner_milieu_p(ip1jmp1,ps,p, beta,pks,pk,pkf)494 CALL pression_p( ip1jmp1, ap, bp, ps, p ) 495 if (pressure_exner) then 496 CALL exner_hyb_p(ip1jmp1,ps,p,pks,pk) 497 else 498 CALL exner_milieu_p(ip1jmp1,ps,p,pks,pk) 498 499 endif 499 500 unskap=1./kappa 500 501 502 503 504 505 506 507 CALL guide_out(" P",jjp1,llm,p(1:ip1jmp1,1:llm),1.)501 DO l = 1, llm 502 DO j=jjb_u,jje_u 503 DO i =1, iip1 504 p(i+(j-1)*iip1,l) = preff * ( pk(i,j,l)/cpp) ** unskap 505 ENDDO 506 ENDDO 507 ENDDO 508 CALL guide_out("SP",jjp1,llm,p(1:ip1jmp1,1:llm),1.) 508 509 ENDIF 509 510 … … 517 518 if (guide_zon) CALL guide_zonave(1,jjp1,llm,f_add) 518 519 CALL guide_addfield(ip1jmp1,llm,f_add,alpha_u) 519 IF (f_out) CALL guide_out("U",jjp1,llm,f_add(:,:),factt) 520 IF (f_out) CALL guide_out("u",jjp1,llm,ucov,factt) 521 IF (f_out) CALL guide_out("ua",jjp1,llm,(1.-tau)*ugui1(:,:)+tau*ugui2(:,:),factt) 522 IF (f_out) CALL guide_out("ucov",jjp1,llm,f_add(:,:)/factt,factt) 520 523 ucov(ijb_u:ije_u,:)=ucov(ijb_u:ije_u,:)+f_add(ijb_u:ije_u,:) 521 524 endif … … 529 532 if (guide_zon) CALL guide_zonave(2,jjp1,llm,f_add) 530 533 CALL guide_addfield(ip1jmp1,llm,f_add,alpha_T) 531 IF (f_out) CALL guide_out(" T",jjp1,llm,f_add(:,:),factt)534 IF (f_out) CALL guide_out("teta",jjp1,llm,f_add(:,:)/factt,factt) 532 535 teta(ijb_u:ije_u,:)=teta(ijb_u:ije_u,:)+f_add(ijb_u:ije_u,:) 533 536 endif … … 541 544 if (guide_zon) CALL guide_zonave(2,jjp1,1,f_add(1:ip1jmp1,1)) 542 545 CALL guide_addfield(ip1jmp1,1,f_add(1:ip1jmp1,1),alpha_P) 543 IF (f_out) CALL guide_out(" SP",jjp1,1,f_add(1:ip1jmp1,1),factt)546 IF (f_out) CALL guide_out("ps",jjp1,1,f_add(1:ip1jmp1,1)/factt,factt) 544 547 ps(ijb_u:ije_u)=ps(ijb_u:ije_u)+f_add(ijb_u:ije_u,1) 545 548 CALL pression_p(ip1jmp1,ap,bp,ps,p) … … 555 558 if (guide_zon) CALL guide_zonave(2,jjp1,llm,f_add) 556 559 CALL guide_addfield(ip1jmp1,llm,f_add,alpha_Q) 557 IF (f_out) CALL guide_out(" Q",jjp1,llm,f_add(:,:),factt)560 IF (f_out) CALL guide_out("q",jjp1,llm,f_add(:,:)/factt,factt) 558 561 q(ijb_u:ije_u,:)=q(ijb_u:ije_u,:)+f_add(ijb_u:ije_u,:) 559 562 endif … … 568 571 if (guide_zon) CALL guide_zonave(2,jjm,llm,f_add(1:ip1jm,:)) 569 572 CALL guide_addfield(ip1jm,llm,f_add(1:ip1jm,:),alpha_v) 570 IF (f_out) CALL guide_out("V",jjm,llm,f_add(1:ip1jm,:),factt) 573 IF (f_out) CALL guide_out("v",jjm,llm,vcov(1:ip1jm,:),factt) 574 IF (f_out) CALL guide_out("va",jjm,llm,(1.-tau)*vgui1(:,:)+tau*vgui2(:,:),factt) 575 IF (f_out) CALL guide_out("vcov",jjm,llm,f_add(1:ip1jm,:)/factt,factt) 571 576 vcov(ijb_v:ije_v,:)=vcov(ijb_v:ije_v,:)+f_add(ijb_v:ije_v,:) 572 577 endif … … 689 694 !======================================================================= 690 695 SUBROUTINE guide_interp(psi,teta) 696 use exner_hyb_p_m, only: exner_hyb_p 697 use exner_milieu_p_m, only: exner_milieu_p 691 698 USE parallel_lmdz 692 699 USE mod_hallo … … 713 720 REAL, DIMENSION (iip1,jjm,llm) :: pbary 714 721 ! Variables pour fonction Exner (P milieu couche) 715 REAL, DIMENSION (iip1,jjp1,llm) :: pk, pkf 716 REAL, DIMENSION (iip1,jjp1,llm) :: alpha, beta 722 REAL, DIMENSION (iip1,jjp1,llm) :: pk 717 723 REAL, DIMENSION (iip1,jjp1) :: pks 718 724 REAL :: unskap … … 784 790 IF (guide_plevs.EQ.1) THEN 785 791 DO l=1,llm 786 787 792 DO j=jjb_u,jje_u 793 DO i =1, iip1 788 794 pls(i,j,l)=(ap(l)+ap(l+1))/2.+psi(i,j)*(bp(l)+bp(l+1))/2. 789 790 795 ENDDO 796 ENDDO 791 797 ENDDO 792 798 ELSE 793 794 795 CALL exner_hyb_p(ip1jmp1,psi,p, alpha,beta,pks,pk,pkf)799 CALL pression_p( ip1jmp1, ap, bp, psi, p ) 800 if (pressure_exner) then 801 CALL exner_hyb_p(ip1jmp1,psi,p,pks,pk) 796 802 else 797 CALL exner_milieu_p(ip1jmp1,psi,p, beta,pks,pk,pkf)803 CALL exner_milieu_p(ip1jmp1,psi,p,pks,pk) 798 804 endif 799 800 801 802 803 804 805 806 805 unskap=1./kappa 806 DO l = 1, llm 807 DO j=jjb_u,jje_u 808 DO i =1, iip1 809 pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap 810 ENDDO 811 ENDDO 812 ENDDO 807 813 ENDIF 808 814 … … 1024 1030 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 1025 1031 IF (guide_plevs.EQ.1) THEN 1026 1027 1028 1029 1030 1031 1032 CALL Register_SwapFieldHallo(psnat1,psnat1,ip1jmp1,1,jj_Nb_caldyn,1,2,Req) 1033 CALL SendRequest(Req) 1034 CALL WaitRequest(Req) 1035 CALL Register_SwapFieldHallo(psnat2,psnat2,ip1jmp1,1,jj_Nb_caldyn,1,2,Req) 1036 CALL SendRequest(Req) 1037 CALL WaitRequest(Req) 1032 1038 DO l=1,nlevnc 1033 1039 DO j=jjb_v,jje_v … … 1041 1047 ENDDO 1042 1048 ELSE IF (guide_plevs.EQ.2) THEN 1043 1044 1045 1046 1047 1048 1049 CALL Register_SwapFieldHallo(pnat1,pnat1,ip1jmp1,llm,jj_Nb_caldyn,1,2,Req) 1050 CALL SendRequest(Req) 1051 CALL WaitRequest(Req) 1052 CALL Register_SwapFieldHallo(pnat2,pnat2,ip1jmp1,llm,jj_Nb_caldyn,1,2,Req) 1053 CALL SendRequest(Req) 1054 CALL WaitRequest(Req) 1049 1055 DO l=1,nlevnc 1050 1056 DO j=jjb_v,jje_v … … 1807 1813 1808 1814 ! Variables entree 1809 CHARACTER , INTENT(IN) :: varname1815 CHARACTER*(*), INTENT(IN) :: varname 1810 1816 INTEGER, INTENT (IN) :: hsize,vsize 1811 1817 REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field … … 1817 1823 INTEGER :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev 1818 1824 INTEGER :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev 1825 INTEGER :: vid_au,vid_av 1826 INTEGER :: l 1819 1827 INTEGER, DIMENSION (3) :: dim3 1820 1828 INTEGER, DIMENSION (4) :: dim4,count,start 1821 1829 INTEGER :: ierr, varid 1830 REAL, DIMENSION (iip1,hsize,vsize) :: field2 1822 1831 1823 1832 CALL gather_field(field,iip1*hsize,vsize,0) … … 1834 1843 ! Definition des dimensions 1835 1844 ierr=NF_DEF_DIM(nid,"LONU",iip1,id_lonu) 1845 print*,'id_lonu 1 ',id_lonu 1836 1846 ierr=NF_DEF_DIM(nid,"LONV",iip1,id_lonv) 1837 1847 ierr=NF_DEF_DIM(nid,"LATU",jjp1,id_latu) … … 1842 1852 ! Creation des variables dimensions 1843 1853 ierr=NF_DEF_VAR(nid,"LONU",NF_FLOAT,1,id_lonu,vid_lonu) 1854 print*,'id_lonu 2 ',id_lonu 1844 1855 ierr=NF_DEF_VAR(nid,"LONV",NF_FLOAT,1,id_lonv,vid_lonv) 1845 1856 ierr=NF_DEF_VAR(nid,"LATU",NF_FLOAT,1,id_latu,vid_latu) … … 1848 1859 ierr=NF_DEF_VAR(nid,"cu",NF_FLOAT,2,(/id_lonu,id_latu/),vid_cu) 1849 1860 ierr=NF_DEF_VAR(nid,"cv",NF_FLOAT,2,(/id_lonv,id_latv/),vid_cv) 1861 ierr=NF_DEF_VAR(nid,"au",NF_FLOAT,2,(/id_lonu,id_latu/),vid_au) 1862 ierr=NF_DEF_VAR(nid,"av",NF_FLOAT,2,(/id_lonv,id_latv/),vid_av) 1850 1863 1851 1864 ierr=NF_ENDDEF(nid) … … 1853 1866 ! Enregistrement des variables dimensions 1854 1867 #ifdef NC_DOUBLE 1868 print*,'id_lonu DOUBLE ',id_lonu,rlonu*180./pi 1855 1869 ierr = NF_PUT_VAR_DOUBLE(nid,vid_lonu,rlonu*180./pi) 1856 1870 ierr = NF_PUT_VAR_DOUBLE(nid,vid_lonv,rlonv*180./pi) … … 1860 1874 ierr = NF_PUT_VAR_DOUBLE(nid,vid_cu,cu) 1861 1875 ierr = NF_PUT_VAR_DOUBLE(nid,vid_cv,cv) 1876 ierr = NF_PUT_VAR_DOUBLE(nid,vid_au,alpha_u) 1877 ierr = NF_PUT_VAR_DOUBLE(nid,vid_av,alpha_v) 1862 1878 #else 1879 print*,'id_lonu 3 ',id_lonu,rlonu*180./pi 1863 1880 ierr = NF_PUT_VAR_REAL(nid,vid_lonu,rlonu*180./pi) 1864 1881 ierr = NF_PUT_VAR_REAL(nid,vid_lonv,rlonv*180./pi) … … 1868 1885 ierr = NF_PUT_VAR_REAL(nid,vid_cu,cu) 1869 1886 ierr = NF_PUT_VAR_REAL(nid,vid_cv,cv) 1887 ierr = NF_PUT_VAR_REAL(nid,vid_au,alpha_u) 1888 ierr = NF_PUT_VAR_REAL(nid,vid_av,alpha_v) 1870 1889 #endif 1871 1890 ! -------------------------------------------------------------------- … … 1875 1894 ! Pressure (GCM) 1876 1895 dim4=(/id_lonv,id_latu,id_lev,id_tim/) 1877 ierr = NF_DEF_VAR(nid," P",NF_FLOAT,4,dim4,varid)1896 ierr = NF_DEF_VAR(nid,"SP",NF_FLOAT,4,dim4,varid) 1878 1897 ! Surface pressure (guidage) 1879 1898 IF (guide_P) THEN … … 1883 1902 ! Zonal wind 1884 1903 IF (guide_u) THEN 1904 print*,'id_lonu 4 ',id_lonu,varname 1885 1905 dim4=(/id_lonu,id_latu,id_lev,id_tim/) 1906 ierr = NF_DEF_VAR(nid,"u",NF_FLOAT,4,dim4,varid) 1907 ierr = NF_DEF_VAR(nid,"ua",NF_FLOAT,4,dim4,varid) 1886 1908 ierr = NF_DEF_VAR(nid,"ucov",NF_FLOAT,4,dim4,varid) 1887 1909 ENDIF … … 1889 1911 IF (guide_v) THEN 1890 1912 dim4=(/id_lonv,id_latv,id_lev,id_tim/) 1913 ierr = NF_DEF_VAR(nid,"v",NF_FLOAT,4,dim4,varid) 1914 ierr = NF_DEF_VAR(nid,"va",NF_FLOAT,4,dim4,varid) 1891 1915 ierr = NF_DEF_VAR(nid,"vcov",NF_FLOAT,4,dim4,varid) 1892 1916 ENDIF … … 1912 1936 ierr=NF_OPEN("guide_ins.nc",NF_WRITE,nid) 1913 1937 1938 IF (varname=="SP") timestep=timestep+1 1939 1940 IF (varname=="SP") THEN 1941 print*,'varname=SP=',varname 1942 ELSE 1943 print*,'varname diff SP=',varname 1944 ENDIF 1945 1946 1947 ierr = NF_INQ_VARID(nid,varname,varid) 1914 1948 SELECT CASE (varname) 1915 CASE ("P") 1916 timestep=timestep+1 1917 ierr = NF_INQ_VARID(nid,"P",varid) 1949 CASE ("SP","ps") 1918 1950 start=(/1,1,1,timestep/) 1919 1951 count=(/iip1,jjp1,llm,1/) 1920 #ifdef NC_DOUBLE 1921 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field) 1922 #else 1923 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field) 1924 #endif 1925 CASE ("SP") 1926 ierr = NF_INQ_VARID(nid,"ps",varid) 1927 start=(/1,1,timestep,0/) 1928 count=(/iip1,jjp1,1,0/) 1929 #ifdef NC_DOUBLE 1930 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt) 1931 #else 1932 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt) 1933 #endif 1934 CASE ("U") 1935 ierr = NF_INQ_VARID(nid,"ucov",varid) 1952 CASE ("v","va","vcov") 1953 start=(/1,1,1,timestep/) 1954 count=(/iip1,jjm,llm,1/) 1955 CASE DEFAULT 1936 1956 start=(/1,1,1,timestep/) 1937 1957 count=(/iip1,jjp1,llm,1/) 1958 END SELECT 1959 1960 SELECT CASE (varname) 1961 CASE("u","ua") 1962 DO l=1,llm ; field2(:,2:jjm,l)=field(:,2:jjm,l)/cu(:,2:jjm) ; ENDDO 1963 field2(:,1,:)=0. ; field2(:,jjp1,:)=0. 1964 CASE("v","va") 1965 DO l=1,llm ; field2(:,:,l)=field(:,:,l)/cv(:,:) ; ENDDO 1966 CASE DEFAULT 1967 field2=field 1968 END SELECT 1969 1938 1970 #ifdef NC_DOUBLE 1939 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt)1971 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field2) 1940 1972 #else 1941 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt)1973 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field2) 1942 1974 #endif 1943 CASE ("V")1944 ierr = NF_INQ_VARID(nid,"vcov",varid)1945 start=(/1,1,1,timestep/)1946 count=(/iip1,jjm,llm,1/)1947 #ifdef NC_DOUBLE1948 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt)1949 #else1950 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt)1951 #endif1952 CASE ("T")1953 ierr = NF_INQ_VARID(nid,"teta",varid)1954 start=(/1,1,1,timestep/)1955 count=(/iip1,jjp1,llm,1/)1956 #ifdef NC_DOUBLE1957 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt)1958 #else1959 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt)1960 #endif1961 CASE ("Q")1962 ierr = NF_INQ_VARID(nid,"q",varid)1963 start=(/1,1,1,timestep/)1964 count=(/iip1,jjp1,llm,1/)1965 #ifdef NC_DOUBLE1966 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt)1967 #else1968 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt)1969 #endif1970 END SELECT1971 1975 1972 1976 ierr = NF_CLOSE(nid) -
trunk/LMDZ.COMMON/libf/dyn3dpar/leapfrog_p.F
r1300 r1302 8 8 & time_0) 9 9 10 use exner_hyb_m, only: exner_hyb 11 use exner_milieu_m, only: exner_milieu 12 use exner_hyb_p_m, only: exner_hyb_p 13 use exner_milieu_p_m, only: exner_milieu_p 10 14 USE misc_mod 11 15 USE parallel_lmdz … … 17 21 USE vampir 18 22 USE timer_filtre, ONLY : print_filtre_timer 19 USE infotrac 23 USE infotrac, ONLY: nqtot 20 24 USE guide_p_mod, ONLY : guide_main 21 25 USE getparam … … 165 169 character*10 string10 166 170 167 REAL,SAVE :: alpha(ip1jmp1,llm),beta(ip1jmp1,llm)168 171 REAL,SAVE :: flxw(ip1jmp1,llm) ! flux de masse verticale 169 172 … … 236 239 lafin=.false. 237 240 238 itaufin = nday*day_step 241 if (nday>=0) then 242 itaufin = nday*day_step 243 else 244 ! to run a given (-nday) number of dynamical steps 245 itaufin = -nday 246 endif 239 247 if (less1day) then 240 248 c MODIF VENUS: to run less than one day: … … 292 300 CALL pression ( ip1jmp1, ap, bp, ps, p ) 293 301 if (pressure_exner) then 294 CALL exner_hyb( ip1jmp1, ps, p, alpha,beta,pks, pk, pkf )302 CALL exner_hyb( ip1jmp1, ps, p, pks, pk, pkf ) 295 303 else 296 CALL exner_milieu( ip1jmp1, ps, p, beta,pks, pk, pkf )304 CALL exner_milieu( ip1jmp1, ps, p, pks, pk, pkf ) 297 305 endif 298 306 c$OMP END MASTER … … 830 838 c$OMP BARRIER 831 839 if (pressure_exner) then 832 CALL exner_hyb_p( ip1jmp1, ps, p, alpha,beta,pks, pk, pkf )840 CALL exner_hyb_p( ip1jmp1, ps, p,pks, pk, pkf ) 833 841 else 834 CALL exner_milieu_p( ip1jmp1, ps, p, beta,pks, pk, pkf )842 CALL exner_milieu_p( ip1jmp1, ps, p, pks, pk, pkf ) 835 843 endif 844 ! Compute geopotential (physics might need it) 845 CALL geopot ( ip1jmp1, teta , pk , pks, phis , phi ) 836 846 c$OMP BARRIER 837 847 jD_cur = jD_ref + day_ini - day_ref … … 1040 1050 c$OMP BARRIER 1041 1051 if (pressure_exner) then 1042 CALL exner_hyb_p(ip1jmp1,ps,p, alpha,beta,pks,pk,pkf)1052 CALL exner_hyb_p(ip1jmp1,ps,p,pks,pk,pkf) 1043 1053 else 1044 CALL exner_milieu_p(ip1jmp1,ps,p, beta,pks,pk,pkf)1054 CALL exner_milieu_p(ip1jmp1,ps,p,pks,pk,pkf) 1045 1055 endif 1046 1056 c$OMP BARRIER … … 1202 1212 c$OMP BARRIER 1203 1213 if (pressure_exner) then 1204 CALL exner_hyb_p( ip1jmp1, ps, p, alpha,beta,pks, pk, pkf )1214 CALL exner_hyb_p( ip1jmp1, ps, p, pks, pk, pkf ) 1205 1215 else 1206 CALL exner_milieu_p( ip1jmp1, ps, p, beta,pks, pk, pkf )1216 CALL exner_milieu_p( ip1jmp1, ps, p, pks, pk, pkf ) 1207 1217 endif 1208 1218 c$OMP BARRIER -
trunk/LMDZ.COMMON/libf/dyn3dpar/logic.h
r1056 r1302 11 11 & statcl,conser,apdiss,apdelq,saison,ecripar,fxyhypb,ysinus & 12 12 & ,read_start,ok_guide,ok_strato,tidal,ok_gradsfile & 13 & ,ok_limit,ok_etat0, grilles_gcm_netcdf,hybrid&13 & ,ok_limit,ok_etat0,hybrid & 14 14 & ,moyzon_mu,moyzon_ch 15 15 … … 19 19 & apdiss,apdelq,saison,ecripar,fxyhypb,ysinus & 20 20 & ,read_start,ok_guide,ok_strato,tidal,ok_gradsfile & 21 & ,ok_limit,ok_etat0 ,grilles_gcm_netcdf21 & ,ok_limit,ok_etat0 22 22 logical hybrid ! vertical coordinate is hybrid if true (sigma otherwise) 23 23 ! (only used if disvert_type==2) -
trunk/LMDZ.COMMON/libf/dyn3dpar/mod_const_mpi.F90
r1300 r1302 1 1 ! 2 ! $Id: mod_const_mpi.F90 1700 2012-12-20 14:43:19Z lguez$2 ! $Id: mod_const_mpi.F90 2055 2014-06-04 12:33:27Z acaubel $ 3 3 ! 4 4 MODULE mod_const_mpi … … 17 17 USE ioipsl_getincom, only: getin 18 18 #endif 19 19 ! Use of Oasis-MCT coupler 20 #ifdef CPP_OMCT 21 USE mod_prism 22 #endif 23 #ifdef CPP_XIOS 24 USE wxios, only: wxios_init 25 #endif 20 26 IMPLICIT NONE 21 27 #ifdef CPP_MPI … … 38 44 #ifdef CPP_COUPLE 39 45 !$OMP MASTER 40 CALL prism_init_comp_proto (comp_id, 'lmdz.x', ierr) 46 #ifdef CPP_XIOS 47 CALL wxios_init("LMDZ", outcom=COMM_LMDZ, type_ocean=type_ocean) 48 #else 49 CALL prism_init_comp_proto (comp_id, 'LMDZ', ierr) 41 50 CALL prism_get_localcomm_proto(COMM_LMDZ,ierr) 51 #endif 42 52 !$OMP END MASTER 43 53 #endif -
trunk/LMDZ.COMMON/libf/dyn3dpar/parallel_lmdz.F90
r1300 r1302 225 225 #endif 226 226 #ifdef CPP_COUPLE 227 ! Use of Oasis-MCT coupler 228 #if defined CPP_OMCT 229 use mod_prism 230 #else 227 231 use mod_prism_proto 228 232 #endif 229 #ifdef CPP_EARTH230 233 ! Ehouarn: surface_data module is in 'phylmd' ... 231 234 use surface_data, only : type_ocean … … 252 255 253 256 if (type_ocean == 'couple') then 257 #ifdef CPP_XIOS 258 !Fermeture propre de XIOS 259 CALL wxios_close() 260 #else 254 261 #ifdef CPP_COUPLE 255 262 call prism_terminate_proto(ierr) … … 258 265 endif 259 266 #endif 267 #endif 260 268 else 261 269 #ifdef CPP_XIOS
Note: See TracChangeset
for help on using the changeset viewer.